Appearance
Kapitel 18: MySQL Fortgeschrittene Themen ⭐⭐
In diesem Kapitel lernst du fortgeschrittene Themen und Normen für den professionellen Einsatz.
18.1 MySQL-Codenormen (Wichtig für Teams!)
1. Benennungsnormen
| Objekt | Konvention | Beispiel ✅ | Beispiel ❌ |
|---|---|---|---|
| Datenbank | Kleinbuchstaben, Unterstrich | shop_db | ShopDB |
| Tabelle | Kleinbuchstaben, Unterstrich | bestellungen | Bestellungen |
| Feld | Kleinbuchstaben, Unterstrich | erstellt_am | ErstelltAm |
| Index | idx_ + Feldname | idx_email | EmailIndex |
| Primärschlüssel | PRIMARY KEY | id INT PRIMARY KEY | PRIMARY KEY(id) |
Empfehlung: Englische Namen verwenden (bessere Kompatibilität)!
sql
-- ✅ Richtig (Englisch)
CREATE TABLE users (
user_id INT PRIMARY KEY AUTO_INCREMENT,
email VARCHAR(100)
);
-- ❌ Falsch (Deutsch, aber funktioniert)
CREATE TABLE benutzer (
benutzer_id INT PRIMARY KEY AUTO_INCREMENT,
email VARCHAR(100)
);2. SQL-Format-Normen
sql
-- ✅ Richtig (Lesbar!)
SELECT
u.username,
COUNT(o.order_id) AS anzahl_bestellungen
FROM
users u
INNER JOIN orders o ON u.user_id = o.user_id
WHERE
u.ist_aktiv = TRUE
GROUP BY
u.user_id,
u.username
HAVING
anzahl_bestellungen > 5
ORDER BY
anzahl_bestellungen DESC
LIMIT
10;
-- ❌ Falsch (Schwer zu lesen!)
SELECT u.username,COUNT(o.order_id) AS anzahl_bestellungen FROM users u INNER JOIN orders o ON u.user_id=o.user_id WHERE u.ist_aktiv=TRUE GROUP BY u.user_id,u.username HAVING anzahl_bestellungen>5 ORDER BY anzahl_bestellungen DESC LIMIT 10;3. Kommentar-Normen
sql
-- ============================================
-- Tabelle: users
-- Beschreibung: Speichert Benutzerinformationen
-- Erstellt am: 2024-01-15
-- ============================================
CREATE TABLE users (
user_id INT PRIMARY KEY AUTO_INCREMENT -- Eindeutige Benutzer-ID
username VARCHAR(50) NOT NULL UNIQUE, -- Benutzername (eindeutig)
email VARCHAR(100) NOT NULL, -- E-Mail-Adresse
erstellt_am DATETIME DEFAULT CURRENT_TIMESTAMP -- Erstellungszeitpunkt
);18.2 MySQL-Versionsunterschiede (Nur Grundlegendes wissen)
| Funktion | MySQL 5.7 | MySQL 8.0+ |
|---|---|---|
| JSON-Unterstützung | Basis | Fortgeschritten |
| Fensterfunktionen | ❌ Nicht unterstützt | ✅ Unterstützt |
| ROLLBACK für DDL | ❌ Nicht möglich | ✅ Möglich |
| Standard-Encoding | latin1 | utf8mb4 |
HAVING ohne GROUP BY | Erlaubt | Nicht erlaubt |
Wichtig für Einsteiger: Behalte die MySQL-Version im Hinterkopf, falls Syntaxfehler auftreten!
Beispiel (MySQL 8.0+ Fensterfunktionen):
sql
-- In MySQL 5.7 NICHT möglich!
SELECT
produkt_name,
preis,
RANK() OVER (ORDER BY preis DESC) AS preis_rang
FROM products;18.3 Erweiterte Eigenschaften (Optional, für Fortgeschrittene)
1. Gespeicherte Prozeduren (Stored Procedures)
Was ist das? Eine Gruppe von SQL-Befehlen, die zusammen gespeichert werden.
sql
-- Gespeicherte Prozedur erstellen
DELIMITER $$
CREATE PROCEDURE get_user_orders(IN p_user_id INT)
BEGIN
SELECT
o.order_id,
o.bestelldatum,
p.produkt_name,
o.menge
FROM orders o
INNER JOIN products p ON o.produkt_id = p.produkt_id
WHERE o.user_id = p_user_id;
END $$
DELIMITER ;
-- Prozedur aufrufen
CALL get_user_orders(1);2. Trigger (Auslöser)
Was ist das? Automatische Aktionen, die bei INSERT/UPDATE/DELETE ausgelöst werden.
sql
-- Trigger: Automatische E-Mail-Aktualisierung (Beispiel)
DELIMITER $$
CREATE TRIGGER before_user_update
BEFORE UPDATE ON users
FOR EACH ROW
BEGIN
SET NEW.email = LOWER(NEW.email); -- E-Mail in Kleinbuchstaben umwandeln
END $$
DELIMITER ;3. Sichten (Views)
Was ist das? Eine "virtuelle Tabelle" (eigentlich eine gespeicherte Abfrage).
sql
-- Sicht erstellen
CREATE VIEW active_users AS
SELECT
user_id,
username,
email
FROM users
WHERE ist_aktiv = TRUE;
-- Sicht verwenden (wie eine normale Tabelle)
SELECT * FROM active_users;18.4 MySQL mit Backend-Sprachen verbinden (Einfache Beispiele)
1. PHP + MySQL (Häufig verwendet!)
php
<?php
// 1. Verbindung herstellen
$conn = new mysqli('localhost', 'root', 'passwort', 'shop_db');
// 2. Fehlerprüfung
if ($conn->connect_error) {
die('Verbindungsfehler: ' . $conn->connect_error);
}
// 3. SQL-Abfrage (Sicher mit Prepared Statements!)
$stmt = $conn->prepare("SELECT username, email FROM users WHERE user_id = ?");
$stmt->bind_param('i', $user_id); // 'i' = integer
$stmt->execute();
$result = $stmt->get_result();
// 4. Ergebnis verarbeiten
while ($row = $result->fetch_assoc()) {
echo 'Benutzer: ' . $row['username'] . '<br>';
}
// 5. Verbindung schließen
$stmt->close();
$conn->close();
?>2. Java + MySQL (JDBC)
java
import java.sql.*;
public class MySQLTest {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/shop_db?useSSL=false&serverTimezone=UTC";
String user = "root";
String password = "passwort";
try (Connection conn = DriverManager.getConnection(url, user, password)) {
// SQL-Abfrage
String sql = "SELECT username, email FROM users WHERE user_id = ?";
PreparedStatement stmt = conn.prepareStatement(sql);
stmt.setInt(1, 1); // Erster Platzhalter = 1
ResultSet rs = stmt.executeQuery();
while (rs.next()) {
System.out.println("Benutzer: " + rs.getString("username"));
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}3. Python + MySQL (mysql-connector-python)
python
import mysql.connector
# 1. Verbindung herstellen
conn = mysql.connector.connect(
host='localhost',
user='root',
password='passwort',
database='shop_db'
)
# 2. Cursor erstellen
cursor = conn.cursor()
# 3. SQL-Abfrage (Sicher mit parametrisierter Abfrage!)
sql = "SELECT username, email FROM users WHERE user_id = %s"
cursor.execute(sql, (1,))
# 4. Ergebnis verarbeiten
for row in cursor.fetchall():
print(f"Benutzer: {row[0]}")
# 5. Verbindung schließen
cursor.close()
conn.close()Zusammenfassung
In diesem Kapitel hast du gelernt:
- ✅ MySQL-Codenormen (Benennung, Formatierung, Kommentare)
- ✅ MySQL-Versionsunterschiede (5.7 vs 8.0)
- ✅ Erweiterte Eigenschaften (Stored Procedures, Trigger, Views) – optional
- ✅ MySQL mit Backend-Sprachen (PHP, Java, Python) zu verbinden
Übungen
- Theorie: Warum sind Codierungsnormen wichtig?
- Praxis: Schreibe eine gespeicherte Prozedur
get_products_by_category, die Produkte nach Kategorie-ID abruft - Praxis: Erstelle eine Sicht
user_order_summary, die Benutzernamen und die Anzahl ihrer Bestellungen anzeigt - Praxis: Verbinde dich mit MySQL über PHP (oder eine andere Sprache deiner Wahl)
Nächstes Kapitel
Im nächsten Kapitel lernen wir häufig gestellte MySQL-Interviewragen – sehr wichtig für Bewerbungsgespräche!
