SQL Grundlagen

SQL (Structured Query Language) ist eine spezielle Programmiersprache, die für die Verwaltung von Daten in relationalen Datenbanken verwendet wird. Sie ermöglicht es, Daten abzurufen, einzufügen, zu aktualisieren und zu löschen. SQL ist eine unverzichtbare Fähigkeit für Datenbankadministratoren und Entwickler, um effizient auf Daten zuzugreifen und diese zu verwalten.

SQL-Befehle

SQL bietet eine Vielzahl von Befehlen, um verschiedene Aufgaben in einer Datenbank auszuführen. Hier sind einige der wichtigsten SQL-Befehle:

SQL-Beispiele

Hier sind einige Beispiele für SQL-Abfragen, um die Verwendung der SQL-Befehle zu verdeutlichen:


            -- Beispiel 1: Abfrage nach Fahrern aus Deutschland
            SELECT Vorname, Nachname
            FROM Fahrer
            WHERE Land = 'Deutschland';
        

            -- Beispiel 2: Abfrage nach Teams mit mehr als 100 WM-Punkten
            SELECT Teamname, WM_Punkte
            FROM Teams
            WHERE WM_Punkte > 100;
        

SQL-Operatoren

SQL verwendet verschiedene Operatoren, um komplexe Abfragen durchzuführen. Hier sind einige der häufigsten SQL-Operatoren:

Sortierung und Begrenzung

Sie können die Reihenfolge der Abfrageergebnisse steuern und die Ergebnismenge begrenzen:

Arbeiten mit NULL-Werten

NULL-Werte sind in SQL wichtig und werden oft verwendet. Der IS-Operator kann verwendet werden, um NULL-Werte zu finden.

Berechnungen in SQL

In SQL können Sie auch Berechnungen durchführen und Ergebnisspalten mit Aliasnamen versehen.

Data Manipulation Language (DML)

Zur Bearbeitung von Daten gibt es in SQL die Befehle: INSERT, UPDATE und DELETE. Diese Befehlsgruppe wird auch als DML - Data Manipulation Language bezeichnet.

Wie fügt man Daten in eine Tabelle ein?

Mit dem INSERT-Befehl kannst Du Daten in eine Tabelle einfügen. Das geht so:


            INSERT INTO schueler VALUES (1024, 'Mueller', 'Heinz', '1988-08-14', 'Hüttenweg 6', '64536', 'Oberdorf');
            INSERT INTO Kurs VALUES ('12I34', 'Inf', 'Datenbanken', 'GK', '2004/01', 2);
            INSERT INTO Belegt VALUES (1024, '12I34', NULL);
        

Der INSERT-Befehl hat den Aufbau:


            INSERT INTO Tabelle VALUES (Wert_1, Wert_2,... , Wert_n);
        

Beim INSERT-Befehl in der bisherigen Form musst Du immer Werte für alle Spalten angeben. Bei der zweiten Form des INSERT-Befehls ist das nicht nötig, denn hier gibst Du hinter dem Tabellennamen die einzelnen Spalten an, die einen Wert erhalten sollen.


            INSERT INTO Tabelle(Spalte_1, Spalte_2, Spalte_3,...) VALUES (Wert_1, Wert_2, Wert_3, ...);
        

Und wie ändert man Daten?

Dafür gibt es den UPDATE-Befehl. Auch dafür drei Beispiele:


            UPDATE schueler SET Nachname = 'Müller' WHERE SNr = 1024;
            UPDATE Kurs SET Thema = 'Datenbanken mit SQL', Stunden = 3  WHERE KursNr = '12I34';
            UPDATE Belegt SET Punkte = 14 WHERE SNr = 1024 AND KursNr = '12I34';
        

Mit UPDATE Tabelle gibst Du an, in welcher Tabelle Daten geändert werden sollen. Mit SET Spalte = Wert gibst Du den neuen Wert für die Spalte an. Mit WHERE Bedingung wählst Du die Datensätze aus, die geändert werden sollen.

Fehlt die WHERE-Bedingung, so werden alle Datensätze geändert.

Ab in den Mülleimer!

Du löschst Datensätze mit dem DELETE-Befehl. Das geht so:


            DELETE FROM schueler WHERE SNr = 1024;
            DELETE FROM Kurs WHERE Fach = 'D';
            DELETE FROM Belegt;
        

