Die Syntax der Pro­gram­mier­spra­che SQL basiert auf der re­la­tio­na­len Algebra und hebt sich dadurch deutlich von anderen Sprachen ab. Um SQL effizient zu meistern, sind ein solides Ver­ständ­nis dieser Struktur sowie pra­xis­na­he Beispiele der beste Weg zum Erfolg.

Grund­la­gen der SQL-Syntax

Allgemein be­schreibt die Syntax die „Schreib­wei­se“ einer Sprache. Sie definiert die ver­füg­ba­ren Code-Bausteine und wie du diese korrekt kom­bi­nierst. Dieses Wissen ist die Basis, um Code feh­ler­frei zu lesen und zu erstellen.

Die zentralen Elemente sind SQL-An­wei­sun­gen mit op­tio­na­len Klauseln. Im Alltag werden beide oft ver­ein­facht als „SQL-Befehle“ be­zeich­net. Hier siehst du die wich­tigs­ten Kon­struk­te 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ä­zi­siert eine Anweisung; existiert nur innerhalb dieser WHERE, HAVING
Ausdruck Ex­pres­si­on Gibt nach der Be­rech­nung einen Wert aus 6 * 7
Iden­ti­fi­ka­ti­on Iden­ti­fier Name eines Objekts, einer Variable oder Prozedur (qua­li­fi­ziert/un­qua­li­fi­ziert) dbname.tablename / tablename
Prädikat Predicate Ein Ausdruck, der TRUE, FALSE oder UNKNOWN als Ergebnis liefert Age < 42
Abfrage Query Spezielle Anweisung, die eine Er­geb­nis­men­ge ausgibt SELECT Name FROM People WHERE Age < 42;
Funktion Function Ver­ar­bei­tet 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*/
Hinweis

Befehle wie SELECT oder CREATE TABLE werden meist groß­ge­schrie­ben. Technisch gesehen ignoriert SQL die Groß- und Klein­schrei­bung – es handelt sich dabei lediglich um eine gängige Kon­ven­ti­on für bessere Les­bar­keit.

Wie wird SQL-Code aus­ge­führt?

SQL-Code wird als reiner Text ge­spei­chert. Damit er aktiv wird, braucht er eine Aus­füh­rungs­um­ge­bung. Ein SQL-In­ter­pre­ter liest den Quelltext und setzt ihn in Aktionen innerhalb des RDBMS um. Dabei gibt es zwei Wege:

  1. In­ter­ak­ti­ve Aus­füh­rung

Hier schreibst du den Code direkt in ein Textfeld. Er wird sofort ver­ar­bei­tet 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.

  1. Aus­füh­rung als Skript

Eine komplette Datei wird Zeile für Zeile ab­ge­ar­bei­tet. Feedback erhältst du oft erst am Ende. Das ist perfekt, um Prozesse zu au­to­ma­ti­sie­ren oder MySQL Datenbank-Backups via MySQL-Dump ein­zu­spie­len.

Schnitt­stel­le Be­schrei­bung Beispiele
Kom­man­do­zei­le (CLI) Text­ba­siert; Eingabe und Ergebnis erfolgen rein in Textform mysql, psql, mysqlsh
Grafische Ober­flä­che (GUI) Eingabe im Text­fens­ter; Er­geb­nis­se werden über­sicht­lich in Tabellen vi­sua­li­siert phpMy­Ad­min, MySQL Workbench, HeidiSQL
Pro­gram­mier­schnitt­stel­le (API) Direkte Ver­bin­dung zum RDBMS; SQL wird als String im Pro­gramm­code genutzt PHP Data Objects (PDO), Connector/J, Connector/Python

Beispiel: Eine Pro­dukt­ver­wal­tung 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 in­ter­pre­ter von sql.js. Ersetze dort einfach den vor­han­de­nen Code durch unsere Beispiele und führe ihn Schritt für Schritt aus.

Der Plan für deine SQL-Datenbank

Wir si­mu­lie­ren eine Pro­dukt­ver­wal­tung für ein Geschäft. Hier sind die Eckpunkte:

  • Wir führen ver­schie­de­ne Produkte mit je­wei­li­gen La­ger­be­stän­den.
  • Wir verwalten Daten unserer Kund­schaft.
  • Be­stel­lun­gen können mehrere Produkte enthalten.
  • Wir speichern Datum, Kund:innen und die genauen Be­stell­men­gen.

