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:
- SELECT: Zum Abfragen von Daten aus einer Tabelle.
- INSERT: Zum Einfügen von neuen Daten in eine Tabelle.
- UPDATE: Zum Aktualisieren von vorhandenen Daten in einer Tabelle.
- DELETE: Zum Löschen von Daten aus einer Tabelle.
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:
- Vergleichsoperatoren: Mit
<, <=, =, <>, >=, >
können Vergleichsbedingungen in der WHERE-Klausel formuliert werden. - Logische Operatoren: Mit
AND, OR, NOT
können logische Bedingungen in der WHERE-Klausel formuliert werden. - Between-Operator: Der BETWEEN-Operator wird für Bereichsvergleiche verwendet.
- Like-Operator: Mit dem LIKE-Operator können Muster für String-Vergleiche erstellt werden.
- In-Operator: Der IN-Operator hilft, wenn Sie eine Liste von Kriterien für gesuchte Daten haben.
- IS-Operator: Der IS-Operator wird verwendet, um nach NULL-Werten zu suchen.
- Distinct-Operator: Mit DISTINCT können doppelte Einträge aus den Ergebnissen entfernt werden.
- As-Operator: Mit dem AS-Operator können Sie berechneten Ergebnisspalten Namen zuweisen.
Sortierung und Begrenzung
Sie können die Reihenfolge der Abfrageergebnisse steuern und die Ergebnismenge begrenzen:
- Order By: Der ORDER BY-Operator wird verwendet, um Ergebnisse nach bestimmten Kriterien zu sortieren.
- Limit: Der LIMIT-Operator beschränkt die Anzahl der zurückgegebenen Datensätze.
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
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 erzeugen
- Einträge in Tabellen bearbeiten
- Datensätze abfragen
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:
- Eindeutigkeit: Ein Schlüssel muss so gewählt sein, dass jedes Tupel der Tabelle eindeutig identifiziert wird.
- Minimalität: Die Anzahl an Attributen für einen Schlüssel muss möglichst klein sein. Der Schlüssel darf also keine unnötigen Attribute enthalten.
- Definiertheit: Ein jeder Attributwert der zum Schlüssel gehörigen Attribute muss für alle Tupel definiert sein. Einträge, die in Schlüsselspalten stehen, dürfen also nicht leer sein.
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:
-
DDL: Data Definition Language
Bevor wir ein Datenbanksystem nutzen können, müssen wir erst unsere Datenbank mit deren Tabellen einrichten. Auf gut Deutsch: welche Felder gibt es und wie nennen wir diese, damit wir komfortable wieder darauf zugreifen können. Wir definieren also unsere Daten bzw. Datenfelder und können die gewünschte Struktur über eine SQL-Anweisung in der Datenbank erzeugen. Ohne eine Datenbank und Daten können wir auch nicht die folgenden Bereiche nutzen wie die Datenbank mit Daten zu füllen bzw. auszuwerten.
-
DML: Data Manipulation Language
Nachdem wir unsere gewünschte Struktur über die DDL erstellt haben, wollen wir Daten in unser Datenbanksystem hineinschreiben, ändern und löschen können. Genau das macht man mit der DML.
-
DQL: Data Query Language
Auslesen der Datenbank auch mit bestimmten Bedingungen (man will ja nicht immer alle Daten). Hier können auch mehrere Tabellen miteinander verknüpft werden und daraus das Ergebnis ausgegeben werden.
-
DCL: Data Control Language
Nicht jeder darf auf alle Daten zugreifen. Daher ergibt es Sinn, hier eine Kontrolle einzubauen. Zur DCL gehört auch die Transaktionssteuerung, damit es auch sichergestellt ist, dass alle Änderungen bzw. Aktionen in der Datenbank stattfinden.
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.