Skip to content

Kapitel 19: MySQL Interviewfragen ⭐⭐

In diesem Kapitel lernst du die häufigsten Interviewfragen zu MySQL!

19.1 Grundlegende Konzeptfragen

Frage 1: Was ist MySQL?

Antwort (eigenen Worte):

MySQL ist ein Open-Source-Relationship-Datenbankmanagementsystem (RDBMS). Es wird verwendet, um Daten in Tabellen zu speichern, zu verwalten und abzufragen. MySQL ist besonders beliebt für Webentwicklung, da es gut mit PHP, Java, Python usw. zusammenarbeitet.

Frage 2: Was sind die Kernvorteile von MySQL?

Antwort:

  1. Open Source & Kostenlos
  2. Plattformübergreifend (Windows, Linux, Mac)
  3. Hohe Leistung (auch bei großen Datenmengen)
  4. Sicher (Zugriffskontrolle, Verschlüsselung)
  5. Einfach zu lernen (intuitive SQL-Syntax)

Frage 3: Welche Datentypen haben Sie verwendet?

Antwort:

  • Ganzzahlen: INT (4 Byte), BIGINT (8 Byte)
  • Dezimalzahlen: DECIMAL(m,d) (für Geldbeträge!), FLOAT, DOUBLE
  • Zeichenkette: VARCHAR(n) (variabel), CHAR(n) (fest)
  • Datum/Zeit: DATE, DATETIME, TIMESTAMP
  • Text: TEXT (für lange Texte)
  • Boolean: BOOLEAN / TINYINT(1)

⚠️ Wichtig: Für Geldbeträge niemals FLOAT/DOUBLE verwenden (Rundungsfehler!) → DECIMAL verwenden!

Frage 4: Was sind Constraints? Nennen Sie Beispiele!

Antwort: Constraints stellen sicher, dass die Daten konsistent und gültig sind.

ConstraintBedeutungBeispiel
PRIMARY KEYEindeutige ID (nicht NULL)id INT PRIMARY KEY
FOREIGN KEYFremdschlüssel (Verknüpfung)FOREIGN KEY (user_id) REFERENCES users(id)
NOT NULLFeld darf nicht leer seinemail VARCHAR(100) NOT NULL
UNIQUEWert darf nicht doppelt seinemail VARCHAR(100) UNIQUE
DEFAULTStandardwerterstellt_am DATETIME DEFAULT CURRENT_TIMESTAMP
CHECKBedingung prüfen (MySQL 8.0+)alter INT CHECK (alter >= 0)

19.2 Kern-SQL-Syntaxfragen

Frage 5: Erklären Sie den Unterschied zwischen WHERE und HAVING!

Antwort:

  • WHERE filtert vor der Gruppierung (GROUP BY)
  • HAVING filtert nach der Gruppierung
sql
-- ✅ Richtig: WHERE für Einzelzeilen
SELECT * FROM users WHERE alter > 18;

-- ✅ Richtig: HAVING für Gruppen
SELECT stadt, COUNT(*) AS anzahl
FROM users
GROUP BY stadt
HAVING anzahl > 5;

⚠️ Häufiger Fehler: HAVING ohne GROUP BY verwenden!

Frage 6: Was ist der Unterschied zwischen INNER JOIN und LEFT JOIN?

Antwort:

  • INNER JOIN: Nur übereinstimmende Datensätze aus beiden Tabellen
  • LEFT JOIN: Alle Datensätze der linken Tabelle + passende der rechten (NULL falls keine Passung)
sql
-- INNER JOIN: Zeigt nur Benutzer MIT Bestellungen
SELECT u.username, o.bestell_id
FROM users u
INNER JOIN orders o ON u.id = o.user_id;

-- LEFT JOIN: Zeigt ALLE Benutzer (auch ohne Bestellungen)
SELECT u.username, o.bestell_id
FROM users u
LEFT JOIN orders o ON u.id = o.user_id;

Frage 7: Was ist eine Unterabfrage (Subquery)?

Antwort: Eine Abfrage innerhalb einer anderen Abfrage.

sql
-- Unterabfrage: Finde Benutzer mit überdurchschnittlichem Umsatz
SELECT username, (SELECT AVG(umsatz) FROM users) AS durchschnitt
FROM users
WHERE umsatz > (SELECT AVG(umsatz) FROM users);

