Datenbanken begegnen uns in unserer digitalen Welt ständig, oft ohne dass wir es merken. Hinter praktisch jeder Website steckt eine Datenbank, die die Daten der Website speichert (z.B. die Produktdetails von Amazon, die Lieddetails von Spotify, die Videodetails von Youtube, etc.).
Aber auch sogut wie alle Behördendaten liegen in großen Datenbanken: Die Daten vom Einwohnermeldeamt einer Gemeinde, die Schülerdaten einer Schule, …
Eine Datenbank speichert einzelne Datensätze in Tabellen. Die Datenbank der Gringotts-Bank aus Harry Potter könnte (sehr vereinfacht) in etwa so aussehen:
Hierbei ist besteht Datenbank aus den beiden Tabellen Konten
und Mitarbeiter
. Jede der beiden Tabellen hat einzelne Datensätze, z.B. ist der Datensatz 1, Harry Potter, 1000
ein Datensatz der Tabelle Konten und 3, William Weasley
ein Datensatz der Tabelle Mitarbeiter.
Lest die Grundlagen zu Datenbanksystemen und zu relationalen Datenbanken und beantwortet die folgenden Fragen in eurem Gruppendokument:
- Was ist der Unterschied zwischen Datenbank, Datenbankmanagementsystem und Datenbanksystem?
- Wozu braucht man ein Datenbanksystem und welche Anforderungen werden an ein Datenbanksystem gestellt?
- Was genau ist eine relationale Datenbank und welche anderen Typen von Datenbanksystemen gibt es?
Um auf eine Datenbank und die darauf gespeicherten Daten zugreifen zu können, wird eine so genannte strukturierte Abfragesprache (Structured Query Language, kurz SQL) benötigt. Diese besteht aus vier Komponenten1):
- Die Datendefinitionssprache (Data Definition Language, kurz DDL) ist für die Definition der Datenstruktur in einer Datenbank zuständig.
CREATE TABLE Accounts (ID INT, Name TEXT); ALTER TABLE Accounts ADD Balance INT; DROP TABLE Accounts;
- Die Datenmanipulationssprache (Data Manipulation Language, kurz DML) ist für das Hinzufügen, Bearbeiten oder Löschen von Daten in einer Datenbank zuständig.
INSERT INTO Accounts VALUES (1, 'john.doe', 10000); UPDATE Accounts SET Balance = Balance + 100 WHERE ID = 1; DELETE FROM Accoutns WHERE ID = 1;
- Die Datenabfragesprache (Data Query Language, kurz: DQL) ist für das Lesen oder Abfragen von Daten aus einer Datenbank zuständig.
SELECT * FROM Accounts;
- Die Datenkontrollsprache (Data Control Language, kurz DCL) ist für die administrativen Aufgaben zur Steuerung der Datenbank selbst zuständig ist, insbesondere für die Erteilung und den Entzug von Datenbankberechtigungen für Benutzer.
GRANT SELECT ON Accounts TO USER@db-server.com; REVOKE SELECT ON Accounts FROM USER@db-server.com;
Die gesamte Menge aller SQL-Befehle ist sehr komplex. Zunächst kümmern wir uns nur darum, Daten von bereits bestehende Datebanken auslesen zu können. Wir beschäftigen uns also erstmal nur mit der DQL. In den weiteren Lektionen werden wir dann auch noch die Daten in Datenbanken mit der DMLverändern und später sogar eigene Datenbanken mit der DDL erstellen. Die DCL werden wir im Grundkurs weg lassen.
Öffne die Chinook-Datenbank in einem neuen Browserfenster neben diesem Fenster mit den Aufgaben. So kannst du die Befehle unten direkt in der Datenbank ausprobieren!
- Klappe das Datenbank-Schema auf und klicke auf nacheinander auf ein paar Tabellen-Namen.
- So werden die passenden DQL-Befehle direkt in den Abfrage-Editor eingegeben und direkt ausgeführt.
- Unten kannst du die Abfrageergebnisse anschauen.
- Verschaffe dir so einen Überblick über die Chinook-Datenbank. Was für Daten beinhaltet sie? Wozu dient die Chinook-Datenbank?
Die einfachste Art von DQL-Befehlen sind solche, die einfach alle Datensätze einer Tabelle anzeigen.
SELECT * FROM artists
SELECT title FROM albums
DQL-Befehle bestehen immer mindestens aus einer SELECT
- und einer FROM
-Klausel:
- Mit der
SELECT
-Klausel gibt man an, welche Spalten einer Tabelle man angezeigt bekommen möchte. Sollen es alle sein, kann man einfach ein*
einsetzen. - Mit der
FROM
-Klausel gibt man an, aus welcher Tabelle man die Datensätze auslesen möchte.
Mit dem DISTINCT
-Operator sorgt man in der SELECT
-Klausel dafür, dass in der Ergebnistabelle keine Einträge mehrfach vorkommen. Vergleiche die Ergebnisse der drei Abfragen:
SELECT * FROM tracks
SELECT unitprice FROM tracks
SELECT DISTINCT unitprice FROM tracks
Das ist aber oft sehr umständlich. Was, wenn man nun aber seine Suche genauer spezifizieren möchte? Hierfür muss man die Daten filtern, also einzelne Datensätze / Zeilen auswählen. Hierfür wird die WHERE
-Klausel am Ende ergänzt:
- Mit den Operatoren
<
,<=
,=
,<>
,>=
und>
kann man Vergleichsbedingungen in derWHERE
-Klausel formulieren.SELECT * FROM artists WHERE artistid = 88;
SELECT * FROM invoices WHERE total > 20
SELECT * FROM employees WHERE HireDate > '2003-01-01'
- Mit den Operatoren
AND
,OR
undNOT
kann man logische Bedingungen in derWHERE
-Klausel formulieren.SELECT * FROM employees WHERE HireDate > '2003-01-01' AND City = 'Calgary'
SELECT * FROM employees WHERE HireDate > '2003-01-01' AND City = 'Calgary' AND NOT Title = 'IT Manager'
- Für Bereichsvergleiche verwendet man den
BETWEEN
-Operator.SELECT * FROM invoices WHERE InvoiceDate BETWEEN '2010-01-01' AND '2010-02-01'
- Mit dem
LIKE
-Operator kann man Muster für Text-Vergleiche benutzen. Das Prozentzeichen%
steht für eine beliebige Folge von Zeichen, während der Unterstrich_
für ein einziges beliebiges Zeichen steht:SELECT * FROM albums WHERE title LIKE '%Disc _%'
- Hat man eine ganze Liste von Kriterien für die gesuchten Daten, so kann der
IN
-Operator weiter helfen. Das geht auch in Kombination mitNOT
.SELECT * FROM customers WHERE customerid IN (5, 44, 49)
- Wenn beim Einfügen von Daten in eine Datenbanktabelle ein Wert noch nicht bekannt ist, so wird dieser mit dem sogenannten
NULL
-Wert belegt. SolcheNULL
-Werte kann man mit demIS
-Operator finden. Das geht auch in Kombination mitNOT
.SELECT * FROM tracks WHERE composer IS NULL;
In der SELECT
-Klausel können mit den Grundrechenarten (+, -, *, /) Berechnungen durchgeführt werden. Den berechneten Ergebnisspalten kannst Du mit dem AS
-Operator Bezeichnungen geben.
SELECT Name, Milliseconds, Milliseconds / 1000.0 AS Seconds, Bytes, Bytes / 1000.0 AS Kilobytes FROM tracks
Will man seine Ergebnisse nach bestimmten Kriterien sortiert ausgegeben haben, so setzt man den ORDER BY
-Operator ein. Standardmäßig werden Texte in alpabetischer Reihenfolge von A bis Z sortiert und Zahlen der Größe nach. Mit dem Zusatz DESC
werden die Daten absteigend sortiert.
SELECT * FROM tracks ORDER BY milliseconds
SELECT * FROM tracks ORDER BY bytes DESC
Die LIMIT
-Klausel wird benutzt, um die Anzahl von Datensätzen, die von einer SELECT
-Anweisung zurückgegeben wird, zu beschränken. LIMIT
erwartet ein oder zwei numerische Argumente:
LIMIT 10
gibt die ersten zehn Datensätze zurückLIMIT 3, 5
gibt ab dem 4. Datensatz insgesamt 5 Datensätze zurück, die Zählung beginnt also ab 0
SELECT * FROM tracks ORDER BY bytes DESC LIMIT 10
SELECT * FROM tracks ORDER BY milliseconds LIMIT 5, 10
Öffne die Northwind-Datenbank in einem neuen Browserfenster neben diesem Fenster mit den Aufgaben.
- Klappe das Datenbank-Schema auf und verschaffe dir so einen Überblick über die Northwind-Datenbank. Was für Daten beinhaltet sie? Wozu dient die Northwind-Datenbank?
- Formuliere für jede der folgenden Aufgaben eine eigene DQL-Abfrage! Notiere deine Ergebnisse im Gruppendokument!
- Zeige eine Liste von allen Kunden.
- Zeige eine Liste von allen Kunden aus
Deutschland
. - Zeige eine Liste von allen Kunden aus
Deutschland
, deren Job-TitelSales Representative
ist. - Ermittle Adresse, Postleitzahl und Ort vom Kunden mit der ID
ALFKI
- Finde alle Produkte, die das Wort
berry
im Namen enthalten. - Finde alle Produkte aus der Kategorie mit der ID
2
- Finde alle Produkte aus der Kategorie mit der ID
2
, die mehr als 20€ kosten. - Finde alle Produkte aus der Kategorie mit der ID
2
, die mehr als 20€ kosten, aber weniger als 30€. - Finde alle Produkte aus der Kategorie mit der ID
2
, die mehr als 20€ kosten, aber weniger als 30€ und von denen noch mindestens 100 auf Lager sind ("auf Lager" = "in stock"). - Finde alle Produkte, die nicht mehr hergestellt werden ("discontinued").
- Finde die Namen aller Länder, aus denen Kunden stammen.
- Lass dir alle Bestellungen ("Orders") anzeigen, absteigend sortiert nach den Versandkosten ("Freight")
- Lass dir nur die ersten 10 Bestellungen anzeigen, absteigend sortiert nach den Versandkosten ("Freight")
- Lass dir 10 Bestellungen anzeigen, überspringe aber die ersten 15, absteigend sortiert nach den Versandkosten ("Freight")
- Lass dir in einer einzigen Abfrage die Ansprechpartner der Kunden mit den IDs
ALFKI
,BERGS
undDRACD
anzeigen. - Lass dir für jedes Produkt den im Lager lagernden Wert berechnen (Tipp: Preis * Anzahl)
- Denke dir weitere, sinnvolle Abfragen aus. Notiere dir im Gruppendokument sowohl die "Text-Anfrage" (Wie Aufgaben a)-p) und die DQL dazu!