Erstellen Sie unter https://db-sql.ch mit Ihrer Schul-E-Mail-Adresse einen Account. Sie erhalten anschliessend eine E-Mail mit einem Link, um Ihr Konto zu aktivieren.
Sobald Sie dies erledigt haben, können Sie auf die für Sie freigegebenen Datenbankverbindungen zugreifen.
SQL​
Eine SQL-Abfrage ist vom Aufbau her immer gleich:
SELECT
[DISTINCT]
Auswahlliste
FROM Quelle [Alias-Name]
[WHERE Where-Klausel]
[ [GROUP BY {Group-by-Attribut}] +
[HAVING Having-Klausel]]
[ORDER BY {Sortierungsattribut [ASC|DESC]}
[LIMIT {Datensatz-Anzahl}];
wobei alles, was in eckigen Klammern steht, optional ist.
DISTINCT
Jeder Datensatz wird nur einmal ausgegeben, auch wenn er mehrfach in der Tabelle vorkommt.
Auswahlliste
Bestimmt, welche Attribute (Spalten) der Quelle angezeigt werden sollen (
*
für alle) und ob Aggregationsfunktionen angewendet werden sollen. Aufgezählte Elemente sind mit einem Komma voneinander getrennt.Quelle [Alias-Name]
Spezifiziert, wo die Daten herkommen. Es können Relationen angegeben werden und miteinander als kartesisches Produkt oder als Verbund (
JOIN
) verknüpft werden. Durch die Angabe eines Alias-Namen können die Relationen für die Abfrage umbenannt werden.Where-Klausel
Bestimmt die Bedingungen, unter denen die Daten ausgegeben werden sollen. Einzelne Bedingungen können mit
OR
oderAND
verknĂĽpft werden.Group-by-Attribut
Legt fest, ob unterschiedliche Werte als einzelne Zeilen ausgegeben werden sollen oder ob alle Attributwerte aggregiert (bspw. aufsummiert (
SUM
), gemittelt (AVG
), kleinster Wert (MIN
), grösster Wert (MAX
),...) zu einem einzelnen Ergebniswert zusammengefasst werden.Having-by-Attribut
Ist wie die
WHERE
-Klausel, nur dass sich die angegebenen Bedingungen auf das Ergebnis einer Aggregationsfunktion beziehen.Sortierungsattribut
Nach dem
ORDER BY
Statement werden Attribute angegeben, nach denen sortiert werden soll. FĂĽr eine aufsteigende Reihenfolge (1, 2, 3, ...) wirdASC
spezifiziert, fĂĽr eine absteigende ReihenfolgeDESC
(99, 80, 13, ...).LIMIT
Gibt an wie viele Datensätze angezeigt werden sollen. Besonders hilfreich bei grossen Datensätzen, oder wenn nur eine gewisse Anzahl der grössten/kleinsten Attributwerte gesucht werden.
Einige Beispiele:
- Alle auswählen
- Projektion
- Nach Name Sortiert
- Die ersten 5
- Selektion
SELECT *
FROM legodudes;
--- Projektion: nur bestimmte Attribute anzeigen
SELECT name, beschreibung, bild
FROM legodudes;
SELECT *
FROM legodudes
ORDER BY name;
--- oder explizite Richtung
SELECT *
FROM legodudes
ORDER BY name ASC;
--- oder absteigend
SELECT *
FROM legodudes
ORDER BY name DESC;
SELECT *
FROM legodudes
LIMIT 5;
--- oder kombiniert
SELECT *
FROM legodudes
ORDER BY name
LIMIT 5;
--- nur mit der id 4
SELECT *
FROM legodudes
WHERE id=4;
--- nur aus den USA
SELECT *
FROM legodudes
WHERE land='USA';
Datenbank
legomania
👉 https://db-sql.ch/connections/9e5bd382-6110-4f04-adf7-2b46fcdadfd5/legomania
Fragen Sie alle Haustiere ab, wobei nur die Tierart, der Name und das Bild (in dieser Reihenfolge) ausgegeben werden sollen. Die Resultate sollen zudem alphabetisch absteigend nach der Tierart sortiert sein.
Datenbank
legomania
👉 https://db-sql.ch/connections/9e5bd382-6110-4f04-adf7-2b46fcdadfd5/legomania
Fragen Sie bei den Haustieren alle Hunde ab, wobei alle Attribute ausgegeben werden sollen.
Logische Operatoren​
Mit den logischen Operatoren AND
, OR
und NOT
können mehrere Bedingungen miteinander verknüpft werden.
SELECT * FROM haustiere
WHERE lieblingsfutter='Körner' AND tierart='Hamster';
SELECT * FROM haustiere
WHERE lieblingsfutter='Körner'
OR lieblingsfutter='Fisch';
SELECT * FROM haustiere
WHERE
NOT lieblingsfutter='Körner' AND (tierart='Hund' OR tierart='Katze');
-
Das
NOT
bezieht sich jeweils nur auf den direkt folgenden Ausdruck. -
Tabellen-Namen mĂĽssen fĂĽr jeden Vergleich angegeben werden.
:::
Datenbank
legomania
👉 https://db-sql.ch/connections/9e5bd382-6110-4f04-adf7-2b46fcdadfd5/legomania
Wo liegt der Unterschied?
-
Probieren Sie die Abfragen aus
-
vergleichen Sie die Resultate
-
Erklären Sie das Verhalten
SELECT * FROM haustiere
WHERE (NOT lieblingsfutter='Körner' AND tierart='Hund') OR tierart='Hamster';
SELECT * FROM haustiere
WHERE NOT lieblingsfutter='Körner' AND (tierart='Hund' OR tierart='Hamster');
Distinct​
Mit dem SchlĂĽsselwort DISTINCT
kann angegeben werden, dass jeder Datensatz nur einmal ausgegeben werden soll, auch wenn er mehrfach in der Tabelle vorkommt.
Beispiel: Es sollen alle Tierarten ausgegeben werden, die in der Tabelle haustiere
vorkommen.
SELECT DISTINCT tierart FROM haustiere;
Datenbank
legomania
👉 https://db-sql.ch/connections/9e5bd382-6110-4f04-adf7-2b46fcdadfd5/legomania
Geben Sie alle Länder in welchen Legodudes wohnen in alphabetisch absteigender Reihenfolge aus.
Datenbank
waters
👉 https://db-sql.ch/connections/9e5bd382-6110-4f04-adf7-2b46fcdadfd5/waters
-
Finden Sie heraus, an welchen Standorten die Aarentemperatur gemessen wird.
-
Erzeugen Sie eine Tabelle, in welcher nur die Aarentemperatur kurz vor dem Bielersee angezeigt wird. Ordnen Sie die Ausgabe nach dem Erstelldatum des Datensatzes.
-
Erstellen Sie ein Liniendiagramm mit db-sql und fĂĽgen Sie das Bild als Antwort unten ein.
Nach Namen Suchen​
Mit dem SchlĂĽsselwort LIKE
kann nach einem bestimmten Muster gesucht werden. %
steht dabei fĂĽr beliebige Zeichen.
Beispiel: Es sollen alle Personen ausgegeben werden, deren Name mit Georg
beginnt.
SELECT * FROM persons WHERE name LIKE 'Georg%';
... oder alle Personen, deren Name ein grosses Z
enthält.
SELECT * FROM persons WHERE name LIKE '%Z%';
Der LIKE
Befehl beachtet die Gross- und Kleinschreibung! Damit man nicht (wie in Python) zuerst den zu durchsuchenden Text in kleine Buchstaben transformieren muss, gibt es das insensitive Like: ILIKE
. Damit wird die Gross- und Kleinschreibung ignoriert.
SELECT * FROM persons WHERE name ILIKE '%z%';
gibt alle Personen mit einem grossen- oder kleinen z
im Namen zurĂĽck.
Ohne ILIKE
ILIKE
Ohne den Befehl ILIKE
könnte die Abfrage so aussehen:
SELECT * FROM persons WHERE name LIKE '%z%' OR name LIKE '%Z%';
oder
SELECT * FROM persons WHERE LOWER(name) LIKE '%z%' OR name LIKE '%Z%';
Datenbank
IMDB
👉 https://db-sql.ch/connections/9e5bd382-6110-4f04-adf7-2b46fcdadfd5/imdb
Listen Sie alle Personen auf, die
-
mit Ihren Namen beginnen? (Achtung: Beim Namen
John
soll der NameJohnny
nicht ausgegeben werden) -
mit Ihrem Namen enden?
-
ihren Namen enthalten?
Spalten benennen​
Die Spaltennamen lassen sich bei der Abfrage verändern oder neu definieren:
SELECT name as Spitzname, tierart as Tier, lieblingsfutter as Frisst
FROM haustiere
Datenbank
legomania
👉 https://db-sql.ch/connections/9e5bd382-6110-4f04-adf7-2b46fcdadfd5/legomania
-
Wo liegt der Unterschied zwischen den beiden Queries? FĂĽhren Sie beide Queries aus und halten Sie den Unterschied fest.
-
Funktioniert es auch mit einfachen AnfĂĽhrungszeichen
'
?
SELECT name as Spitzname, tierart as Tier, lieblingsfutter as Frisst
FROM haustiere;
SELECT name as "Spitzname", tierart as "Tier", lieblingsfutter as "Frisst"
FROM haustiere;
Texte verändern​
CONCAT(text1, text2, ...)
oder text1 || text 2
​
Mit dem SchlĂĽsselwort CONCAT
können Texte zusammengefügt werden:
SELECT CONCAT('Hallo ', name) FROM persons;
-- oder äquivaltent
SELECT 'Hallo ' || name FROM persons;
SUBSTRING(text, start, [length])
​
Mit dem SchlĂĽsselwort SUBSTRING
können Textausschnitte ausgegeben werden, wobei der start
Index angibt, welches der erste Buchstaben ist. Achtung - hier hat der erste Buchstabe im Gegensatz zu Python den Index 1! Optional kann mit dem Parameter length
die Länge des Ausschnitts angegeben werden.
SELECT SUBSTRING('Hallo', 2); -- > 'allo'
SELECT SUBSTRING('Hallo', 2, 3); -- > 'all'
SELECT SUBSTRING('Hallo', 1, 3); -- > 'Hal'
-- oder mit Spalteninhalten
SELECT SUBSTRING(name, 1, 5) FROM persons;
REPLACE(text, old, new)
​
Mit dem SchlĂĽsselwort REPLACE
können Textteile ersetzt werden
-- "Reto Holz" wird zu "Reto_Holz"
SELECT REPLACE(name, ' ', '_') FROM persons;
Definition​
POSITION(token in text)
​
Mit POSITION
lässt sich das erste Auftreten eines Textausschnitts (token) in einem Text herausfinden.
Beispiel: Wo kommt das erste Leerzeichen vor?
SELECT POSITION(' ' in 'Hallo Welt');
-- 123456
-- \--> an Position 6...
Damit lässt sich nun auch der Vorname aus einer Namensliste herauslesen:
SELECT SUBSTRING(name, 1, POSITION(' ' in name)) FROM persons;
Weitere Operatoren und Funktionen
-
UPPER(text)
schreibt alle Buchstaben gross -
LOWER(text)
schreibt alle Buchstaben klein -
MD5(text)
berechnet den MD5-Hash eines Textes
Datenbank
IMDB
👉 https://db-sql.ch/connections/9e5bd382-6110-4f04-adf7-2b46fcdadfd5/imdb
-
Welche unterschiedlichen Filmtypen gibt es? Listen Sie alle auf.
-
Zeigen Sie alle Attribute der ersten
100
Kurzfilme aus dem Jahr 2023 an. -
Die angezeigte ID (bspw.
tt8773344
) findet man auch in der URL der IMDB-Seite. Erstellen Sie eine Abfrage, welche nebst allen Attributen noch zusätzlich dieURL
fĂĽr die ersten 100 Kurzfilme ausgibt, die im Jahr 2023 erschienen sind.
Die URL hat folgendes Format:https://www.imdb.com/title/<ID>/
Einstieg SQL