Beim ersten DELETE-Befehl wird als WHERE-Bedingung ein Schlüsselwert angegeben. Dadurch wird genau ein Datensatz gelöscht. Beim zweiten DELETE-Befehl werden alle Deutsch-Kurse gelöscht. Beim dritten DELETE-Befehl fehlt die WHERE-Bedingung, dadurch werden alle Datensätze gelöscht.

Data Definition Language (DDL)

Der Teil von SQL, mit dem Du Tabellen und Datenbanken erstellst, wird DDL - Data Definition Language genannt. Die Tabellen der Datenbank Schule kann man mit diesen CREATE-Befehlen erzeugen:


            CREATE TABLE schueler (
                SNr INT(5) PRIMARY KEY,
                Nachname VARCHAR(40),
                Vorname VARCHAR(30),
                Geburtsdatum DATE,
                StrasseNr VARCHAR(40),
                PLZ VARCHAR(7),
                Ort VARCHAR(40)
            );

            CREATE TABLE Kurs (
                KursNr VARCHAR(10) PRIMARY KEY,
                Fach VARCHAR(5),
                Thema VARCHAR(50),
                Art ENUM('GK', 'LK'),
                Halbjahr VARCHAR(10),
                Stunden INT(1)
            );

            CREATE TABLE Belegt (
                SNr INT(5),
                KursNr VARCHAR(10),
                Punkte INT(2),
                PRIMARY KEY (SNr, KursNr)
            );
        

Mit CREATE TABLE Tabelle erhält die Tabelle einen Namen. Dann gibst Du alle Attribute der Tabelle samt ihren Datentypen an. Die Primärschlüssel kennzeichnet man mit PRIMARY KEY.

Weitere Datentypen findest Du im MySQL-Handbuch.

Tabellen leeren und löschen

Mit DELETE FROM Tabelle löschst Du alle Datensätze einer Tabelle. Zum Löschen einer Tabelle nimmst Du den DROP TABLE-Befehl, z. B. DROP TABLE Kurs.

WHERE - Abfrage mit Filter

Man kann ein Abfrageergebnis auch auf bestimmte Zeilen eingrenzen. Dazu dient die WHERE-Klausel. Sie listet die Bedingungen auf, die die gewünschten Zeilen erfüllen sollen. Sie folgt auf die FROM-Klausel. Der Fachbegriff für diese Eingrenzung ist Selektion.

Die Bedingungen, die hinter WHERE angeführt werden können, bestehen wie in Programmiersprachen aus Operanden und Operatoren. Operanden können Spaltennamen sein oder konstante Werte. Einer der Operatoren ist =, der zu einem logischen WAHR ausgewertet wird, wenn seine Operanden gleich sind:


                SELECT VorlNr, Titel
                FROM Vorlesung
                WHERE Titel = 'ET';
            

listet VorlNr und Titel aller derjenigen Zeilen der Tabelle Vorlesung auf, deren Titel 'ET' ist.

Es hängt von den Einstellungen der Datenbank ab, ob der = Operator Groß- und Kleinschreibung beim Vergleich beachtet. Es ist aber auf jeden Fall so, dass Leerstellen am Ende einer Zeichenkette ignoriert werden.

Die solchermaßen strukturierte, häufig verwendete Anweisung wird nach den Anfangsbuchstaben auch als „SFW-Block“ bezeichnet.

VorlNr Titel
5001 ET

Beachten Sie: SQL-Queries werden gerne einzeilig geschrieben. Damit aber die SQL-Fehlermeldung noch hilfreicher wird, kann man (zumindest beim Debugging) mehrere Zeilen benutzen. Dann steht am Ende nicht immer "at line 1", sondern die betreffende Zeile.


                // statt einer Zeile...
                $query = 'SELECT foo,bar FROM table WHERE answer=42';
    
                // mehrere nutzen
                $query = 'SELECT 
                    foo,
                    bar
                    FROM 
                    table 
                    WHERE 
                    answer=42';
            

LIKE - Abfrage mit Filter nach Inhalt

Ein anderer Operator ist LIKE. Er führt einen Mustervergleich durch, ähnlich der Mustersuche nach Dateinamen mit * und ?.


                SELECT Name
                FROM Student
                WHERE Name LIKE 'F%';
            

listet die Namen aller Studenten auf, deren Name mit F beginnt (im Beispiel: Fichte und Fauler).

