Lektion1: SELECT-Anweisungen

SQL - Was ist das?
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.

Ein Beispiel:
Wir wollen wissen, wer in den Jahren Konstrukteursweltmeister wurde, in denen Michael Schumacher Weltmeister war.
Zur Beipieltabelle...

Also hieße die Abfrage:
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 einen * 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.

Ergebnis der Abfrage:

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

Ergebnis der Abfrage:

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

Ergebnis der Abfrage:

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

Ergebnis der Abfrage:

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%'

Ergebnis der Abfrage:

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')

Ergebnis der Abfrage:

NULL komma nix!
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

Ergebnis der Abfrage:

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

Ergebnis der Abfrage:

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

Ergebnis der Abfrage:

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

Ergebnis der Abfrage:

Voll am Limit
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

Ergebnis der Abfrage:
Jetzt geht's los!
Genug der grauen Theorie - jetzt wird es praktisch.
Hier geht es zu den Übungen der Lektion 1.