19.3 Praxisszenario-Fragen

Frage 8: Wie entwerfen Sie eine Datenbank für ein Blog?

Antwort (Schritt-für-Schritt):

  1. Anforderungsanalyse: Benutzer, Artikel, Kommentare, Kategorien
  2. ER-Diagramm zeichnen:
    • users (1:n) posts
    • posts (1:n) comments
    • posts (n:1) categories
  3. Tabellen erstellen:
sql
CREATE TABLE users (
    id INT PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(50) UNIQUE NOT NULL,
    email VARCHAR(100) UNIQUE NOT NULL,
    passwort_hash VARCHAR(255) NOT NULL
);

CREATE TABLE posts (
    id INT PRIMARY KEY AUTO_INCREMENT,
    user_id INT NOT NULL,
    kategorie_id INT NOT NULL,
    titel VARCHAR(200) NOT NULL,
    inhalt TEXT NOT NULL,
    erstellt_am DATETIME DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (user_id) REFERENCES users(id),
    FOREIGN KEY (kategorie_id) REFERENCES categories(id)
);

CREATE TABLE comments (
    id INT PRIMARY KEY AUTO_INCREMENT,
    post_id INT NOT NULL,
    user_id INT NOT NULL,
    inhalt TEXT NOT NULL,
    erstellt_am DATETIME DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (post_id) REFERENCES posts(id),
    FOREIGN KEY (user_id) REFERENCES users(id)
);

Frage 9: Wie optimieren Sie eine langsame SQL-Abfrage?

Antwort:

  1. EXPLAIN verwenden → Ausführungsplan analysieren
  2. Index erstellen auf Feldern in WHERE, JOIN, ORDER BY
  3. SELECT * vermeiden → nur benötigte Spalten abfragen
  4. LIKE '%...%' vermeiden → Index wird nicht genutzt
  5. WHERE-Bedingungen optimieren → Funktionen auf Spalten vermeiden
sql
-- ❌ Langsam (Index wird nicht genutzt)
SELECT * FROM users WHERE YEAR(erstellt_am) = 2024;

-- ✅ Schnell (Index kann genutzt werden)
SELECT * FROM users 
WHERE erstellt_am >= '2024-01-01' 
  AND erstellt_am < '2025-01-01';

Frage 10: Wie erstellen Sie ein Backup und stellen es wieder her?

Antwort:

  • Backup erstellen: mysqldump -u root -p datenbank > backup.sql
  • Wiederherstellung: mysql -u root -p datenbank < backup.sql
bash
# Backup
mysqldump -u root -p shop_db > shop_backup_2024.sql

# Wiederherstellung
mysql -u root -p shop_db < shop_backup_2024.sql

19.4 Sicherheitsfragen

Frage 11: Was ist SQL-Injection und wie verhindert man sie?

Antwort:

  • SQL-Injection: Angreifer schleusen bösartigen SQL-Code über Eingabefelder ein
  • Verhinderung:
    1. Prepared Statements verwenden (wichtigste Methode!)
    2. Eingaben validieren und bereinigen
    3. Keine dynamischen SQL-Abfragen bauen
    4. Fehlermeldungen unterdrücken

Beispiel (PHP mit Prepared Statements):

php
 Sicher!
$stmt = $pdo->prepare("SELECT * FROM users WHERE id = ?");
$stmt->execute([$user_id]);

Frage 12: Wie verwalten Sie Datenbank-Berechtigungen?

Antwort:

  • Prinzip der geringsten Rechte (Least Privilege)
  • Separate Benutzer für jede Anwendung erstellen
  • Nur notwendige Berechtigungen gewähren
sql
-- Benutzer erstellen
CREATE USER 'app_user'@'localhost' IDENTIFIED BY 'sicheres_passwort';

-- Nur Lese- und Schreibzugriff gewähren
GRANT SELECT, INSERT, UPDATE, DELETE ON shop_db.* TO 'app_user'@'localhost';

-- Berechtigungen aktivieren
FLUSH PRIVILEGES;

19.5 Fortgeschrittene Fragen

Frage 13: Was ist eine Transaktion? Erklären Sie ACID!

Antwort: Eine Transaktion ist eine Folge von SQL-Befehlen, die entweder alle erfolgreich ausgeführt werden oder gar nicht (Rollback).