LIKE kann mit verschiedenen Platzhaltern verwendet werden: _ steht für ein einzelnes beliebiges Zeichen, % steht für eine beliebige Zeichenfolge. Manche Datenbanksysteme bieten weitere solche Wildcard-Zeichen an, etwa für Zeichenmengen.

Name
Fichte
Fauler

ORDER BY - Abfrage mit Filter und Sortierung

Wenn die Ergebnisse einer Abfrage in einer bestimmten Reihenfolge erwartet werden, kann man sie sortieren lassen. Dafür fügt man am Ende des SELECT Befehl die ORDER BY Klausel an. Sie benennt die Spalten, nach deren Inhalt zu sortieren ist. Ohne weitere Angaben erfolgt die Sortierung aufsteigend, durch Hinzufügen des Schlüsselwortes DESC wird diese Spalte absteigend sortiert.


                SELECT Vorname, Name, StrasseNr, Plz, Ort
                FROM Student
                WHERE Plz = '20095'
                ORDER BY Name, Vorname DESC
            

listet Vorname, Name, StrasseNr, Plz und Ort aller Studenten aus dem angegebenen Postleitzahlbereich sortiert nach Name auf. Studenten mit gleichem Nachnamen werden absteigend nach Vorname sortiert.

Vorname Name StrasseNr Plz Ort
Max Muster 123 20095 Hamburg
Maria Müller 456 20095 Hamburg

Abfrage mit verknüpften Tabellen

Beispielbild SQL Abfragen

Oft müssen Inhalte mehrerer Tabellen verknüpft werden. Der Fachbegriff hierfür ist Join. Dafür listet man alle benötigten Tabellen in der FROM-Klausel auf.


                SELECT Vorlesung.VorlNr, Vorlesung.Titel, Professor.PersNr, Professor.Name
                FROM Professor, Vorlesung
                WHERE Professor.PersNr = Vorlesung.PersNr;
            

Sie können sich den Ablauf so vorstellen, dass die Datenbank nun alle möglichen Kombinationen von Professoren und Vorlesungen bildet, ein so genanntes kartesisches Produkt. Bei 10 Professoren und 20 Vorlesungen wären das 200 mögliche Kombinationen. In den meisten Fällen ist das nicht gewünscht – man möchte z. B. nur die Kombinationen haben, wo die Vorlesung vom Professor gehalten wird. Dafür grenzt man die Kombinationen entsprechend ein. Dies kann in der WHERE-Klausel erfolgen, einen anderen Weg ist der Tabellen-Operator JOIN mit der ON Bedingung.


                SELECT Vorlesung.VorlNr, Vorlesung.Titel, Professor.PersNr, Professor.Name
                FROM Professor INNER JOIN Vorlesung
                    ON Professor.PersNr = Vorlesung.PersNr;
            

Vorsicht: Nicht alle Datenbankmanagementsysteme kennen den JOIN-Operator.

Das Schlüsselwort INNER gibt an, dass nur die Zeilen aus Professor- und Vorlesung-Tabelle Verwendung finden sollen, für die die Join-Bedingung erfüllbar ist. Ein Professor, der keine Vorlesung hält, oder eine Vorlesung mit einer in Professor unbekannten PersId würden also nicht aufgelistet werden. So etwas wäre ein äußerer Verbund (outer join), auf den das Kapitel über JOINs eingeht.

Die im Beispiel verwendeten Tabellen Professor und Vorlesung haben ein gemeinsames Attribut: PersNr. Der JOIN liefert die Kombinationen, wo Professor-Zeile und Vorlesung-Zeile in diesem Attribut übereinstimmen. Das nennt man einen natürlichen inneren Verbund (natural inner join). Manche DBMS, wie z. B. MySQL, unterstützen das durch das Schlüsselwort NATURAL

Was das Beispiel auch zeigt, ist der Umgang mit mehrdeutigen Namen. Die Professor- und Vorlesung-Tabelle enthalten beide eine Spalte mit dem Namen PersNr. Würde man ON PersNr = PersNr schreiben, wüsste das DBMS nicht, was gemeint ist. Um das aufzulösen, kann man eine Spalte den Namen der Tabelle voranstellen, in der sie zu finden ist.

Tabellen können nicht nur über Schlüsselfelder, sondern über beliebige Felder miteinander verknüpft werden, wie das folgende, fachlich unsinnige Beispiel zeigt:


                SELECT Vorlesung.Titel, Professor.Name
                FROM Professor, Vorlesung
                WHERE Professor.Name <> Vorlesung.Titel
            

