SQL-Einstieg: Datenbanken verstehen & Beispiele nutzen
Die Syntax der Programmiersprache SQL basiert auf der relationalen Algebra und hebt sich dadurch deutlich von anderen Sprachen ab. Um SQL effizient zu meistern, sind ein solides Verständnis dieser Struktur sowie praxisnahe Beispiele der beste Weg zum Erfolg.
Grundlagen der SQL-Syntax
Allgemein beschreibt die Syntax die „Schreibweise“ einer Sprache. Sie definiert die verfügbaren Code-Bausteine und wie du diese korrekt kombinierst. Dieses Wissen ist die Basis, um Code fehlerfrei zu lesen und zu erstellen.
Die zentralen Elemente sind SQL-Anweisungen mit optionalen Klauseln. Im Alltag werden beide oft vereinfacht als „SQL-Befehle“ bezeichnet. Hier siehst du die wichtigsten Konstrukte im Überblick:
| Begriff | Englisch | Erklärung | Beispiel |
|---|---|---|---|
| Anweisung | Statement | Befiehlt dem DBMS eine Aktion; schließt mit einem Semikolon ab | CREATE TABLE People;
|
| Klausel | Clause | Präzisiert eine Anweisung; existiert nur innerhalb dieser | WHERE, HAVING
|
| Ausdruck | Expression | Gibt nach der Berechnung einen Wert aus | 6 * 7
|
| Identifikation | Identifier | Name eines Objekts, einer Variable oder Prozedur (qualifiziert/unqualifiziert) | dbname.tablename / tablename
|
| Prädikat | Predicate | Ein Ausdruck, der TRUE, FALSE oder UNKNOWN als Ergebnis liefert
|
Age < 42
|
| Abfrage | Query | Spezielle Anweisung, die eine Ergebnismenge ausgibt | SELECT Name FROM People WHERE Age < 42;
|
| Funktion | Function | Verarbeitet Werte und generiert meist ein neues Ergebnis | UPPER('text') -- Gibt 'TEXT' zurück
|
| Kommentar | Comment | Erklärt den Code für Menschen; wird vom RDBMS ignoriert | -- Kommentar bis zum Ende der Zeile / /*Ggf. mehrzeiliger Kommentar*/
|
Befehle wie SELECT oder CREATE TABLE werden meist großgeschrieben. Technisch gesehen ignoriert SQL die Groß- und Kleinschreibung – es handelt sich dabei lediglich um eine gängige Konvention für bessere Lesbarkeit.
Wie wird SQL-Code ausgeführt?
SQL-Code wird als reiner Text gespeichert. Damit er aktiv wird, braucht er eine Ausführungsumgebung. Ein SQL-Interpreter liest den Quelltext und setzt ihn in Aktionen innerhalb des RDBMS um. Dabei gibt es zwei Wege:
- Interaktive Ausführung
Hier schreibst du den Code direkt in ein Textfeld. Er wird sofort verarbeitet und das Ergebnis erscheint prompt. Da du den Code schnell anpassen und neu testen kannst, ist diese Methode ideal zum Lernen und für komplexe Abfragen.
- Ausführung als Skript
Eine komplette Datei wird Zeile für Zeile abgearbeitet. Feedback erhältst du oft erst am Ende. Das ist perfekt, um Prozesse zu automatisieren oder MySQL Datenbank-Backups via MySQL-Dump einzuspielen.
| Schnittstelle | Beschreibung | Beispiele |
|---|---|---|
| Kommandozeile (CLI) | Textbasiert; Eingabe und Ergebnis erfolgen rein in Textform | mysql, psql, mysqlsh |
| Grafische Oberfläche (GUI) | Eingabe im Textfenster; Ergebnisse werden übersichtlich in Tabellen visualisiert | phpMyAdmin, MySQL Workbench, HeidiSQL |
| Programmierschnittstelle (API) | Direkte Verbindung zum RDBMS; SQL wird als String im Programmcode genutzt | PHP Data Objects (PDO), Connector/J, Connector/Python |
Beispiel: Eine Produktverwaltung mit SQL aufbauen
Am besten lernst du, wenn du selbst aktiv wirst. Wir bauen gemeinsam eine kleine Datenbank auf und führen Abfragen durch. Nutze dafür den Online SQL interpreter von sql.js. Ersetze dort einfach den vorhandenen Code durch unsere Beispiele und führe ihn Schritt für Schritt aus.
Der Plan für deine SQL-Datenbank
Wir simulieren eine Produktverwaltung für ein Geschäft. Hier sind die Eckpunkte:
- Wir führen verschiedene Produkte mit jeweiligen Lagerbeständen.
- Wir verwalten Daten unserer Kundschaft.
- Bestellungen können mehrere Produkte enthalten.
- Wir speichern Datum, Kund:innen und die genauen Bestellmengen.
Diese Logik gießen wir nun in SQL-Code, wobei wir diesem festen Ablauf folgen:
- Modell entwerfen
- Schema festlegen
- Daten einpflegen
- Abfragen erstellen
Entitäten und Beziehungen modellieren
Zuerst definierst du das System auf theoretischer Ebene (oft als Entity Relationship Diagram). Du suchst nach Entitäten (Klassen von Dingen) und deren Beziehungen.
In unserem Fall sind das: Produkt, Kundschaft und Bestellung. Jede Entität bekommt eine Tabelle. Oft braucht es zusätzliche Tabellen, um Verknüpfungen sauber abzubilden – das erfordert etwas Übung.
Wichtig ist die Art der Beziehung, betrachtet in beide Richtungen (Einzahl/Mehrzahl). Beispiel Besitzer:in und Auto:
- „Einer Person gehören oft mehrere Autos“
- „Ein Auto gehört genau einer Person“
Daraus ergeben sich drei typische Muster:
| Typ | Beispiel | Sicht von links | Sicht von rechts |
|---|---|---|---|
| 1:1-Beziehung | Auto:Kennzeichen | „Ein Auto hat ein Kennzeichen“ | „Ein Kennzeichen gehört zu einem Auto“ |
| 1:n-Beziehung | Besitzer:Auto | „Eine Person besitzt mehrere Autos“ | „Ein Auto hat einen Besitzer“ |
| m:n-Beziehung | Auto:Straße | „Ein Auto nutzt viele Straßen“ | „Eine Straße wird von vielen Autos befahren“ |
Produkte anlegen
Wir starten mit der Tabelle für Produkte: Schema festlegen, Daten einfügen und erste Abfragen testen.
Schema definieren
Mit CREATE TABLE erstellst du die Tabelle und definierst die Spalten samt Datentypen und Regeln für die Werte:
DROP TABLE IF EXISTS Products;
CREATE TABLE Products ( product_id int, product_name text, stocked int, price int );sqlWir setzen DROP TABLE IF EXISTS davor. So wird eine alte Tabelle gelöscht, falls sie existiert, und du kannst den Code ohne Fehlermeldung beliebig oft neu starten.
Datensätze einpflegen
Nun füllen wir die Tabelle mit Testdaten. Dafür nutzen wir INSERT INTO und die VALUES-Funktion:
INSERT INTO Products VALUES (10, 'ABC Product', 74, 1050);
INSERT INTO Products VALUES (20, 'KLM Product', 23, 750);
INSERT INTO Products VALUES (30, 'XYZ Product', 104, 350);sqlAbfragen definieren
Um zu kontrollieren, ob alles geklappt hat, lassen wir uns mit SELECT FROM die gesamte Tabelle anzeigen:
SELECT * FROM Products;sqlHier eine fortgeschrittene Abfrage, die direkt den Gesamtwert des Lagers berechnet:
SELECT product_name AS 'Name', (stocked * price) AS 'Value' FROM Products;sqlRestliche Tabellen implementieren
Jetzt folgen die weiteren Tabellen nach demselben Prinzip. Zuerst die Kundschaft:
DROP TABLE IF EXISTS Customers;
CREATE TABLE Customers ( customer_id int, customer_name text, contact text );sqlWir fügen zwei Beispiel-Einträge hinzu:
INSERT INTO Customers VALUES (100, 'EDC Customer', 'ED@example.com');
INSERT INTO Customers VALUES (200, 'WVU Customer', 'WV@example.com');sqlKurzer Check der Tabelle:
SELECT * FROM Customers;sqlNun folgt die Tabelle für die Bestellungen:
DROP TABLE IF EXISTS Orders;
CREATE TABLE Orders ( order_id int, customer_id int, order_date text );sqlWir erfassen drei Bestellungen. Wichtig: Die erste Zahl ist die ID (Primärschlüssel), die zweite die Kund:innen-ID (Fremdschlüssel). Zudem speichern wir das Datum:
INSERT INTO Orders VALUES (1000, 100, '2022-05-03');
INSERT INTO Orders VALUES (1001, 100, '2022-05-04');
INSERT INTO Orders VALUES (1002, 200, '2022-05-08');sqlKontrolle der Bestellungen:
SELECT * FROM Orders;sqlZuletzt brauchen wir eine Tabelle für die bestellten Produkte pro Auftrag. Da eine Bestellung viele Produkte haben kann und umgekehrt, ist dies eine m:n-Beziehung. Die Tabelle verknüpft die IDs von Bestellung und Produkt:
DROP TABLE IF EXISTS OrderItems;
CREATE TABLE OrderItems ( orderitem_id int, order_id int, product_id int, count int );sqlWir ordnen Produkte den Bestellungen zu, sodass eine Bestellung mehrere Posten enthält und eine andere nur einen:
INSERT INTO OrderItems VALUES (10001, 1000, 10, 3);
INSERT INTO OrderItems VALUES (10002, 1000, 20, 2);
INSERT INTO OrderItems VALUES (10003, 1002, 30, 12);sqlAbschließender Check der bestellten Produkte:
SELECT * FROM OrderItems;sqlKomplexe Abfragen nutzen
Jetzt zeigt SQL seine wahre Stärke. Wir führen Daten aus verschiedenen Tabellen zusammen. Mit einem SQL JOIN verknüpfen wir Kund:innen und Bestellungen. Wir nutzen dabei qualifizierte Identifikatoren, um die Spalten sauber zuzuordnen:
SELECT customers.customer_name as 'Customer', customers.customer_id, orders.order_id, orders.order_date AS 'Date' FROM Customers JOIN Orders ON Orders.customer_id = Customers.customer_id ORDER BY Customers.customer_id;sqlZum Abschluss berechnen wir mit einem weiteren JOIN die Gesamtkosten der Bestellungen:
SELECT OrderItems.order_id, OrderItems.orderitem_id AS 'Order Item', Products.product_name AS 'Product', Products.price AS 'Unit Price', OrderItems.count AS 'Count', (OrderItems.count * Products.price) AS 'Total' FROM OrderItems JOIN Products ON OrderItems.product_id = Products.product_id;sql