====== SQL ======
Die Sprache SQL (Structured Query Language, im englischen Sprachraum oft ausgesprochen als "Sequel") gibt es seit den 1970'er Jahren. Sie hat sich als Standardsprache zum Erstellen, Ändern und Abfragen relationaler Datenbanken etabliert. Im Folgenden wiederholen wir, wie sich mit Hilfe von SQL Informationen aus einer mit gefüllten Tabelle entnehmen lassen.
===== Grundlegende SQL-Abfragen =====
**Grundlegender Aufbau einer SQL-Abfrage:**
select spalte1, spalte2, ... from tabelle
where Bedingung
* Statt der kommaseparierten Liste von Spalten kann auch ein Stern (*) eingesetzt werden. Er steht dann für "alle Spalten"
* In der Bedingung können die Operatoren ''='', ''<'', ''>'', ''<''''='', ''>='', ''<>'' (ungleich) verwendet werden um Zahlen oder Zeichenketten (lexikalisch!) zu vergleichen.
* Zwei Zeichenketten können auch mit dem Operator ''like'' verglichen werden. Dann wirken die Zeichen ''%'' und ''_'' (Unterstrich) als [[https://de.wikipedia.org/wiki/Wildcard_(Informatik)|Wildcards]]:
* Das Prozentzeichen ''%'' steht für beliebig viele (auch: 0) beliebige Zeichen
* Der Unterstrich ''_'' steht für genau ein beliebiges Zeichen. \\ Beispiel: ''where name like '_a%' '' findet alle Datensätze, bei denen der Spaltenwert für ''name'' als zweiten Buchstaben ein kleines a hat.
* Oft gibt es bei einer Abfrage mehrere identische Ergebniszeilen, z.B. bei ''select meer from fluss''. Mit dem Schlüsselwort ''distinct'' kannst Du erreichen, dass mehrfache identische Ergebniszeilen jeweils nur ein Mal vorkommen: ''select distinct meer from fluss''
Schreibe in der obigen Datenbank SQL-Abfragen, um folgende Fragen zu beantworten:
- Wie viele Einwohner hat die Stadt Ingolstadt?
- Welche Orte haben mehr als 10 000 000 Einwohner?
- Welche Städte, deren Name mit B beginnt, liegen in Deutschland?
- Welche Flüsse fließen ins Schwarze Meer?
[[.loesung1:start|Hier geht's zur Lösung]] \\
===== Aggregatfunktionen =====
Aggregatfunktionen (von lat. aggregare: "zusammenfassen") fassen die Daten mehrerer Datensätze zu einem Wert zusammen, z.B. gibt die folgende Abfrage die Summe der Einwohnerzahlen aller Länder aus, deren Name mit D beginnt.
select sum(einwohner) from land
where name like 'D%'
**Bem.:** Wundere Dich nicht über das niedrige Ergebnis: Die Einwohnerzahlen der Länder sind in der Tabelle Land übrigens in der Einheit "Millionen" gespeichert. \\ \\
Folgende Aggregatfunktionen gibt es in SQL:
* ''sum(Spalte)'': Summe der Werte in dieser Spalte
* ''min(Spalte)'': Kleinster Wert in dieser Spalte
* ''max(Spalte)'': Größter Wert in dieser Spalte
* ''avg(Spalte)'' (Mittelwert dieser Spalte, engl. "average")
Eine besondere Rolle spielt die Aggregatfunktion ''count(Spalte)'': Sie gibt die Anzahl der Werte in dieser Spalte zurück. Üblicherweise wird nur ''count(*)'' verwendet, das die Anzahl der Datensätze zurückgibt.
Schreibe in der obigen Datenbank SQL-Abfragen, um folgende Fragen zu beantworten:
- Wie viele Einwohner hat das (einwohnermäßig!) größte Land der Erde?
- Wie viele Einwohner hat der kleinste in der Datenbank gespeicherte Ort?
- wie viele Orte sind in der Datenbank gespeichert, deren Name auf "stadt" endet?
[[.loesung2:start|Hier geht's zur Lösung]]
===== Sortierung von Ergebnissen =====
Durch den Zusatz ''order by'' kann man die Datensätze in der Ergebnistabelle sortieren lassen, z.B. gibt die folgende Abfrage eine Tabelle mit den Namen und Einwohnerzahlen aller Orte zurück, deren Name mit D beginnt, wobei die Datensätze nach dem Ortsnamen sortiert werden:
select name, einwohner from land
where name like 'D%'
order by name
Will man in umgekehrter Reihenfolge sortieren, so setzt man noch ''desc'' (engl.: "descending") dahinter. Steht nichts hinter dem ''order''-Zusatz, so ist ''asc'' (engl. "ascending") gemeint:
select name, einwohner from land
where name like 'D%'
order by name desc
Schreibe in der obigen Datenbank SQL-Abfragen, um folgende Fragen zu beantworten:
- Gesucht ist eine Nach Name sortierte Liste aller Kontinente
- Gesucht ist eine nach Einwohnerzahl sortierte Aufstellung aller Orte der Erde, deren Name mit N beginnt, beginnend mit dem größten Ort.
[[.loesung3:start|Hier geht's zur Lösung]]
===== Gruppierung der Ergebnisse =====
Der Zusatz ''group by Spalte'' gruppiert alle Datensätze mit demselben Wert in der angegebenen Spalte. Nach ''select'' kann man in diesem Fall sinnvollerweise natürlich nur noch den Wert dieser Spalte sowie Aggregate (z.B. die Summe) der anderen Spalten angeben. \\
**Beispiel:** Gib die Summe der Einwohnerzahlen aller Länder der einzelnen Kontinente zusammen mit dem Kürzel des Kontinents aus:
select sum(einwohner), knr from land
group by knr
Will man nur bestimmte Kontinente haben (z.B. alle, deren Kürzel mit A beginnt), so kann man diese Bedingung in einem ''having''-Zusatz angeben:
select sum(einwohner), knr from land
group by knr
having knr like 'A%'
Schreibe in der obigen Datenbank SQL-Abfragen, um folgende Fragen zu beantworten:
* Gesucht ist eine Liste der Meere jeweils zusammen mit der Länge des längsten Flusses, der in das Meer fließt
[[.loesung4:start|Hier geht's zur Lösung]]