Der Operator <> bedeutet "ungleich". Die Abfrage findet Kombinationen von Professor und Vorlesung, bei denen der Name des Professors nicht mit dem Titel der Vorlesung übereinstimmt. Prof. Shangri La mit ihrer Vorlesung über Lineare Algebra (Titel: LA) würde nicht ausgegeben.

Titel Name
ET Tesla
ET Wirth
ET Urlauber
IT Tesla
IT Wirth
IT Urlauber
DB Tesla
DB Wirth
DB Urlauber

COUNT & Co - Aggregat-Funktionen

Eine häufige Aufgabe beim Abfragen umfangreicher Datenbestände ist ihre Verdichtung. Man möchte zählen, summieren, Durchschnitte bilden, oder Minima und Maxima finden. SQL unterstützt standardmäßig genau diese fünf Operationen durch die sogenannten Aggregatfunktionen COUNT, SUM, AVG, MIN und MAX. Werden diese Funktionen in einer einfachen SFW-Abfrage eingesetzt, ist das Ergebnis genau eine einzige Zeile. Es ist sinnvoll, die Aggregatfunktionen mit AS zu kombinieren, um den Namen der Ergebnisspalte festzulegen.


                SELECT COUNT(*) AS Anzahl, MAX(Name) AS MaxName FROM Professor
            
Anzahl MaxName
3 Wirth

GROUP BY - Bilden von Teilmengen

Nicht immer will man alle Sätze aggregieren. Man kann auch Teilmengen bilden. Betrachten wir ein etwas umfangreicheres Beispiel:


                SELECT StudGang AS Studiengang, COUNT(*) AS Anzahl
                FROM Student
                GROUP BY StudGang
                ORDER BY StudGang
            
Studiengang Anzahl
E-Technik 2
Mathematik 1
Physik 2

Ohne Angabe einer ORDER BY Klausel ist die Reihenfolge der Sätze nicht definiert. Das Ergebnis kann aufsteigend nach den Gruppierspalten sortiert sein, aber das ist ohne ORDER BY nicht gewährleistet.

Beachten Sie: Werden Aggregatfunktionen verwendet, dann dürfen in der SELECT Klausel nur solche Spalten ohne Aggregatfunktion stehen, die unter GROUP BY angegeben sind. Viele Datenbanksysteme geben einen Fehler aus, wenn man sich nicht daran hält. MySQL ist eine Ausnahme, es erlaubt auch die Angabe von Spalten ohne Aggregatfunktion, die nicht unter GROUP BY aufgeführt sind. Ausgegeben wird dann aber irgendein Wert dieser Spalte der für diese Gruppe ausgewählten Zeilen.

DISTINCT - Abfrage mit eindeutigen Werten

Eine Sonderform der Gruppierung ist das Reduzieren einer Ergebnismenge auf eindeutige Werte. Wenn man aus der im vorigen Abschnitt gezeigten, erweiterten Student-Tabelle eine Liste der belegten Studiengänge ermitteln möchte, dann ist


                SELECT DISTINCT StudGang FROM Student
            

falsch – man möchte ja E-Technik und Physik nur einmal ausgeben. Man kann es mit GROUP BY lösen:


                SELECT StudGang
                FROM Student
                GROUP BY StudGang
            

Aber weil das eine recht häufige Aufgabe ist, gibt es dafür das Schlüsselwort DISTINCT in der SELECT Klausel:


                SELECT DISTINCT StudGang FROM Student
            

DISTINCT bezieht sich nicht auf eine Spalte, sondern auf die komplette Ergebniszeile. Listet man mehrere Spalten auf, werden nur die Zeilen zusammengefasst, bei denen alle Spaltenwerte gleich sind.


                SELECT COUNT(StudGang), COUNT(DISTINCT StudGang) FROM Student
            

ermittelt zwei Werte: Die Anzahl der Studenten, für die StudGang nicht NULL ist (ohne DISTINCT) und die Anzahl von unterschiedlicher Studiengängen, die von den Studenten belegt wurden (mit DISTINCT).

HAVING - Filtern von aggregierten Werten