Diese Logik gießen wir nun in SQL-Code, wobei wir diesem festen Ablauf folgen:

  1. Modell entwerfen
  2. Schema festlegen
  3. Daten ein­pfle­gen
  4. Abfragen erstellen

Entitäten und Be­zie­hun­gen mo­del­lie­ren

Zuerst de­fi­nierst du das System auf theo­re­ti­scher Ebene (oft als Entity Re­la­ti­onship Diagram). Du suchst nach Entitäten (Klassen von Dingen) und deren Be­zie­hun­gen.

In unserem Fall sind das: Produkt, Kund­schaft und Be­stel­lung. Jede Entität bekommt eine Tabelle. Oft braucht es zu­sätz­li­che Tabellen, um Ver­knüp­fun­gen sauber ab­zu­bil­den – das erfordert etwas Übung.

Wichtig ist die Art der Beziehung, be­trach­tet in beide Rich­tun­gen (Einzahl/Mehrzahl). Beispiel Besitzer:in und Auto:

  1. „Einer Person gehören oft mehrere Autos“
  2. „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:Kenn­zei­chen „Ein Auto hat ein Kenn­zei­chen“ „Ein Kenn­zei­chen 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 de­fi­nie­ren

Mit CREATE TABLE erstellst du die Tabelle und de­fi­nierst die Spalten samt Da­ten­ty­pen und Regeln für die Werte:

DROP TABLE IF EXISTS Products;
CREATE TABLE Products ( product_id int, product_name text, stocked int, price int );
sql
Hinweis

Wir setzen DROP TABLE IF EXISTS davor. So wird eine alte Tabelle gelöscht, falls sie existiert, und du kannst den Code ohne Feh­ler­mel­dung beliebig oft neu starten.

Da­ten­sät­ze ein­pfle­gen

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);
sql

Abfragen de­fi­nie­ren

Um zu kon­trol­lie­ren, ob alles geklappt hat, lassen wir uns mit SELECT FROM die gesamte Tabelle anzeigen:

SELECT * FROM Products;
sql

Hier eine fort­ge­schrit­te­ne Abfrage, die direkt den Ge­samt­wert des Lagers berechnet:

SELECT product_name AS 'Name', (stocked * price) AS 'Value' FROM Products;
sql

Restliche Tabellen im­ple­men­tie­ren

Jetzt folgen die weiteren Tabellen nach demselben Prinzip. Zuerst die Kund­schaft:

DROP TABLE IF EXISTS Customers;
CREATE TABLE Customers ( customer_id int, customer_name text, contact text );
sql

Wir 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');
sql

Kurzer Check der Tabelle:

SELECT * FROM Customers;
sql

Nun folgt die Tabelle für die Be­stel­lun­gen:

DROP TABLE IF EXISTS Orders;
CREATE TABLE Orders ( order_id int, customer_id int, order_date text );
sql

Wir erfassen drei Be­stel­lun­gen. Wichtig: Die erste Zahl ist die ID (Pri­mär­schlüs­sel), die zweite die Kund:innen-ID (Fremd­schlüs­sel). 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');
sql

Kontrolle der Be­stel­lun­gen:

SELECT * FROM Orders;
sql

Zuletzt brauchen wir eine Tabelle für die be­stell­ten Produkte pro Auftrag. Da eine Be­stel­lung viele Produkte haben kann und umgekehrt, ist dies eine m:n-Beziehung. Die Tabelle verknüpft die IDs von Be­stel­lung und Produkt:

DROP TABLE IF EXISTS OrderItems;
CREATE TABLE OrderItems ( orderitem_id int, order_id int, product_id int, count int );
sql

Wir ordnen Produkte den Be­stel­lun­gen zu, sodass eine Be­stel­lung 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);
sql

Ab­schlie­ßen­der Check der be­stell­ten Produkte:

SELECT * FROM OrderItems;
sql

Komplexe Abfragen nutzen

Jetzt zeigt SQL seine wahre Stärke. Wir führen Daten aus ver­schie­de­nen Tabellen zusammen. Mit einem SQL JOIN ver­knüp­fen wir Kund:innen und Be­stel­lun­gen. Wir nutzen dabei qua­li­fi­zier­te Iden­ti­fi­ka­to­ren, um die Spalten sauber zu­zu­ord­nen:

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;
sql

Zum Abschluss berechnen wir mit einem weiteren JOIN die Ge­samt­kos­ten der Be­stel­lun­gen:

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
Zum Hauptmenü