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 Daten­manipulation (DML, data manipulation language), Befehle zur Definition von Datenbank­objekten (DDL, data definition language), und Befehle zur Kontrolle von Zugangs­berechtigungen (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äts­umgebung verwaltet, und die als Datenhaltungs­schicht 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 Datenbank­management­systeme (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:

  1. SQL-Überblick

  2. Vorbereitung: DBMS installieren

  3. University-Datenbank

  4. DML-Befehle: Datenabfrage und -Manipulation:
    SELECT, INSERT, UPDATE, DELETE

  5. DDL-Befehle: Datenbankstruktur erstellen und ändern:
    CREATE, ALTER, DROP, TRUNCATE,

  6. DCL-Befehle: GRANT, REVOKE

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 Daten­bank­managent­system (DBMS) und eine darin erstellte Datenbank, an der man die SQL-Syntax ausprobieren kann. Zunächst: Was ist ein Daten­bank­managent­system und welches sollte man für den Einstieg wählen?

Ein Daten­bank­managent­system 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äts­einschrä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 Kern­funktionalitä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.

XAMPP Control Panel

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.

phpMyAdmin - University Datenbank

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 Datenbank­management-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
1ElektrotechnikMaster
2ElektrotechnikBachelor
3MaschinenbauMaster
4MaschinenbauBachelor
SQL-Abfrage: Gebe alle Studenten aus.
SELECT * FROM Student;
Ergebnis-Tabelle
ID Name Vorname Matrikelnr StudiengangID Semester
1FischerJan1234622
2LangElke1234712
3WeberMichael1234811
4SchusterThomas1234921
5MusterMax1234531
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
1FischerJan12346221ElektrotechnikMaster
1FischerJan12346222ElektrotechnikBachelor
1FischerJan12346223MaschinenbauMaster
1FischerJan12346224MaschinenbauBachelor
2LangElke12347121ElektrotechnikMaster
2LangElke12347122ElektrotechnikBachelor
2LangElke12347123MaschinenbauMaster
2LangElke12347124MaschinenbauBachelor

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
3WeberMichael1234811
4SchusterThomas1234921
5MusterMax1234531

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
MusterMax12345
SchusterThomas12349
WeberMichael12348


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:

  1. SQL Server 2019 Express + SQL Server Management Studio
  2. MySQL
  3. XAMPP

Quellen und weiterführende Links:

  1. W3Schools SQL Tutorials: https://www.w3schools.com/sql/
  2. MySQL SQL-Referenz: https://dev.mysql.com/doc/refman/8.0/en/sql-statements.html
  3. SQL-Quiz: /tutorial/sqlquiz/