Wenn man die GROUP BY Klausel einsetzt, kann die Aufgabe entstehen, dass man nur die Gruppen sehen möchte, für die ein aggregiertes Ergebnis bestimmte Bedingungen erfüllt. Beispielsweise möchte man alle Studiengänge finden, für die die Menge der eingeschriebenen Studenten eine Mindestmenge unterschreitet. Eine Abfrage, die die Anzahl der Studenten pro Studiengang findet, wurde bereits weiter oben gezeigt. Eine Filterung des COUNT-Ergebnisses mittels WHERE ist aber nicht möglich, weil die WHERE-Filterung vor der Gruppierung stattfindet. Dafür gibt es eine eigene Klausel: HAVING.


                SELECT StudGang AS Studiengang, COUNT(*) AS Anzahl
                FROM Student
                GROUP BY StudGang
                HAVING COUNT(*) < 2
                ORDER BY StudGang
            
Studiengang Anzahl
Mathematik 1

Für Mathe ist wohl etwas mehr Werbung nötig.

Mengenoperatoren: UNION, EXCEPT und INTERSECT

Mengenoperatoren können dazu genutzt werden, die Ergebnismengen mehrerer SELECT-Abfragen zusammenzufügen. Voraussetzung ist, dass diese SELECTs gleich viele Attribute auslesen und die Datentypen der Attribute übereinstimmen.

Mengenoperator UNION:


                SELECT userid, username, lastlogin, 'A-Forum' as Quelle
                FROM   forum1.users 
                WHERE  userlevel=9
                UNION
                SELECT userid, username, lastlogin, 'B-Forum'
                FROM   forum2.users
                WHERE  userlevel=9
                ORDER BY lastlogin
            

Mengenoperator EXCEPT:


                SELECT userid, username, lastlogin, 'A-Forum' as Quelle
                FROM   forum1.users 
                WHERE  userlevel=9
                EXCEPT
                SELECT userid, username, lastlogin, 'B-Forum'
                FROM   forum2.users
                WHERE  userlevel=9
            

Mengenoperator INTERSECT:


                SELECT userid, username, lastlogin, 'A-Forum' as Quelle
                FROM   forum1.users 
                WHERE  userlevel=9
                INTERSECT
                SELECT userid, username, lastlogin, 'B-Forum'
                FROM   forum2.users
                WHERE  userlevel=9
            

Zusammenfassung der SQL-SELECT-Abfrage-Elemente:


                SELECT [DISTINCT] Auswahlliste [AS Spaltenalias]
                FROM Quelle [ [AS] Tabellenalias]
                [WHERE Where-Klausel]
                [GROUP BY (Group-by-Attribut)+]
                [HAVING Having-Klausel]
                [ORDER BY (Sortierungsattribut [ASC|DESC])+];
            

Datensätze hinzufügen und ändern

INSERT INTO

Mit INSERT können Sie neue Datensätze hinzufügen:


                INSERT INTO ( [, weitere Spaltennamen])
                VALUES ( [, weitere Werte])
            

Beispiel:


                INSERT INTO Professor (PersNr, Name) 
                VALUES (21, 'Hastig')
            

Einfügen mehrerer Zeilen:


                INSERT INTO ( [, weitere Spaltennamen])
                SELECT  [, weitere Ausgaben]
                [FROM ...]
                [WHERE ...]
                [GROUP BY ...]
                [HAVING ...]
            

UPDATE

Mit UPDATE können Sie Werte innerhalb eines vorhandenen Datensatzes aktualisieren:


                UPDATE tabellen_name 
                SET tabellen_spalte = wert1 
                WHERE tabellen_spalte = wert2
            

Beachten Sie, dass ohne Angabe eines WHERE-Blocks alle Datensätze geändert werden.

DELETE

Mit DELETE können Sie Werte innerhalb eines vorhandenen Datensatzes löschen:


                DELETE FROM tabellen_name 
                WHERE spalten_name = wert
            

Beachten Sie, dass ohne Angabe eines WHERE-Blocks alle Datensätze gelöscht werden.

Tabellen erzeugen

In den vorhergehenden Kapiteln wurden bestehende Datenbanken ausgelesen und erweitert. Die Datenbanktabellen können mit Programmen wie phpMyAdmin oder auch mit SQL selbst angelegt werden.

Achtung! Das Löschen, aber auch das Anlegen von Tabellen kann (durch Überschreiben bestehender Tabellen) zu Datenverlust führen. Legen Sie regelmäßig Backups an!

