SQL-Tutorial
Die wichtigsten SQL-Befehle am Beispiel einer University-Datenbank
SQL ist "die" Datenbanksprache für relationale Datenbanken, standardisiert und weit verbreitet. Das SQL-Tutorial gibt eine kompakte Übersicht der wichtigsten und am meisten genutzten SQL-Befehle, gruppiert nach Einsatzbereich: Befehle zur Datenabfrage und Datenmanipulation (DML, data manipulation language), Befehle zur Definition von Datenbankobjekten (DDL, data definition language), und Befehle zur Kontrolle von Zugangsberechtigungen (DCL, data control language). Die Beispiele beziehen sich auf eine University-Datenbank, die die Daten über Studiengänge, Module, Studenten und Prüfungen in einer Universitätsumgebung verwaltet, und die als Datenhaltungsschicht für eine Webanwendung verwendet werden soll.
Motivation
SQL ist einfach aufgebaut und semantisch an die englische Umgangssprache angelehnt. Das Erlernen der Sprache wird zusätzlich dadurch erleichtert, dass viele Datenbankmanagementsysteme (DBMS) über grafische Benutzeroberflächen verfügen, die die Generierung von SQL-Skripten unterstützen und die dabei generierten SQL-Befehle optional auch anzeigen. SQL ist standardisiert, d.h. wenn man die Sprache beherrscht, kann man Datenbanken für verschiedene DBMS entwickeln: Microsoft SQL Server, MySQL /MariaDB, Oracle etc. Wir verwenden in diesem Tutorial als DBMS Microsoft SQL Server Express und MySQL. DBMS-abhängige Unterschiede werden als Hinweise hervorgehoben.Übersicht
Das Tutorial ist in fünf Abschnitte gegliedert, die die SQL-Syntax an einfachen Beispielen erklären und aufeinander aufbauen:
DML-Befehle: Datenabfrage und -Manipulation:
SELECT, INSERT, UPDATE, DELETEDDL-Befehle: Datenbankstruktur erstellen und ändern:
CREATE, ALTER, DROP, TRUNCATE,
Zu den Lernmaterialien gehört weiterhin ein YouTube Video, das die Erstellung einer Datenbank in SQL Server Management Studio erläutert, sowie ein SQL Quiz.
Vorbereitung: Ein DBMS installieren
Um SQL praktisch zu lernen, benötigt man ein Datenbankmanagentsystem (DBMS) und eine darin erstellte Datenbank, an der man die SQL-Syntax ausprobieren kann. Zunächst: Was ist ein Datenbankmanagentsystem und welches sollte man für den Einstieg wählen?
Ein Datenbankmanagentsystem ist ein Softwaresystem, das die Erstellung und Wartung von Datenbanken
ermöglicht. Zu der Funktionalität eines DBMS gehört die Erstellung von Datenbanken,
d.h. die Festlegung der Datenbankstruktur durch Tabellen, Integritätseinschränkungen und Datensichten, die
Datenbank-Manipulation, d.h. das Einfügen, Ändern, Löschen der Daten, das effiziente Abfragen der Datenbanken,
die Gewährleistung von Datensicherheit, Datenschutz und Datenintegrität und noch einiges mehr.
Die heute eingesetzten DBMS unterstützen die Erstellung von Datenbanken über die grafische Benutzeroberfläche,
so dass man eine Datenbank auch erstellen kann, ohne SQL zu kennen.
Zu den häufig eingesetzten DBMS zählen Oracle DBMS, MS SQL Server, MySQL, MariaDB, PostgreSQL.
Für den Einstieg eignen sich die DBMS SQL Server Express mit SQL Server Management Studio als
Benutzeroberfläche und MySQL bzw. MariaDB mit phpMyAdmin als Benutzeroberfläche, die wir auch
in diesem Tutorial verwenden. MySQL bzw. MariaDB wird von Einsteigern bevorzugt, da die Datenbankverwaltung mit phpMyAdmin
besonders intuitiv ist. SQL Server ist stark in Microsoft-Anwendungen verankert und bietet den Vorteil, dass man ein
DBMS lernt, das in der Enterprise-Version auch in vielen Unternehmen eingesetzt wird.
SQL Server
SQL Server ist ein kommerzielles DBMS von Microsoft, das in der Express-Version für Lehre und privaten Gebrauch kostenlos verwendet werden kann. SQL Server wird in vielen Unternehmen eingesetzt und die Verwendung der Express-Version ist ein guter Weg, um auf einem relativ einfachen Weg die Komplexität eines kommerziellen DBMS kennenzulernen. [SQLServer]
Die ersten Schritte bei der Erstellung einer Datenbank mit SQL Server Management Studio werden in dem folgenden Video gezeigt, insbesondere die Erstellung zweier Tabellen, die Festlegung von Primärschlüsseln mit Auto-Increment, die Verbindung der Tabellen durch Fremdschlüssel-Beziehungen.
MySQL / MariaDB
MySQL ist ein Open Source-DBMS, das vor allem bei Webapplikationen als Backend eingesetzt wird. MariaDB ist 2009 als eine Abspaltung aus MySQL entstanden und wird in Open-Source-Projekten als Ersatz für MySQL eingesetzt. Da MySQL und MariaDB sich in der Kernfunktionalität nicht wesentlich unterscheiden, wird bei der Benennung oft MySQL verwendet, auch wenn MariaDB gemeint ist. Für das Datenbankmanagement von MySQL bzw. MariaDB stehen zwei Tools zur Verfügung: phpMyAdmin als webbasierte Benutzeroberfläche und MySQL Workbench als Desktopanwendung.
Wir verwenden für Lern- und Testzwecke das Programmpaket XAMPP, dies ist eine Zusammenstellung von Programmen und Sprachen für Datenbank- und Webentwicklung. XAMPP enthält neben dem Apache Webserver auch MariaDB, PHP, Tomcat (...) und wird rein für Entwicklung und aus Sicherheitsgründen nicht im produktiven Betrieb eingesetzt. XAMPP sollte am besten im Ordner C:\XAMPP installiert werden. Es reicht, bei der Installation die Komponenten Apache Webserver, MySQL und PHP auszuwählen, die Installation selber dauert weniger als 10 Minuten.
XAMPP Control Panel
Webserver (Apache) und DBMS (mySQL) starten / stoppen / konfigurieren
phpMyAdmin wird als Teil von XAMPP automatisch mit installiert und wird aufgerufen, indem man im XAMPP Control Panel (xampp-control.exe) auf die Schaltfläche "Admin" neben MySQL klickt. Daraufhin öffnet sich die Benutzeroberfläche von phpMyAdmin als Webseite mit der URL http://localhost/phpmyadmin in Ihrem Default-Browser.

