SQL-10: Unterschied zwischen den Versionen
(12 dazwischenliegende Versionen von einem anderen Benutzer werden nicht angezeigt) | |||
Zeile 1: | Zeile 1: | ||
[[Kategorie:Datenbanken]] | [[Kategorie:Datenbanken]] | ||
[[Kategorie:Informatik- | [[Kategorie:Informatik-10]] | ||
[[Kategorie:Informatik]] | [[Kategorie:Informatik]] | ||
SQL steht für '''Structured Query Language''' und ist die Standard-Programmiersprache für die Abfrage von Datenbanken. | SQL steht für '''Structured Query Language''' und ist die Standard-Programmiersprache für die Abfrage von Datenbanken. | ||
* Hier finden sich Erläuterungen zu allen SQL-Techniken, die in der | * Hier finden sich Erläuterungen zu allen SQL-Techniken, die in der 10. Klasse wichtig sind. | ||
* Zu diesen Techniken gibt es auch '''[[SQL-Aufgaben- | * Zu diesen Techniken gibt es auch '''[[SQL-Aufgaben-10|Aufgaben]]''', die man zur Übung selber bearbeiten kann. | ||
* Alle Beispiele auf dieser Seite kann man selber testen: <br/>'''[http://sibi-wiki.de/ | * Alle Beispiele auf dieser Seite kann man selber testen: <br/>'''[http://sibi-wiki.de/sql/ hier_klicken]'''. <br/>Die Zugangsdaten erfahrt ihr im Informatikunterricht. | ||
** ''Wer nicht am SIBI ist, kann hier einen SQL-Dump der Beispieldatenbank Schule herunterladen: <br/>[[Datei:Beispieldatenbank-schule.zip]]'' | |||
Zeile 14: | Zeile 15: | ||
=Erklärvideos= | =Erklärvideos= | ||
* [https://youtu.be/ | * [https://youtu.be/fV1B-EWYPk0 Zusammenfassen mit GROUP BY] | ||
* [https://youtu.be/443ew7CVC0Y SQL-Abfragen über mehrere Tabellen] | |||
=Übersicht über die SQL-Befehle in Klasse 09= | =Übersicht über die SQL-Befehle in Klasse 09= | ||
Zeile 31: | Zeile 35: | ||
=Aufbau von SQL-Abfragen= | =Aufbau von SQL-Abfragen= | ||
Für den Aufbau von SQL-Abfragen gilt folgende Reihenfolge: | Für den Aufbau von SQL-Abfragen gilt folgende Reihenfolge: | ||
<code> | <code> | ||
SELECT ... | SELECT ... | ||
FROM ... | FROM ... | ||
Zeile 37: | Zeile 41: | ||
GROUP BY ... | GROUP BY ... | ||
ORDER BY ... | ORDER BY ... | ||
</code> | </code> | ||
* <code>SELECT</code> und <code>FROM</code> müssen auf jeden Fall dabei sein. | * <code>SELECT</code> und <code>FROM</code> müssen auf jeden Fall dabei sein. | ||
Zeile 48: | Zeile 52: | ||
Eine SQL-Abfrage, die die Raumnummer und Etage zu Räumen mit mindestens 30 Plätzen zurückgibt. | Eine SQL-Abfrage, die die Raumnummer und Etage zu Räumen mit mindestens 30 Plätzen zurückgibt. | ||
<code> | <code> | ||
SELECT nummer, etage | SELECT nummer, etage | ||
FROM raum | FROM raum | ||
WHERE plaetze >= 30 | WHERE plaetze >= 30 | ||
</code> | </code> | ||
Man kann auch '''<code>SELECT *</code>''' angeben - dann werden alle Attribute ausgegeben. | Man kann auch '''<code>SELECT *</code>''' angeben - dann werden alle Attribute ausgegeben. | ||
Zeile 59: | Zeile 63: | ||
Eine SQL-Abfrage, die alle Attribute zu Räumen mit mindestens 30 Plätzen zurückgibt. | Eine SQL-Abfrage, die alle Attribute zu Räumen mit mindestens 30 Plätzen zurückgibt. | ||
<code> | <code> | ||
SELECT * | SELECT * | ||
FROM raum | FROM raum | ||
WHERE plaetze >= 30 | WHERE plaetze >= 30 | ||
</code> | </code> | ||
=Mehrere Bedingungen: AND, OR= | ==Mehrere Bedingungen: AND, OR== | ||
In SQL-Abfragen kann man mehrere Bedingungen kombinieren. Dafür gibt es die Schlüsselwörter AND, OR. | In SQL-Abfragen kann man mehrere Bedingungen kombinieren. Dafür gibt es die Schlüsselwörter AND, OR. | ||
Zeile 72: | Zeile 76: | ||
Die Nummer und die Plätze von allen Räumen aus der unteren und der mittleren Etage. | Die Nummer und die Plätze von allen Räumen aus der unteren und der mittleren Etage. | ||
<code> | <code> | ||
SELECT nummer, plaetze | SELECT nummer, plaetze | ||
FROM raum | FROM raum | ||
WHERE etage = 'unten' <u>'''OR'''</u> etage = 'Mitte' | WHERE etage = 'unten' <u>'''OR'''</u> etage = 'Mitte' | ||
</code> | </code> | ||
==LIKE und der Joker "%"== | ==LIKE und der Joker "%"== | ||
Zeile 87: | Zeile 91: | ||
Name und Vorname von allen Schülern, deren Vorname mit "M" anfängt. | Name und Vorname von allen Schülern, deren Vorname mit "M" anfängt. | ||
<code> | <code> | ||
SELECT name, vorname | SELECT name, vorname | ||
FROM schueler | FROM schueler | ||
WHERE vorname LIKE 'M%' | WHERE vorname LIKE 'M%' | ||
</code> | </code> | ||
'''Erläuterung:''' | '''Erläuterung:''' | ||
Zeile 102: | Zeile 106: | ||
Name und Vorname von allen Lehrern, deren Name auf "er" endet. | Name und Vorname von allen Lehrern, deren Name auf "er" endet. | ||
<code> | <code> | ||
SELECT name, vorname | SELECT name, vorname | ||
FROM lehrer | FROM lehrer | ||
WHERE name LIKE '%er' | WHERE name LIKE '%er' | ||
</code> | </code> | ||
'''Erläuterung:''' | '''Erläuterung:''' | ||
Zeile 121: | Zeile 125: | ||
Eine Liste der Schüler (mit Name und Vorname), sortiert nach dem Namen. | Eine Liste der Schüler (mit Name und Vorname), sortiert nach dem Namen. | ||
<code> | <code> | ||
SELECT name, vorname | SELECT name, vorname | ||
FROM schueler | FROM schueler | ||
<u>'''ORDER BY name'''</u> | <u>'''ORDER BY name'''</u> | ||
</code> | </code> | ||
===ORDER BY ... DESC=== | ===ORDER BY ... DESC=== | ||
Zeile 135: | Zeile 139: | ||
Eine Liste der Räume (Nummer, Etage und Plätze), '''absteigend''' sortiert nach Plätzen, d.h. der größte Raum steht oben. | Eine Liste der Räume (Nummer, Etage und Plätze), '''absteigend''' sortiert nach Plätzen, d.h. der größte Raum steht oben. | ||
<code> | <code> | ||
SELECT nummer, etage, plaetze | SELECT nummer, etage, plaetze | ||
FROM raum | FROM raum | ||
<u>'''ORDER BY plaetze DESC'''</u> | <u>'''ORDER BY plaetze DESC'''</u> | ||
</code> | </code> | ||
==DISTINCT== | ==DISTINCT== | ||
Zeile 149: | Zeile 153: | ||
Eine SQL-Abfrage, die für die Tabelle <code>raum</code> die Etagen wiedergibt. | Eine SQL-Abfrage, die für die Tabelle <code>raum</code> die Etagen wiedergibt. | ||
<code> | <code> | ||
SELECT <u>'''DISTINCT'''</u> etage | SELECT <u>'''DISTINCT'''</u> etage | ||
FROM raum | FROM raum | ||
</code> | </code> | ||
''Ohne DISTINCT würde jede Etage mehrfach aufgeführt - so oft, wie es Zeilen in der Tabelle gibt.'' | ''Ohne DISTINCT würde jede Etage mehrfach aufgeführt - so oft, wie es Zeilen in der Tabelle gibt.'' | ||
Zeile 165: | Zeile 169: | ||
<code> | <code> | ||
SELECT <u>'''COUNT(*)'''</u> | SELECT <u>'''COUNT(*)'''</u> | ||
FROM schueler | FROM schueler | ||
</code> | </code> | ||
Hier werden die Zeilen <u>gezählt</u>. Mit COUNT(<u>'''*'''</u>) wird nicht ein Attribut gezählt, sondern jede Zeile, die ein Attribut enthält. | Hier werden die Zeilen <u>gezählt</u>. Mit COUNT(<u>'''*'''</u>) wird nicht ein Attribut gezählt, sondern jede Zeile, die ein Attribut enthält. | ||
Zeile 176: | Zeile 180: | ||
Mit der folgenden Abfrage kann man ermitteln, wie viele Stunden Sport unterrichtet werden. | Mit der folgenden Abfrage kann man ermitteln, wie viele Stunden Sport unterrichtet werden. | ||
<code> | <code> | ||
SELECT <u>'''SUM(stunden)'''</u> | SELECT <u>'''SUM(stunden)'''</u> | ||
FROM unterricht | FROM unterricht | ||
WHERE fach = 'Sport' | WHERE fach = 'Sport' | ||
</code> | </code> | ||
Hier werden die Attributwerte <code>stunden</code> <u>summiert</u> (d.h. zusammenaddiert). | Hier werden die Attributwerte <code>stunden</code> <u>summiert</u> (d.h. zusammenaddiert). | ||
=GROUP BY= | =GROUP BY= | ||
'''Erklärvideo: [https://youtu.be/fV1B-EWYPk0 Zusammenfassen mit GROUP BY]''' | |||
Mit GROUP BY kann man Zeilen, die einen gemeinsamen Attributwert aufweisen, zusammenfassen. | Mit GROUP BY kann man Zeilen, die einen gemeinsamen Attributwert aufweisen, zusammenfassen. | ||
Zeile 192: | Zeile 197: | ||
Mit der folgenden Abfrage erhält man eine Liste der Etagen, und für jede Etage wird notiert, wie viele Plätze in ihr insgesamt enthalten sind. | Mit der folgenden Abfrage erhält man eine Liste der Etagen, und für jede Etage wird notiert, wie viele Plätze in ihr insgesamt enthalten sind. | ||
<code> | <code> | ||
SELECT etage, SUM(plaetze) | SELECT etage, SUM(plaetze) | ||
FROM raum | FROM raum | ||
<u>'''GROUP BY'''</u> etage | <u>'''GROUP BY'''</u> etage | ||
</code> | </code> | ||
'''Wichtig:''' | '''Wichtig:''' | ||
Zeile 218: | Zeile 223: | ||
Die Überschriften in der Tabelle sind "Etage" und "Plaetze_Insgesamt" | Die Überschriften in der Tabelle sind "Etage" und "Plaetze_Insgesamt" | ||
<code> | <code> | ||
SELECT etage <u>'''AS Etage'''</u>, SUM(plaetze) <u>'''AS PlaetzeInsgesamt'''</u> | SELECT etage <u>'''AS Etage'''</u>, SUM(plaetze) <u>'''AS PlaetzeInsgesamt'''</u> | ||
FROM raum | FROM raum | ||
GROUP BY etage | GROUP BY etage | ||
</code> | </code> | ||
=Abfrage über mehrere verknüpfte Tabellen= | =Abfrage über mehrere verknüpfte Tabellen= | ||
'''Erklärvideo: [https://youtu.be/443ew7CVC0Y SQL-Abfragen über mehrere Tabellen]''' | |||
Interessant werden Datenbankabfragen erst dann, wenn man Informationen aus mehreren Tabellen miteinander verknüpft! | Interessant werden Datenbankabfragen erst dann, wenn man Informationen aus mehreren Tabellen miteinander verknüpft! | ||
Zeile 231: | Zeile 239: | ||
Eine Abfrage, die angibt, in welchen Räumen die Klasse 8A unterrichtet wird. | Eine Abfrage, die angibt, in welchen Räumen die Klasse 8A unterrichtet wird. | ||
<code> | <code> | ||
SELECT raum.nummer | SELECT raum.nummer | ||
FROM klasse, unterricht, raum | FROM klasse, unterricht, raum | ||
Zeile 237: | Zeile 245: | ||
'''AND unterricht.klasse_id = klasse.id''' | '''AND unterricht.klasse_id = klasse.id''' | ||
AND klasse.name = '8A' | AND klasse.name = '8A' | ||
</code> | </code> | ||
Alternativ kann man die Abfrage auch mit JOIN ... ON formulieren: | |||
<code> | |||
SELECT raum.nummer | |||
FROM klasse | |||
'''JOIN unterricht | |||
''' ON unterricht.klasse_id = klasse.id''' | |||
'''JOIN raum | |||
''' ON raum.id = unterricht.raum_id''' | |||
AND klasse.name = '8A' | |||
</code> | |||
'''Erläuterungen:''' | '''Erläuterungen:''' | ||
Zeile 255: | Zeile 274: | ||
Eine Liste der Klassen und wieviele Schüler in der Klasse jeweils sind. | Eine Liste der Klassen und wieviele Schüler in der Klasse jeweils sind. | ||
<code> | <code> | ||
SELECT klasse.name, COUNT(schueler.id) AS Schuelerzahl | SELECT klasse.name, COUNT(schueler.id) AS Schuelerzahl | ||
FROM klasse, schueler | FROM klasse, schueler | ||
WHERE klasse.id = schueler.klasse_id | WHERE klasse.id = schueler.klasse_id | ||
GROUP BY klasse.name | GROUP BY klasse.name | ||
</code> | </code> | ||
oder mit JOIN ... ON formuliert: | |||
<code> | |||
SELECT klasse.name, COUNT(schueler.id) AS Schuelerzahl | |||
FROM klasse JOIN schueler | |||
ON klasse.id = schueler.klasse_id | |||
GROUP BY klasse.name | |||
</code> |
Aktuelle Version vom 1. Oktober 2024, 09:59 Uhr
SQL steht für Structured Query Language und ist die Standard-Programmiersprache für die Abfrage von Datenbanken.
- Hier finden sich Erläuterungen zu allen SQL-Techniken, die in der 10. Klasse wichtig sind.
- Zu diesen Techniken gibt es auch Aufgaben, die man zur Übung selber bearbeiten kann.
- Alle Beispiele auf dieser Seite kann man selber testen:
hier_klicken.
Die Zugangsdaten erfahrt ihr im Informatikunterricht.- Wer nicht am SIBI ist, kann hier einen SQL-Dump der Beispieldatenbank Schule herunterladen:
Datei:Beispieldatenbank-schule.zip
- Wer nicht am SIBI ist, kann hier einen SQL-Dump der Beispieldatenbank Schule herunterladen:
Erklärvideos
Übersicht über die SQL-Befehle in Klasse 09
- SELECT, SELECT DISTINCT, FROM, WHERE, GROUP BY, ORDER BY, ASC, DESC, AS
- Vergleichsoperatoren: =, >, <, >=, <=, LIKE (in Zusammenhang mit %)
- Logische Operatoren: AND, OR
- Aggregat-Funktionen: COUNT, SUM, MAX, MIN
Beispieldatenbank Schule
- An der Beispieldatenbank Schule können alle möglichen Datenbankabfragen durchprobiert werden.
- Die Beispieldatenbank ist mit Absicht sehr schmal gehalten, damit man die Ergebnisse von SQL-Abfragen noch überprüfen kann.
- Testen kann man SQL-Abfragen auf der Datenbank Schule hier. Die Zugangsdaten gibt's bei Herrn Kaibel
Aufbau von SQL-Abfragen
Für den Aufbau von SQL-Abfragen gilt folgende Reihenfolge:
SELECT ...
FROM ...
WHERE ...
GROUP BY ...
ORDER BY ...
SELECT
undFROM
müssen auf jeden Fall dabei sein.- Die anderen Teile können dabei sein, müssen aber nicht.
Einfache Abfrage mit SELECT, FROM, WHERE
Bei SELECT kann man die Attribute angeben, die ausgegeben werden sollen. Mehrere Attribute werden durch Komma getrennt.
Beispiel 1: Eine SQL-Abfrage, die die Raumnummer und Etage zu Räumen mit mindestens 30 Plätzen zurückgibt.
SELECT nummer, etage
FROM raum
WHERE plaetze >= 30
Man kann auch SELECT *
angeben - dann werden alle Attribute ausgegeben.
Beispiel 2: Eine SQL-Abfrage, die alle Attribute zu Räumen mit mindestens 30 Plätzen zurückgibt.
SELECT *
FROM raum
WHERE plaetze >= 30
Mehrere Bedingungen: AND, OR
In SQL-Abfragen kann man mehrere Bedingungen kombinieren. Dafür gibt es die Schlüsselwörter AND, OR.
Beispiel:
Die Nummer und die Plätze von allen Räumen aus der unteren und der mittleren Etage.
SELECT nummer, plaetze
FROM raum
WHERE etage = 'unten' OR etage = 'Mitte'
LIKE und der Joker "%"
Manchmal kennt man nicht die ganze Information, sondern nur einen Teil.
Dann kann man eine Abfrage mit LIKE und % formulieren.
Beispiel 1:
Name und Vorname von allen Schülern, deren Vorname mit "M" anfängt.
SELECT name, vorname
FROM schueler
WHERE vorname LIKE 'M%'
Erläuterung:
- Das %-Zeichen kann für eine beliebige Fortsetzung stehen.
- Die WHERE-Bedingung trifft zu auf Maria Schwarzmüller und Michael Schmidt.
Beispiel 2:
Name und Vorname von allen Lehrern, deren Name auf "er" endet.
SELECT name, vorname
FROM lehrer
WHERE name LIKE '%er'
Erläuterung:
- Das %-Zeichen kann für einen beliebigen Anfang stehen.
- Die WHERE-Bedingung trifft zu auf Georg Buttenmüller und Erika Huber.
ORDER BY
Mit ORDER BY kann man angeben, wie die Ausgabe sortiert werden soll.
Dabei wird Text alphabetisch sortiert und Zahlen werden aufsteigend sortiert.
Beispiel:
Eine Liste der Schüler (mit Name und Vorname), sortiert nach dem Namen.
SELECT name, vorname
FROM schueler
ORDER BY name
ORDER BY ... DESC
Mit ORDER BY ... DESC wird absteigend sortiert.
Dabei wird Text alphabetisch sortiert und Zahlen werden aufsteigend sortiert.
Beispiel:
Eine Liste der Räume (Nummer, Etage und Plätze), absteigend sortiert nach Plätzen, d.h. der größte Raum steht oben.
SELECT nummer, etage, plaetze
FROM raum
ORDER BY plaetze DESC
DISTINCT
Mit DISTINCT kann man dafür sorgen, dass in der Ausgabe jeder Wert nur einmal vorkommt.
Beispiel:
Eine SQL-Abfrage, die für die Tabelle raum
die Etagen wiedergibt.
SELECT DISTINCT etage
FROM raum
Ohne DISTINCT würde jede Etage mehrfach aufgeführt - so oft, wie es Zeilen in der Tabelle gibt.
Aggregat-Funktionen (COUNT, MAX, MIN, SUM, AVG)
Mit den sog. Aggregat-Funktionen kann man Attributwerte aus mehreren Zeilen zusammenfassen.
Beispiel 1:
Mit der folgenden SQL-Abfrage kann man ermitteln, wie viele Schüler es gibt.
SELECT COUNT(*)
FROM schueler
Hier werden die Zeilen gezählt. Mit COUNT(*) wird nicht ein Attribut gezählt, sondern jede Zeile, die ein Attribut enthält.
Beispiel 2:
Mit der folgenden Abfrage kann man ermitteln, wie viele Stunden Sport unterrichtet werden.
SELECT SUM(stunden)
FROM unterricht
WHERE fach = 'Sport'
Hier werden die Attributwerte stunden
summiert (d.h. zusammenaddiert).
GROUP BY
Erklärvideo: Zusammenfassen mit GROUP BY
Mit GROUP BY kann man Zeilen, die einen gemeinsamen Attributwert aufweisen, zusammenfassen.
Beispiel:
Mit der folgenden Abfrage erhält man eine Liste der Etagen, und für jede Etage wird notiert, wie viele Plätze in ihr insgesamt enthalten sind.
SELECT etage, SUM(plaetze)
FROM raum
GROUP BY etage
Wichtig:
- GROUP BY braucht man immer, wenn man in SELECT eine "normale" Abfrage und eine Funktionsabfrage (z.B. SUM) miteinander kombiniert.
- GROUP BY funktioniert hier wie folgt:
- Alle Zeilen von zu einer
etage
werden zusammengefasst; so gibt es z.B. in der Ergebnistabelle nur eine Zeile für "unten". - Die
plaetze
von allen Zeilen, derenetage
"unten" ist, werden aufaddiert.
- Alle Zeilen von zu einer
- GROUP BY wird am einfachsten auf das Attribut angewendet, das in der SELECT-Abfrage auftaucht (im Beispiel:
etage
).
Umbenennung (Alias, AS)
Die Spalten, die ausgegeben werden, können umbenannt werden.
Das ist vor allem bei Funktionen hilfreich, weil die Spaltenüberschrift dann manchmal nicht so selbsterklärend ist...
Beispiel:
Mit der folgenden Abfrage erhält man eine Liste der Etagen, und für jede Etage wird notiert, wie viele Plätze in ihr insgesamt enthalten sind.
Die Überschriften in der Tabelle sind "Etage" und "Plaetze_Insgesamt"
SELECT etage AS Etage, SUM(plaetze) AS PlaetzeInsgesamt
FROM raum
GROUP BY etage
Abfrage über mehrere verknüpfte Tabellen
Erklärvideo: SQL-Abfragen über mehrere Tabellen
Interessant werden Datenbankabfragen erst dann, wenn man Informationen aus mehreren Tabellen miteinander verknüpft!
Beispiel:
Eine Abfrage, die angibt, in welchen Räumen die Klasse 8A unterrichtet wird.
SELECT raum.nummer
FROM klasse, unterricht, raum
WHERE raum.id = unterricht.raum_id
AND unterricht.klasse_id = klasse.id
AND klasse.name = '8A'
Alternativ kann man die Abfrage auch mit JOIN ... ON formulieren:
SELECT raum.nummer
FROM klasse
JOIN unterricht
ON unterricht.klasse_id = klasse.id
JOIN raum
ON raum.id = unterricht.raum_id
AND klasse.name = '8A'
Erläuterungen:
- Die Abfrage läuft über drei Tabellen:
klasse
,unterricht
undraum
. - Die Tabellen werden wie folgt miteinander verknüpft:
klasse
undunterricht
: Das Attributid
in der Tabelleklasse
muss mit dem Attributklasse_id
in der Tabelle unterricht übereinstimmen!unterricht
undraum
: Das Attributid
in der Tabelleraum
muss mit dem Attributraum_id
in der Tabelle unterricht übereinstimmen!
- Wichtig: Bei Abfragen über mehrere Tabellen braucht man einen Vergleich weniger als man Tabellen abfragt. D.h. bei drei Tabellen braucht man zwei Verknüpfungen.
- Punkt-Notation: Manche Attribute (z.B.
id
) kommen in mehreren Tabellen vor. Damit SQL weiß, um welche Tabelle es sich handelt, muss man die Tabelle angeben und mit einem Punkt danach das Attribut. Beispiel:raum.id
Abfrage über mehrere Tabellen mit GROUP BY
Man kann die Abfrage über mehrere Tabellen auch mit Funktionen und mit GROUP BY kombinieren.
Beispiel:
Eine Liste der Klassen und wieviele Schüler in der Klasse jeweils sind.
SELECT klasse.name, COUNT(schueler.id) AS Schuelerzahl
FROM klasse, schueler
WHERE klasse.id = schueler.klasse_id
GROUP BY klasse.name
oder mit JOIN ... ON formuliert:
SELECT klasse.name, COUNT(schueler.id) AS Schuelerzahl
FROM klasse JOIN schueler
ON klasse.id = schueler.klasse_id
GROUP BY klasse.name