CREATE TABLE


                CREATE TABLE tabellennamen
                (
                   Spaltenname1 datentyp1 [feldeinschränkung],
                   Spaltenname2 datentyp2 [feldeinschränkung],
                   [...]
                );
            

Wofür SQL?

Damit das DBMS mit der Datenbank kommunizieren kann, wird bei relationalen Datenbanken (also Datenbanken, die auf der relationalen Algebra aufbauen) SQL verwendet. Dabei bietet die Datenbanksprache SQL folgende drei wichtige Funktionalitäten:

Tabellen in der Datenbank

Eine relationale Datenbank ist eine Sammlung von Tabellen (den Relationen). Diese Tabellen haben Spalten und Zeilen.

Vorname Nachname Alter Wohnort
Leon Maier 18 München
Emma Maier 16 Paris
Max Mustermann 25 Berlin
Amir Schneider 17 München

Die Tabellen-Spalten werden als Attribute bezeichnet und sind durch ihren Namen klassifiziert. Eine Tabellen-Zeile ist ein Datensatz und wird auch Tupel genannt. Ein Wert in einem Feld der Tabelle wird Attributwert genannt.

Schlüssel in Datenbanken

Damit Tupel (Zeilen) in einer Relation (Tabelle) eindeutig identifiziert werden können, wird ein Schlüssel benötigt. Der Schlüssel besteht dabei aus einem/mehreren Attribut/en (Spalten). Die Attribute werden so gewählt, dass alle Attributwerte der Tupel über die zugehörigen Attribute eine einzigartige Kombination ergeben.

Vorname Nachname Alter Wohnort
Leon Maier 18 München
Emma Maier 16 Paris
Max Mustermann 25 Berlin
Amir Schneider 17 München

Ein (Primär-)Schlüssel muss dabei drei Anforderungen entsprechen:

Primärschlüssel

Die für den Schlüssel einer Tabelle ausgewählte Menge an Attributen wird Primärschlüssel genannt. Der Primärschlüssel muss die drei oben genannten Eigenschaften erfüllen. Um den Primärschlüssel in einer Tabelle zu kennzeichnen, werden die zum Schlüssel gehörigen Attribute unterstrichen:

Vorname Nachname Alter Wohnort
Leon Maier 18 München
Emma Maier 16 Paris
Max Mustermann 25 Berlin
Amir Schneider 17 München

In diesem Beispiel ist der Primärschlüssel aus den Attributen Vorname und Nachname zusammengesetzt. Dies ist zulässig, da in der Beispieltabelle jede Kombination aus Vorname und Nachname eindeutig ist! Aber Vorsicht: Wenn weitere Personen eingefügt werden, kann es jedoch passieren, dass die Kombination aus Vorname und Nachname nicht mehr eindeutig ist. Daher benutzt du hier am besten einen ...

Surrogatschlüssel (künstlicher Schlüssel)

Ein Surrogatschlüssel (auch künstlicher Schlüssel, synthetischer Schlüssel oder Ersatzschlüssel genannt) wird immer genau dann verwendet, wenn du nicht sicherstellen kannst, dass der Primärschlüssel immer eindeutig sein wird, egal welche Datensätze eingefügt werden. Ein Surrogatschlüssel ist daher meist eine fortlaufende künstlich angelegte Nummer, welche uns die Eindeutigkeit garantiert. Der Surrogatschlüssel ist somit ein spezieller Primärschlüssel, bestehend aus einem künstlich angelegten Attribut.

In diesem Beispiel könnte das so aussehen:

PersonenID Vorname Nachname Alter Wohnort
1 Leon Maier 18 München
2 Emma Maier 16 Paris
3 Max Mustermann 25 Berlin
4 Amir Schneider 17 München

Fremdschlüssel

Ein Fremdschlüssel ist ein Attribut, welches auf den Primärschlüssel einer anderen Tabelle verweist. Um den Fremdschlüssel zu kennzeichnen, wird dieser überstrichen:

PersonenID Vorname Nachname Alter Wohnort
1 Leon Maier 18 1
2 Emma Maier 16 2
3 Max Mustermann 25 1
4 Amir Schneider 17 2

Der Fremdschlüssel Wohnort aus der Tabelle Personen verweist dabei auf den Primärschlüssel StadtID der Tabelle Städte:

StadtID Name Einwohnerzahl Land
1 Berlin 3.600.000 Deutschland
2 Paris 2.100.000 Frankreich
3 München 1.400.000 Deutschland