phpMyAdmin
Datenbanken verwalten und abfragen
Die komplette University-Datenbank für das Tutorial kann mit Hilfe der phpMyAdmin-Benutzeroberfläche angelegt werden, auch ohne SQL im Detail zu kennen. Grundlegende Konzepte über Datenbanken (Tabellen / Beziehungen, Datentypen, Integritätseinschränkungen) sollten allerdings bekannt sein.

Die Verwendung von phpMyAdmin für die Erstellung, Verwaltung und Abfrage von Datenbanken wird in dem Artikel Erste Schritte mit phpMyAdmin beschrieben.
SQL-Überblick
SQL ist eine deklarative Datenbanksprache, die das relationale Datenmodell umsetzt und den kompletten Lebenszyklus einer relationalen Datenbank unterstützt: Datendefinition (engl. data definition language, DDL), d.h. das Erstellen von Datenbanken und deren Strukturen, Datenmanipulation (engl. Data Manipulation Language, DML), d.h. das Einfügen, Ändern, Löschen und Abfragen von Daten, und Datenkontrolle (engl. Data Control Language, DCL), d.h. die Vergabe von Rechten an der Verwendung der Daten.
Im SQL-Sprachgebrauch werden für die Konzepte des relationalen Datenmodells folgende Bezeichnungen verwendet:
- Eine Datenbank ist eine logisch zusammenhängende Sammlung von Daten, die für einen bestimmten Zweck entworfen und mit Daten gefüllt und von einer bestimmten Benutzergruppe in Anwendungen verwendet wird. Relationale Datenbanken bestehen aus einer Menge Tabellen, deren Zustand stets konsistent sein muss, dies wird durch Integritätseinschränkungen sichergestellt.
- Eine Tabelle ist eine benannte Menge von Spalten bzw. Attributen, und entspricht einem Objekt der Realität. Man unterscheidet zwischen Tabellenstruktur (Relationsschema) und Tabelleninhalt (Relation). Beispiel: In die Tabellenstruktur STUDENT (ID, Name, Vorname, Matrikelnummer) kann man Studierenden-Daten speichern, der Tabelleninhalt ist dann z.B. STUDENT = {<1, Muster, Max, 12345>, <2, Test, Anna, 12346>}
- Eine Datensicht (engl. View) ist eine virtuelle Tabelle, bzw. eine Abfrage, die unter einem Alias-Namen gespeichert wird.
- Integritätseinschränkungen (engl. constraints) legen fest, welche Werte in dem relationalen Datenmodell zulässig sind und sichern damit die Datenintegrität der relationalen Datenbank. Einschränkungen sind Bedingungen, die die Datensätze für jeden gültigen Datenzustand erfüllen müssen und die ein DBMS bei jeder Update-Operation überprüft. Die wichtigesten Integritätseinschränkungen sind PRIMARY KEY (die Festlegung eines Primärschlüssels für eine Tabelle), FOREIGN KEY (die Festlegung einer Spalte als Fremdschlüssel, die JOIN-Beziehungen zwischen zwei Tabellen herstellt), NOT NULL (die Werte einer Spalte dürfen nicht leer sein), UNIQUE (die Werte einer Spalte müssen eindeutig sein).
Primärschlüssel werden zur eindeutigen Identifizierung von Datensätzen verwendet. Wird eine Spalte als Primärschlüssel einer Tabelle festgelegt, müssen die Werte dieser Spalte in der Tabelle einmalig sein.
Fremdschlüssel werden zur Aufteilung von Daten auf mehrere Tabellen verwendet, um so eine redundanzfreie normalisierte Datenbankstruktur zu erreichen. Studiengang-Informationen sollten nur in der Tabelle Studiengang eingepflegt werden, Studenten-Informationen nur in der Tabelle Student. Die Fremdschlüsselbeziehung Student.StudiengangID = Studiengang.ID legt fest, dass in der Spalte StudiengangID der Tabelle Student nur die Werte der Spalte ID aus der Tabelle Studiengang verwendet werden können. Der Studiengang des Studenten <ID:1, Name:Muster, Vorname:Max, Matrikelnr:12345, StudiengangID:3 > kann somit nur herausgefunden werden, indem man bei der Datenbankabfrage beide Tabellen berücksichtigt und mit der JOIN-Beziehung verbindet, wie im Beispiel SELECT-4.
SQL-Befehle lassen sich in drei Kategorien unterteilen:
- DDL-Befehle zur Definition des Datenbankschemas (Datenbankobjekt anlegen/CREATE, löschen/DROP, ändern/ALTER).
- DML-Befehle für den lesenden Zugriff (SELECT) und zur Datenmanipulation (Einfügen/INSERT, Löschen/DELETE, Ändern/UPDATE).
- DCL-Befehle für die Rechteverwaltung und Transaktionskontrolle: GRANT, REVOKE.
Jeder SQL-Befehl besteht aus Klauseln (Bestandteile), deren Reihenfolge im SQL-Standard fest vorgegeben ist.
Dazu gehören: Name des Befehls (z.B. SELECT), Angabe der Datenbankobjekte, Hinweise zur Ausführung und Optionen.
Für die Identifizierung eines Objektes in einer Datenbank wird die Punkt-Notation verwendet:
Datenbank.Schema.Tabelle.
Klauseln, die in [ ] stehen, sind optional und können entfallen.
Jeder SQL-Befehl wird mit einem Semikolon (;) beendet.
Kommentare werden mit -- (zwei Bindestrichen) oder mit /* und */ angegeben.
Verschiedene Datenbankmanagement-Systeme implementieren den SQL-Standard auf unterschiedliche Weise, daher existieren verschiedene SQL-Varianten. Der SQL-Standard legt z.B. eine Reihe von Datentypen für numerischen Werte, Zeichenketten, Datum und Uhrzeit etc. fest, die von den DBMS-Anbietern zum Teil auch unterschiedlich bezeichnet werden. Einige sind auch gleich, z.B. int als Datentyp für ganzzahlige Werte und varchar als Datentyp für Zeichenketten variabler Länge. Im Folgenden behandeln wir die wichtigsten DDL-, DML- und DCL-Befehle ein, die in allen DBMS verwendet werden können.
Die University-Datenbank
Als Beispiel dient eine Datenbank "University", die Daten über Studenten und Vorlesungen in einer Universitätsumgebung verwaltet.
Studiengänge haben einen Namen und eine Studiengangart.
Ein Student hat die Attribute Name, Vorname, Matrikelnummer, Semester und ist in genau einen Studiengang eingeschrieben.
Ein Modul hat die Attribute Name, Semester, CP, SWS und ist einem Studiengang zugeordnet, kann aber auch in anderen
Studiengängen verwendet werden.
Die Datenbank soll die Noten der Studierenden über mehrere Jahre hinweg speichern und Anfragen ermöglichen wie:
"Gebe die Noten aller Studierenden im Studiengang Elektrotechnik im Jahr 2019 aus,
gruppiert nach Prüfungen und aufsteigend sortiert nach Note."
"Gebe alle Noten eines bestimmten Studierenden aus."
"Gebe die Studierenden zurück, deren Noten in einem bestimmten Fach sehr gut sind."
Datenbankschema und Datenbankinhalt
Die Datenbank enthält vier Tabellen, die Objekten bzw. Entitäten entsprechen: Studiengang, Modul, Student und Prüfung, und zwei Tabellen, die Relationen zwischen den Entitäten entsprechen: Modul2Studiengang und Student2Prüfung. Jede Tabelle hat eine Spalte ID, die den eindeutigen Primärschlüssel der Datensätze speichert. Über diesen Primärschlüssel kann ein Datensatz von anderen Tabellen aus referenziert werden. Die Tabellen Student, Studiengang und Modul haben darüber hinaus ein Attribut Name, das jeweils den Namen des Studenten, des Studiengangs, bzw. des Moduls darstellt.
Der aktuelle Datenbankinhalt ("Snapshot") besteht aus vier Studiengängen, fünf Studenten, vier Modulen, fünf Prüfungen und den entsprechenden Zuordnungen, die über Fremdschlüsselbeziehungen abgebildet werden.
Die Note eines Studenten in einer Prüfung wird in der Tabelle Student2Prüfung gespeichert. Der Eintrag <1, 3, 1.7 > in dieser Tabelle bedeutet, dass der Student mit ID 1 in der Prüfung mit ID 3 die Note 1.7 erzielt hat.
Entity-Relationship-Diagramm
- Studiengang enthält die Daten der Studiengänge.
- Modul enthält die Liste der Module.
- Student wird die Daten der Studenten enthalten. Die Matrikelnummer muss eindeutig sein, daher erhält die Spalte die UNIQUE-Integritätseinschränkung
- Prüfung wird Daten der Prüfungen enthalten.
DML-Befehle
Daten abfragen mit SELECT
SELECT ist die Anweisung für Suchanfragen in einer relationalen Datenbank. Der SELECT-Befehl bietet die Funktionalität, Datensätze einer einzelnen Tabelle, mehrerer Tabellen oder auch Views abzufragen. Die Datensätze können optional sortiert und gruppiert werden. Suchanfragen verändern weder Datenbankschema noch Datenbankzustand, sie liefern lediglich eine Menge von Datensätzen zurück, die den Suchkriterien entsprechen. D.h. mit dem SELECT-Befehl kann man nichts kaputtmachen. Eine ungünstig formulierte SELECT-Anfrage kann jedoch länger dauern und damit die Datenbank beschäftigen.
Syntax
SELECT [DISTINCT] Attributliste FROM Tabellenliste
[WHERE Bedingungen] /* WHERE-Klausel */
[ORDER BY Spaltennamen]; /* Sortierklausel */
Wirkung
SELECT wählt aus der Tabelle Zeilen aus, die die angegebene Bedingung erfüllen und zeigt nur Spalten an, die der Attributliste entsprechen. Die in eckigen Klammern angegebenen Klauseln sind optional. Eine Suchabfrage über mehrere Tabellen muss mit entsprechenden JOIN-Bedingungen versehen werden. Die Spaltennamen und Tabellennamen können Alias-Namen erhalten, wie in Beispiel 4: Studiengang.Name AS StgName.
Beispiel SELECT-1
Gebe den kompletten Inhalt der Tabelle Studiengang aus, danach den Inhalt der Tabelle Student, danach das kartesische Produkt der beiden Tabellen. Die Angabe der Spalten in der SELECT-Anweisung kann weggelassen werden, wenn stattdessen ein * (asterisk) angegeben wird. In diesem Fall werden alle Attribute / Spalten aller Tabellen ausgegeben.
SQL-Abfrage: Gebe alle Studiengänge aus.
SELECT * FROM Studiengang;
Ergebnis-Tabelle
ID | Name | Art |
---|---|---|
1 | Elektrotechnik | Master |
2 | Elektrotechnik | Bachelor |
3 | Maschinenbau | Master |
4 | Maschinenbau | Bachelor |
SQL-Abfrage: Gebe alle Studenten aus.
SELECT * FROM Student;
Ergebnis-Tabelle
ID | Name | Vorname | Matrikelnr | StudiengangID | Semester |
---|---|---|---|---|---|
1 | Fischer | Jan | 12346 | 2 | 2 |
2 | Lang | Elke | 12347 | 1 | 2 |
3 | Weber | Michael | 12348 | 1 | 1 |
4 | Schuster | Thomas | 12349 | 2 | 1 |
5 | Muster | Max | 12345 | 3 | 1 |
Was bewirkt die folgende SQL-Abfrage?
SELECT * FROM Student, Studiengang;
Ergebnis-Tabelle: Das kartesische Produkt der Tabellen
Die Ergebnistabelle ist in diesem Fall das kartesische Produkt oder Kreuzprodukt der beiden Tabellen Student und Studiengang, deren Inhalt jeweils die Menge der "Studenten" bzw. der "Studiengänge" ist. Es wird jeder Datensatz der Tabelle Student mit jedem Datensatz der Tabelle Studiengang kombiniert. Die Ergebnistabelle wird insgesamt 5* 4 Datensätze enthalten, da wir 5 Studenten- und 4 Studiengang-Datensätze haben, wir zeigen jedoch nur die ersten 8 Zeilen an.
ID | Name | Vorname | Matrikelnr | StudiengangID | Semester | STGID | Studiengang | Art |
---|---|---|---|---|---|---|---|---|
1 | Fischer | Jan | 12346 | 2 | 2 | 1 | Elektrotechnik | Master |
1 | Fischer | Jan | 12346 | 2 | 2 | 2 | Elektrotechnik | Bachelor |
1 | Fischer | Jan | 12346 | 2 | 2 | 3 | Maschinenbau | Master |
1 | Fischer | Jan | 12346 | 2 | 2 | 4 | Maschinenbau | Bachelor |
2 | Lang | Elke | 12347 | 1 | 2 | 1 | Elektrotechnik | Master |
2 | Lang | Elke | 12347 | 1 | 2 | 2 | Elektrotechnik | Bachelor |
2 | Lang | Elke | 12347 | 1 | 2 | 3 | Maschinenbau | Master |
2 | Lang | Elke | 12347 | 1 | 2 | 4 | Maschinenbau | Bachelor |
Hinweis. Die Ausgabe des kartesischen Produktes zweier Tabellen ist meist unerwünscht. Das Ziel einer SELECT-Abfrage über mehrere Tabellen ist stets, aus den verschiedenen Tabellen die zueinander passenden Datensätze zu filtern, hier: zu jedem Studenten nur denjenigen Studiengang, in dem er zufolge der Fremdschlüssel-Spalte StudiengangID eingeschrieben ist. Dafür muss die SELECT-Abfrage um eine JOIN-Klausel erweitert werden, die auch direkt als Bedingung (hier: Student.StudiengangID = Studiengang.ID) in die WHERE-Klausel eingefügt werden kann.
Beispiel SELECT-2
Gebe eine Liste aller Studenten aus dem ersten Semester zurück, deren Name die Zeichenkette 'er' enthält, jedoch nur die angegebenen Spalten.
SQL-Abfrage
SELECT Name, Vorname, Matrikelnr FROM Student
WHERE Semester = 1 AND Name LIKE '%er%';
Ergebnis-Tabelle
ID | Name | Vorname | Matrikelnr | StudiengangID | Semester |
---|---|---|---|---|---|
3 | Weber | Michael | 12348 | 1 | 1 |
4 | Schuster | Thomas | 12349 | 2 | 1 |
5 | Muster | Max | 12345 | 3 | 1 |
Beispiel SELECT-3
Gebe alle verschiedenen Werte aus der Spalte SWS der Tabelle Modul zurück. Hier wird das DISTINCT-Schlüsselwort verwendet, um identische Werte auszuschließen.
SELECT DISTINCT SWS FROM Modul
WHERE StudiengangId = 1
Beispiel SELECT-4
Gebe eine Liste aller Studenten zurück, mit Angabe von Matrikelnummer, Name, Vorname und Art des Studiengangs.
Über die JOIN-Bedingung Student.StudiengangID= Studiengang.ID finden wir zu jedem Studenten Name und Art des Studiengangs.
Die Spalten StudiengangID und ID werden hier nur für die JOIN-Bedingung verwendet und nicht ausgegeben, da sie
für den Nutzer der Anwendung nicht relevant sind.
Hier verwenden wir für die Spalte Studiengang.Name den Alias Studiengang, Studiengang.Name AS Studiengang,
um sie von der gleichnamigen Spalte der Tabelle Student zu unterscheiden.
SELECT Matrikelnr, Student.Name, Vorname, Studiengang.Name AS Studiengang, Art
FROM Student, Studiengang
WHERE Student.StudiengangID= Studiengang.ID;
Ergebnis-Tabelle
Name | Vorname | Matrikelnr |
---|---|---|
Muster | Max | 12345 |
Schuster | Thomas | 12349 |
Weber | Michael | 12348 |
SELECT mit JOIN-Klausel
Eine SELECT-Anweisung über mehrere Tabellen kann die JOIN-Bedingungen entweder in der WHERE-Klausel enthalten wie in Beispiel 4 oder sie mit Hilfe einer expliziten JOIN-Klausel verknüpfen. Man unterscheidet verschiedene Arten von JOIN-Typen: INNER JOIN, LEFT JOIN, RIGHT JOIN, OUTER JOIN.
- Ein INNER JOIN liefert nur diejenigen Datensätze, die passende Werte in beiden Tabellen haben.
- Ein LEFT JOIN liefert alle Datensätze der linken Tabelle und nur diejenigen Datensätze der rechten Tabelle, die der JOIN-Bedingung nach passen.
- Ein RIGHT JOIN liefert alle Datensätze der rechten Tabelle und nur diejenigen Datensätze der linken Tabelle, die der JOIN-Bedingung nach passen.
- Ein FULL OUTER JOIN liefert alle Datensätze beider Tabellen, wobei bei den Datensätzen ohne entsprechende Werte NULL eingetragen wird.
Syntax
SELECT Attributliste FROM Tabelle
INNER JOIN Tabelle2 ON Join-Bedingung
WHERE Auswahl-Bedingung
Beispiel JOIN-1
Gebe eine Liste aller Studenten zurück, mit Angabe von Matrikelnummer, Name, Vorname und Art des Studiengangs.
SELECT Matrikelnr, Student.Name, Vorname, Studiengang.Name AS StgName, Art
FROM Student INNER JOIN Studiengang ON Student.StudiengangID= Studiengang.ID;
Beispiel JOIN-2
Gebe eine Liste aller Studiengänge mit den dazugehörenden Studenten zurück, mit Angabe von Matrikelnummer, Name, Vorname, sortiert nach Name des Studiengangs und Name und Vorname des Studierenden. Es sollen auch diejenigen Studiengänge ausgegeben werden, die keine Studierenden enthalten.
SELECT Studiengang.Name AS StgName, Art, Matrikelnr, Student.Name, Vorname
FROM Studiengang LEFT JOIN Student ON Student.StudiengangID= Studiengang.ID
ORDER BY StgName, Name, Vorname ASC;
SELECT mit Unterabfragen
Um eine Suchanfrage auszuführen, benötigt man häufig Werte, die man nicht direkt kennt, sondern vorher durch andere Anfragen herausfinden muss. Z.B. Finde alle Studenten, die eine bestimmte Prüfung geschrieben haben. Um diese Suchanfrage stellen zu können, muss man zunächst die ID der Prüfung herausfinden. Für diesen Fall hat SQL vorgesehen, dass man eine SELECT-Anweisung in eine andere SELECT-Anweisung einbetten kann.
Beispiel
Gebe eine Liste der Studierenden zurück, die die Prüfung "Datenbanken" im Jahr 2019 geschrieben haben, mit Angabe des Modulnamens, des Jahres und der Note. Dieser SELECT verknüpft 4 Tabellen miteinander. Die ID der Prüfung wird über eine Unterabfrage herausgefunden, die die Tabellen Prüfung und Modul verknüpft.
SQL-Abfrage
SELECT S.Name, S.Vorname, S.Matrikelnr, M.Name AS Modulname, P.Jahr, SP.Note
FROM Student AS S, Modul AS M, Prüfung As P, Student2Prüfung As SP
WHERE (M.ID = P.ModulID) -- JOIN Modul - Prüfung
AND (SP.StudentID = S.ID) -- JOIN Student2Prüfung - Student
AND (SP.PrüfungID = P.ID) -- JOIN Student2Prüfung - Prüfung
AND SP.PrüfungID = -- Auswahlbedingung: PrüfungID
(SELECT P.ID FROM Prüfung AS P, Modul AS M -- Unterabfrage
WHERE P.ModulID = M.ID
AND M.Name LIKE 'Datenbank%' AND P.Jahr = 2019)
Ergebnis-Tabelle
SELECT mit GROUP BY-Klausel
Die GROUP BY-Klausel wird verwendet, um Zeilen der Ergebnisliste zu gruppieren. Die Gruppierung geschieht in Zusammenhang mit einer Aggregatsfunktion, die für die gruppierten Werte einen neuen Einzelwert berechnet.
Syntax
SELECT Attributliste FROM Tabellenliste
[WHERE Bedingung] GROUP BY Attribut1, Attribut2,…
[ORDER BY Attribut1, Attribut2, …];
Beispiel
Gebe Anzahl der Studenten aus, gruppiert nach Art des Studiengangs.
SELECT STG.ArtAS StudiengangArt, COUNT(S.ID) AS AnzahlStudierende
FROM Student AS S, Studiengang AS STG
WHERE S.StudiengangID= STG.ID GROUP BY STG.Art;
Datensätze einfügen: INSERT
INSERT ist die Anweisung zum Einfügen neuer Datensätze in eine Tabelle.
Syntax
INSERT INTO Tabelle [ (Attributliste)] VALUES (Werteliste);
Wirkung
INSERT schreibt in die angegebene Tabelle und die angegebenen Attribute der Tabelle die angegebenen Werte, wobei Anzahl, Reihenfolge und Datentyp der Werte mit denen der Attribute übereinstimmen muss. Die Attributliste kann weggelassen werden. Wenn jedoch keine Attribute angegeben werden, müssen in der Werteliste die Werte für alle Attribute der Tabelle in der richtigen Reihenfolge angegeben werden. Falls Integritätseinschränkungen verletzt werden, wird der Datensatz nicht eingefügt und es wird eine Fehlermeldung angezeigt.
Beispiel INSERT-1
Füge den Datensatz Bart Simpson in die Tabelle Student ein. Die Spaltennamen werden explizit angegeben, d.h. als Name wird Bart eingetragen, als Vorname Simpson etc.
INSERT INTO Student (Name, Vorname, Matrikelnr, StudiengangID, Semester) VALUES('Bart', 'Simpson', 12349, 3, 4);
Beispiel INSERT-2
Füge den Datensatz Bart Simpson in die Tabelle Student ein. Die Spaltennamen werden nicht angegeben, sondern der erste Wert wird in die erste Spalte der Tabelle eingetragen, der zweite Wert in die zweite Spalte der Tabelle etc.
INSERT INTO Student VALUES('Bart', 'Simpson', 12349, 3, 4);
Hinweis:
Der Wert für die Spalte ID muss dann nicht angegeben werden, wenn der Primärschlüssel ID mit
eine Auto-Inkrement angelegt wird.
In MySQL geschieht das mit dem Schlüsselwort AUTO_INCREMENT, im SQL Server mit der IDENTITY-Klausel:
[ID] [int] IDENTITY(1,1) NOT NULL
IDENTITY(1,1) bedeutet, dass bei Einfügen durch das DBMS automatisch ein neuer Schlüssel generiert wird, der den Schlüssel des zuletzt eingefügten Datensatzes um 1 inkrementiert. Der automatisch generierte Schlüssel kann mit dem RESEED-Befehl zurückgesetzt werden:
DBCC CHECKIDENT ('[Student]', RESEED, 3);
Datensätze ändern: UPDATE
UPDATE ist die Anweisung zum Ändern von Datensätzen aus einer Tabelle.
Syntax
UPDATE Tabelle
SET Attribut1=Wert1, Attribut2=Wert2,…Attributn=Wertn
[WHERE Bedingung];
Wirkung
UPDATE aktualisiert in der angeführten Tabelle alle Datensätze, die die Bedingung erfüllen. Die SET-Klausel enthält kommagetrennte Zuweisungen der Form Attribut = Wert. Die WHERE-Klausel ist optional. Wird sie weggelassen, so werden alle Datensätze der Tabelle aktualisiert.
Beispiel UPDATE-1
Ändere Namen des Studenten 'Mustermann' um in 'Muster', und seinen Vornamen in 'Horst'.
UPDATE Student
SET Name = 'Muster', Vorname = 'Horst'
WHERE Name = 'Mustermann';
Beispiel UPDATE-2
Setze das Semester aller Studenten die im 6ten Semester sind um 1 hoch.
UPDATE Student SET Semester = 7
WHERE Semester = 6;
Datensätze löschen: DELETE
DELETE ist die Anweisung zum Löschen von Datensätzen aus einer Tabelle.
Syntax
DELETE FROM Tabelle
[ WHERE Bedingung ] ;
Wirkung
DELETE löscht aus der angeführten Tabelle alle Datensätze, die die Bedingung erfüllen. Die WHERE-Klausel ist optional. Wird sie weggelassen, so wird der komplette Inhalt der Tabelle gelöscht.
Beispiel
Lösche die Studenten, deren Name Mustermann ist.
DELETE FROM Student
WHERE Name = 'Mustermann';
DDL-Befehle
Die DDL-Befehle CREATE, DROP, ALTER werden verwendet, um Datenbankobjekte zu erstellen, zu ändern oder zu löschen. Ein Datenbankobjekt ist: die Datenbank selber, ein Schema, eine Tabelle, eine View / Sicht oder ein Constraint (Primärschlüssel, Fremdschlüssel, UNIQUE-Constraint, NOT NULL-Constraint).
CREATE-Befehle
Mit den CREATE-Befehlen erzeugt man die Struktur von Datenbanken, d.h. die Datenbank selber, Tabellen, Sichten, Datenbank-Constraints etc. Die CREATE-Befehle sind nicht durchgehend standardisiert, so dass es hier DBMS-abhängige Besonderheiten gibt. Z.B. speichert MySQL die Namen der Datenbankobjekte per Default in Kleinschreibung. Um großgeschriebene Tabellennamen zu ermöglichen, muss dies in der Konfigurationsdatei my.ini eingestellt werden.
Datenbank erstellen: CREATE DATABASE
Der CREATE DATABASE-Befehl erzeugt eine neue leere Datenbank mit Default-Optionen. Dabei wird die physische Datenbankdatei in dem Zugriffspfad des DBMS angelegt. Gleichzeitig mit der Datenbank wird eine zugehörige Transaktions-Log-Datei angelegt.
Syntax
CREATE DATABASE Datenbank;
Beispiel: University-Datenbank erstellen
CREATE DATABASE University;
Tabelle erstellen: CREATE TABLE
CREATE TABLE ist der Befehl zum Erstellen einer neuen Tabelle. Ehe eine Tabelle angelegt wird, sollte die Datenbank mit dem Befehl USE Datenbank ausgewählt werden, in unserem Fall: USE University. Ansonsten wird die Tabelle in derjenigen Datenbank angelegt, die im Skriptfenster zuletzt aktiv verwendet wurde.
Syntax
CREATE TABLE Tabelle1 (Attribut+ [PRIMARYKEY]
[, CONSTRAINT FK_NAME FOREIGN KEY ( Attribut+ ) REFERENCES Tabelle2 ( Attribut+ )] );
Wirkung
Beim Erstellen werden Tabellenname, Attribute/Spalten und optional auch Constraints (Primärschlüssel, Fremdschlüssel, NOT NULL) angegeben. Die FOREIGN KEY-Klausel legt auch fest, welche Aktionen im Falle einer Integritätsverletzung durch Update-Operationen erfolgen sollen. Drei Optionen sind möglich: SET DEFAULT, SET NULL oder CASCADE.
Beispiel
Erzeuge eine Tabelle Student mit den Spalten ID, Name, Vorname, Matrikelnr, StudiengangID, Semester.
CREATE TABLE Student(
ID int NOT NULL PRIMARY KEY,
Name varchar(255) NOT NULL,
Vorname varchar(255) NOT NULL,
Matrikelnr int UNIQUE,
StudiengangID int NOT NULL,
Semester int NULL,
CONSTRAINT FK_StudentStudiengang FOREIGN KEY (StudiengangID) REFERENCES Studiengang(ID) );
Sicht (engl. View) erstellen: CREATE VIEW
Mit Hilfe des CREATE VIEW-Befehls können die Ergebnisse einer SELECT-Abfrage als Datensicht gespeichert werden.
Syntax
CREATE VIEW View_Name AS Select_Abfrage
Beispiel
Erzeuge eine Datensicht mit dem Namen Studenten_ET, die alle Studenten anzeigt, die Elektrotechnik studieren.
CREATE VIEW Studenten_ET AS
SELECT Matrikelnr, Student.Name, Vorname, Studiengang.Name AS StgName, Art FROM Student, Studiengang
WHERE Student.StudiengangID = Studiengang.ID
AND StgName LIKE '%Elektrotechnik%';
Datenbank ändern: ALTER Database
ALTER DATABASE ist der Befehl zum Ändern einer Datenbank. Der Befehl ist kein SQL Standard, wird jedoch von den meisten DBMS verwendet, allerdings in unterschiedlichen Ausprägungen. In SQL Server kann der ALTER DATABASE-Befehl verwendet werden, in MySQL nicht, hier ist das Umbenennen einer Datenbank aufwendiger.
Syntax (SQL Server)
ALTER DATABASE Datenbank MODIFY NAME = Neuer Name
[Optionen];
Tabelle ändern: ALTER TABLE
ALTER TABLE ist der Befehl zum Ändern einer Tabelle. Der Befehl wird verwendet, um einer Tabelle nachträglich Spalten oder Constraints hinzuzufügen.
Syntax
ALTER TABLE Tabelle ADD (Spaltenname Datentyp);
[Optionen];
Beispiel
Füge eine Spalte VorgesetzterID zu der Tabelle Mitarbeiter hinzu, und lege einen Fremdschlüssel auf diese Spalte. Die Spalte wird für jeden Mitarbeiter die ID des Vorgesetzten speichern, falls vorhanden.
ALTER TABLE Mitarbeiter
ADD VorgesetzterID int
ALTER TABLE Mitarbeiter
ADD CONSTRAINT FKMitarbeiterVorgesetzter FOREIGN KEY(VorgesetzterID) REFERENCES Mitarbeiter(ID)
DROP-Befehle
Mit den DROP-Befehlen löscht man Datenbanken, Tabellen, Sichten etc.
Datenbank löschen: DROP DATABASE
Syntax
DROP DATABASE Datenbank;
Tabelle löschen: DROP TABLE
Syntax
DROP TABLE Tabelle;
Tabelle endgültig löschen: TRUNCATE TABLE
TRUNCATE TABLE ist ein DDL-Befehl zum kompletten Löschen des Inhalts einer Tabelle, ähnlich wie DELETE ohne WHERE-Klausel. Im Unterschied zu DELETE setzt TRUNCATE TABLE den kompletten Inhalt plus einige Definitionseigenschaften der Tabelle zurück, und wird daher als DDL-Befehl bezeichnet. Weiterhin wird kein Transaktionsprotokoll für diese Aktion erstellt. Dies hat zur Folge, dass TRUNCATE TABLE gerade bei großen Tabellen mit vielen Datensätzen der effizientere Befehl ist, jedoch können die Änderungen nicht rückgängig gemacht werden.
TRUNCATE TABLE kann nicht verwendet werden, falls auf die Tabelle mit einer FOREIGN KEY-Einschränkung verwiesen wird.
Syntax
TRUNCATE TABLE Tabelle;
Beispiel
TRUNCATE TABLE Mitarbeiter;
DCL-Befehle
Die DCL-Befehle GRANT und REVOKE werden für das Erteilen und Entziehen von Berechtigungen verwendet. Die Berechtigungen sind eine kommagetrennte Liste von Datenbankoperationen, z.B. "INSERT, UPDATE, DELETE", es kann auch das Schlüsselwort "ALL" verwendet werden, um alle Berechtigungen zu erteilen / entziehen. Da die meisten DBMS das Erteilen und Entziehen von Berechtigungen über die Benutzeroberfläche ermöglichen, werden die DCL-Befehle seltener eingesetzt und hier nur kurz behandelt.
GRANT
Mit Hilfe des GRANT-Befehls können Berechtigungen auf Datenbankobjekte an Benutzer oder Rollen erteilt werden. Die Option WITH GRANT OPTION bedeutet, dass der Benutzer seinerseits die Berechtigung an andere weitergeben kann.
Syntax
GRANT Berechtigungen ON Datenbankobjekt
TO {Benutzer |PUBLIC |Rolle}
[WITH GRANT OPTION];
Beispiel 1
Erteile dem Benutzer localuser1 das Recht, Tabellen in der Datenbank University zu erstellen.
USE University;
GRANT CREATE TABLE TO localuser1;
Beispiel 2
Erteile dem Benutzer localuser2 das Recht, die Tabelle Student abzufragen sowie Daten einzufügen, zu ändern und zu löschen.
GRANT SELECT, INSERT, UPDATE, DELETE ON Student TO localuser2;
REVOKE
Mit Hilfe des REVOKE-Befehls können Berechtigungen auf Datenbankobjekte den Benutzern oder Rollen entzogen werden.Syntax
REVOKE Berechtigungen FROM {Benutzer |PUBLIC |Rolle}
Beispiel
Entziehe dem Benutzer localuser1 das Recht, Tabellen in der Datenbank University zu erstellen.
USE University; REVOKE CREATE TABLE FROM localuser1;
Tools, Quellen und weiterführende Links
Tools:
Quellen und weiterführende Links:
- W3Schools SQL Tutorials: https://www.w3schools.com/sql/
- MySQL SQL-Referenz: https://dev.mysql.com/doc/refman/8.0/en/sql-statements.html
- SQL-Quiz: /tutorial/sqlquiz/