Skip to content

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

ObjektKonventionBeispiel ✅Beispiel ❌
DatenbankKleinbuchstaben, Unterstrichshop_dbShopDB
TabelleKleinbuchstaben, UnterstrichbestellungenBestellungen
FeldKleinbuchstaben, Unterstricherstellt_amErstelltAm
Indexidx_ + Feldnameidx_emailEmailIndex
PrimärschlüsselPRIMARY KEYid INT PRIMARY KEYPRIMARY 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)

FunktionMySQL 5.7MySQL 8.0+
JSON-UnterstützungBasisFortgeschritten
Fensterfunktionen❌ Nicht unterstützt✅ Unterstützt
ROLLBACK für DDL❌ Nicht möglich✅ Möglich
Standard-Encodinglatin1utf8mb4
HAVING ohne GROUP BYErlaubtNicht 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

  1. Theorie: Warum sind Codierungsnormen wichtig?
  2. Praxis: Schreibe eine gespeicherte Prozedur get_products_by_category, die Produkte nach Kategorie-ID abruft
  3. Praxis: Erstelle eine Sicht user_order_summary, die Benutzernamen und die Anzahl ihrer Bestellungen anzeigt
  4. 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!

Frei für alle Anfänger