Beispiel

Im folgenden Beispiel werden die Tabellen der Datenbank einer Schule betrachtet. Es gibt die Tabelle "Klassen" und die Tabelle "Lehrkräfte".

Klasse AnzahlSchueler Klassenleiter
7b 23 1
8a 21 4
10a 17 2
5c 18 3
Vorname Nachname Fach
David Hilbert Mathematik
Marie Curie Physik
Rosalind Franklin Biologie
Benjamin Franklin Physik

Die Aufgabe ist es, die Tabellen so anzupassen, dass sie in der Datenbank alle Anforderungen erfüllen. Dazu muss zunächst in beiden Tabellen ein Primärschlüssel festgelegt werden.

Klasse AnzahlSchueler Klassenleiter
7b 23 1
8a 21 4
10a 17 2
5c 18 3
LehrID Vorname Nachname Fach
1 David Hilbert Mathematik
2 Marie Curie Physik
3 Rosalind Franklin Biologie
4 Benjamin Franklin Physik

Jetzt haben beide Tabellen eindeutig definierte Primärschlüssel. Allerdings fällt auf, dass die Klassenleiter "Franklin" NICHT unterschieden werden können. Bei den Klassenleitern "Franklin" könnte es sich um "Rosalind Franklin" oder "Benjamin Franklin" handeln. Um dies zu vermeiden, muss das Attribut Kassenleiter als Fremdschlüssel definiert werden. Dieser Fremdschlüssel verweist auf den eindeutigen Primärschlüssel der Tabelle "Lehrkräfte" und ermöglicht die Unterscheidung, da der Primärschlüssel von Lehrkräfte wiederum eindeutig ist:

Klasse AnzahlSchueler Klassenleiter
7b 23 1
8a 21 4
10a 17 2
5c 18 3
LehrID Vorname Nachname Fach
1 David Hilbert Mathematik
2 Marie Curie Physik
3 Rosalind Franklin Biologie
4 Benjamin Franklin Physik

Jetzt sind beide Tabellen so angepasst, dass sie den Anforderungen entsprechen und in der Datenbank verwendet werden können.

SQL und Datenbanken

Bisher haben wir mit Python ohne SQL-Grundlagenwissen einfach Datenbankerstellung und Datenbankzugriffe durchgeführt. Dabei kamen wir bei verschiedenen Aktionen schnell an unsere Grenzen durch die fehlenden Grundlagenkenntnisse. Grundlagen haben Vorteile und bringen Sicherheit in die Anwendung und Nutzung von Datenbanken bzw. SQL. Wenn wir von SQL sprechen, sprechen wir von einem relationalem Datenbankmanagementsystem (RDBMS: Relational Database Management System). Flapsig gesagt: Daten stehen in einer Beziehung – einer Relation. Diese Beziehungen können ausgewertet und ausgegeben werden.

SQL: DDL, DML, DQL und DCL

SQL selber hat 4 große Bereiche:

ANSI-SQL

Hier der Begriff ANSI-SQL, damit man es mal gelesen hat und verorten kann. Das American National Standards Institut (ANSI) hat festgelegte Standards. Diese gibt es auch für SQL. Allerdings gibt es da über die Jahre mehrere verschiedene, da es bei SQL Verbesserungen und Erweiterungen gegeben hat.

MySQL, MariaSQL, Microsoft SQL Server (MSSQL), Oracle – verschiedene Datenbanksysteme

Es gibt verschiedene Datenbankserver, und am Anfang nutzt man eins, um in die Materie hineinzukommen.

Lustig am Rande: MySQL – die ersten 2 Buchstaben vom Namen der Datenbank kommen von dem Vornamen „My“. Diese ist die Tochter des MySQL-AB-Mitgründers Michael Widenius (Monty genannt). Die verschiedenen SQL-Server bieten im Kern die gleiche Funktion, die aber in der Nutzung leicht unterschiedlich sein kann, was hier am Anfang über das von uns benötigte Wissen hinausgeht.

Begriffe rund um SQL

SQL ist eine Anweisungssprache, keine Programmiersprache. Einzelne SQL-Befehle sind nicht case-sensitiv, aber es gibt Empfehlungen, Schlüsselwörter immer in Großbuchstaben zu verwenden. Leerzeichen, Tabulatoren und Zeilenumbrüche dürfen nach Belieben genutzt werden.

🔊