Lektion 1: SELECT-Anweisung
SQL ist eine Abkürzung für Structured Query Language (strukturierte Abfragesprache). Sie
wird verwendet, um bestimmte Daten aus Datenbanken auszulesen.
Aha! Und wie geht das jetzt?
Jede SQL-Abfrage enthält die drei Hauptbefehle select (engl. auswählen),
from (engl. von) und where (engl. wo). Mit select gibt man an, welche
Spalten man ausgegeben haben möchte; mit from gibt man die Tabelle an, aus der die
Spalten stammen; mit where gibt man die Bedingung an, unter der die Datensätze
ausgesucht werden. Where muss nicht vorkommen, wenn es keine Bedingung gibt.
Wir wollen wissen, wer in den Jahren Konstrukteursweltmeister wurde, in denen Michael Schumacher Weltmeister war.
Zur Beipieltabelle...
select
Saison, Fahrerweltmeister, Konstrukteurswm
from
WMTitel
where
Fahrerweltmeister = 'Michael Schumacher'
Tipp: Wenn man alle Spalten einer Tabelle angezeigt haben möchte, kann man
auch einfach ein * einsetzen. Aus select Saison, Fahrerweltmeister,
Konstrukteursweltmeister from...
wird dann select * from...
Zeichenketten (Strings) wie zum Beispiel 'Michael Schumacher' setzt man in einfache
Anführungszeichen.
Hinweis: Bei den Tabellennamen muss die Groß-/Kleinschreibung beachtet werden.
Kleine und Große - die Vergleichsoperatoren
Mit den Operatoren <, <=, =, <>, >= und > kann man Vergleichsbedingungen
in der where-Klausel formulieren.
Beispiel:
Gesucht sind die Weltmeister mit mindestens 100 WM-Punkten.
select Fahrerweltmeister, WM_Punkte
from WMTitel
where WM_Punkte >= 100
Alles logisch oder was? - logische Operatoren
Mit den Operatoren and, or und not kann man logische Bedingungen
in der where-Klausel formulieren.
Beispiel:
In welchen Jahren hatte Michael Schumacher mehr als 100 WM-Punkte?
select Saison, Fahrerweltmeister, WM_Punkte
from WMTitel
where Fahrerweltmeister = 'Michael Schumacher'
and WM_Punkte > 100
Gemeinsam gehts besser - der between-Operator
Die where-Klausel mit WM_Punkte >= 80 and <= 110 funktioniert nicht, weil beim zweiten Vergleich
der Vergleichspartner fehlt.
Für Bereichsvergleiche verwendet man
den between-Operator.
Beispiel:
In welchen Jahren hatte der Weltmeister zwischen 80 und 110 Punkte?
select Saison, Fahrerweltmeister, WM_Punkte
from WMTitel
where WM_Punkte between 80 and 110
Gewusst wie - der like-Operator
Mit dem like-Operator kannst Du Muster für String-Vergleiche benutzen:
- das Prozentzeichen % steht für eine beliebige Folge von Zeichen
- der Unterstrich _ steht für ein einziges beliebiges Zeichen
Microsoft Access benutzt anstelle des SQL-Standards den Stern * für eine beliebige Folge und
das Fragezeichen ? für ein einzelnes beliebiges Zeichen.
Du kannst den like-Operator auch zusammen mit not benutzen: not like
Beispiel:
In welchen Jahren war Renault Konstrukteursweltmeister?
select Saison, KonstrukteursWM
from WMTitel
where KonstrukteursWM like '%Renault%'
Bin ich drin? - der in-Operator
Hat man eine ganze Liste von Kriterien für die gesuchten Daten, so kann
der in-Operator weiter helfen.
Du kannst den in-Operator auch zusammen mit not benutzen: not in
Beispiel:
In welchen Jahren waren Ayrton Senna, Alain Prost bzw. Damon Hill Weltmeister?
select Saison, Fahrerweltmeister
from WMTitel
where Fahrerweltmeister in ('Ayrton Senna', 'Alain Prost', 'Damon Hill')
Wenn beim Einfügen von Daten in eine Datenbanktabelle ein Wert noch nicht bekannt ist, so
wird dieser mit dem sogenannten NULL-Wert belegt. Solche NULL-Werte kannst Du mit dem is-Operator finden.
Du kannst den is-Operator auch zusammen mit not benutzen: not is
Beispiel:
In welchen Jahren gab es keine Team_Punkte für die KonstrukteursWM?
select *
from WMTitel
where Team_Punkte is NULL
In der Tabelle WMTitel stehen die Daten ab 1950. Die Wertung der Konstrukteurs-Weltmeisterschaft wurde aber erst
ab 1958 eingeführt, weswegen für die Jahre vorher hierfür keine Werte vorliegen und daher die Team-Punkte
keinen Wert, also NULL, erhalten haben. Das Ergebnis der Abfrage zeigt auch, dass es einen Unterschied zwischen NULL
und dem Leerstring gibt, denn in den Jahren 1954 bis 1957 wurde im Feld KonstrukteursWM der Wert NULL durch einen Leerstring ersetzt.
Auf den Unterschied kommt es an - der distinct-Operator
Mit dem distinct-Operator sorgt man dafür, dass in der Ergebnistabelle keine Einträge mehrfach vorkommen.
Beispiel:
Wir wollen die Namen aller Weltmeister wissen, aber es soll jeder nur einmal aufgelistet
werden.
select distinct Fahrerweltmeister
from WMTitel
Mathe machts möglich - einfache Berechnungen und as-Operator
In der select-Klausel können mit den Grundrechenarten (+, -, *, /) Berechnungen
durchgeführt werden.
Den berechneten Ergebnisspalten kannst Du mit dem as-Operator Bezeichnungen geben.
Beispiel:
Es soll die prozentuale Ausbeute der WM-Punkte ermittelt werden. Bei 16 Rennen und jeweils
10 Punkten können maximal 160 WM-Punkte erreicht werden.
select Fahrerweltmeister, WM_Punkte/160*100 as Ausbeute
from WMTitel
Ordnung ist das halbe Leben - order by
Will man seine Ergebnisse nach bestimmten Kriterien sortiert ausgegeben haben, so setzt man
den order by-Operator ein.
Standardmäßig werden Strings in alpabetischer Reihenfolge von A bis Z
sortiert und Zahlen der Größe nach. Mit dem Zusatz desc werden die Daten absteigend
sortiert.
Beispiel:
Die prozentuale Ausbeute der WM-Punkte soll sortiert dargestellt werden, beginnend mit dem größten Wert.
Hinweis: Man kann nach mehreren Kriterien sortieren, wenn man nach dem order by-Operator mehrere Spalten angibt.
Im Beispiel wäre also order by Ausbeute desc, Fahrerweltmeister noch besser.
Tipp: Man kann statt der Spaltennamen auch einfach die Spaltennummern angeben, nach der das Ergebnis sortiert werden soll.
Das ist besonders für berechnete Spalten nützlich.
select Fahrerweltmeister, WM_Punkte/160*100 as Ausbeute
from WMTitel
order by Ausbeute desc
select Fahrerweltmeister, WM_Punkte/160*100
from WMTitel
order by 2 desc, 1 asc
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 3, 5 gibt ab dem 4. Datensatz insgesamt 5 Datensätze zurück, die Zählung beginnt also ab 0
- limit 10 gibt die ersten zehn Datensätze zurück (entspricht limit 0, 10)
Beispiel:
Von der prozentualen Ausbeute der WM-Punkte sollen nur die Plätze 5 bis 7 dargestellt werden.
select Fahrerweltmeister, WM_Punkte/160*100 as Ausbeute
from WMTitel
order by Ausbeute desc, Fahrerweltmeister
limit 4, 3
Genug der grauen Theorie - jetzt wird es praktisch.
Hier geht es zu den
Übungen der Lektion 1.