ACID-Eigenschaften:

  • Atomicity (Atomarität): Alle oder keiner
  • Consistency (Konsistenz): Datenbank bleibt konsistent
  • Isolation (Isolation): Transaktionen beeinflussen sich nicht
  • Durability (Dauerhaftigkeit): Ergebnis ist dauerhaft gespeichert
sql
START TRANSACTION;
UPDATE konten SET betrag = betrag - 100 WHERE id = 1;
UPDATE konten SET betrag = betrag + 100 WHERE id = 2;
COMMIT;  -- Erfolg: Änderungen speichern
-- ROLLBACK;  -- Fehler: Alle Änderungen rückgängig machen

Frage 14: Was ist ein Index? Vor- und Nachteile?

Antwort:

  • Index: Datenstruktur, die den Datenbankengine hilft, Daten schneller zu finden
  • Vorteile: Schnellere Abfragen (SELECT)
  • Nachteile: Langsamere INSERT/UPDATE/DELETE (Index muss mitgeändert werden), belegt Speicherplatz

Wann Index erstellen?

  • ✅ Bei großen Tabellen (ab ca. 1000 Zeilen)
  • ✅ Bei Feldern, die häufig in WHERE, JOIN, ORDER BY verwendet werden
  • ❌ Bei Feldern, die häufig geändert werden
  • ❌ Bei kleinen Tabellen

Frage 15: Was sind Stored Procedures, Trigger und Views?

Antwort:

  • Stored Procedure: Gespeicherte Prozedur (Gruppe von SQL-Befehlen)
  • Trigger: Automatische Aktion bei INSERT/UPDATE/DELETE
  • View: "Virtuelle Tabelle" (gespeicherte Abfrage)
sql
-- Stored Procedure
DELIMITER $$
CREATE PROCEDURE get_user_orders(IN p_user_id INT)
BEGIN
    SELECT * FROM orders WHERE user_id = p_user_id;
END $$
DELIMITER ;

-- View
CREATE VIEW active_users AS
SELECT * FROM users WHERE ist_aktiv = TRUE;

19.6 Interviewtipps für Einsteiger

Tipp 1: Kernkonzepte verstehen (nicht nur auswendig lernen!)

  • Verstehen Sie, WARUM etwas gemacht wird (z.B. WARUM Index?)
  • Praxisbeispiele parat haben (eigenes Projekt!)

Tipp 2: Häufige Fehler kennen

FehlerRichtige Lösung
DELETE FROM users; (ohne WHERE)Immer WHERE angeben!
SELECT * in ProduktionNur benötigte Spalten abfragen
Passwörter im Klartext speichernSHA2() oder bcrypt verwenden
ROOT-Benutzer in AnwendungenSeparate Benutzer mit begrenzten Rechten

Tipp 3: Eigene Projekte präsentieren können

  • Blog-Datenbank erklären können
  • Shop-Datenbank erklären können
  • Probleme erklären, die Sie gelöst haben

Zusammenfassung

In diesem Kapitel hast du gelernt:

  • ✅ Grundlegende Konzeptfragen zu beantworten (MySQL-Definition, Datentypen, Constraints)
  • ✅ Kern-SQL-Syntaxfragen zu beantworten (WHERE vs HAVING, JOINs, Unterabfragen)
  • ✅ Praxisszenarien zu lösen (Datenbankdesign, SQL-Optimierung, Backup)
  • ✅ Sicherheitsfragen zu beantworten (SQL-Injection, Berechtigungsverwaltung)
  • ✅ Fortgeschrittene Fragen zu beantworten (Transaktionen, Indizes, Stored Procedures)
  • ✅ Interviewtipps für Einsteiger

Übungen

  1. Praxis: Beantworten Sie Frage 8 (Blog-Datenbank) ausführlich (mit ER-Diagramm skizzieren!)
  2. Praxis: Schreiben Sie eine SQL-Abfrage für Frage 9 (langsame Abfrage optimieren)
  3. Praxis: Simulieren Sie eine SQL-Injection und zeigen Sie, wie man sie verhindert
  4. Praxis: Erklären Sie einem "Nicht-Techniker", was eine Datenbank ist

Nächstes Kapitel

Im nächsten Kapitel lernen wir Erweiterte Lernschwerpunkte – wohin Sie als nächstes gehen können, nachdem Sie MySQL gemeistert haben!

Frei für alle Anfänger