====== Auswertung der Datenbasis - SQL ======
Im Abschnitt [[datenbanken:grundlagen|Grundlagen zu Datenbanken]] wird erklärt, was wir unter einem Datenbanksystem verstehen. Zur Kommunikation zwischen Datenbankensystemen und anderen Anwendungen hat sich allgemein die Sprache **SQL** (Structured Query Language) durchgesetzt. SQL lässt sich in verschiedene Sprachgruppen einteilen:
* **DDL** - Definition und Veränderung von Relationen (tabellen)
* **DML** - Erfassung und Pflege der Daten
* **QL** - Anfragesprache zur Auswertung der Datenbasis
* **DCL** - Vergabe und Organisation von Zugriffsrechten
=====Auswertung der Datenbasis - Operationen auf Tabellen=====
Bei der Auswertung der Datenbasis sollen bestimmte Daten aus bereits vorhandenen Tabellen ausgelesen werden. Dabei sind verschiedene Operationen möglich. Zur Auswertung der Datenbasis wird der SQL-Befehl ''%%SELECT%%'' verwendet:
SELECT spalte(n)
FROM tabelle(n)
[WHERE bedingunge(n)];
SQL-Befehle können in beliebiger Schreibweise geschrieben werden, es hat sich aber eingebürgert, die Befehle ausschließlich in Großbuchstaben zu schreiben. Die Syntax des Befehls wird in den nächsten Abschnitten erläutert.
====Projektion====
Eine **Projektion** filtert bestimmte Spalten aus einer Datenbanktabelle heraus.
Wir betrachten die Datenbanktabelle **Stadt**.
^Name ^Einwohnerzahl ^Fläche ^Staat |
|Berlin |3,769 Mio |891,8 km² | Deutschland|
|Hamburg |1,845 Mio |755,2 km² | Deutschland|
|London |8,982 Mio |1572 km² |Großbritannien |
|Paris |2,176 Mio |105,34 km² |Frankreich |
SELECT Name, Einwohnerzahl
FROM Stadt;
gibt nur die Spalten Name und Einwohnerzahl aus und blendet alle anderen Spalten aus. →
^Name ^Einwohnerzahl |
|Berlin |3,769 Mio |
|Hamburg |1,845 Mio |
|London |8,982 Mio |
|Paris |2,176 Mio |
Wenn man alle Spalten einer Tabelle ausgeben will, so muss man diese nicht alle aufzählen, man kann sie mit dem ''%%*%%''-Symbol abkürzen.
SELECT *
FROM Stadt;
ergibt:
^Name ^Einwohnerzahl ^Fläche ^Staat |
|Berlin |3,769 Mio |891,8 km² | Deutschland|
|Hamburg |1,845 Mio |755,2 km² | Deutschland|
|London |8,982 Mio |1572 km² |Großbritannien |
|Paris |2,176 Mio |105,34 km² |Frankreich |
====Selektion====
Bei einer Selektion werden bestimmte Zeilen aus einer Tabelle herausgefiltert, die einer bestimmten Bedingung entsprechen. Diese Bedingung wird in der ''%%WHERE%%''-Klausel angegeben.
SELECT *
FROM Stadt;
WHERE Name = 'London'
ergibt:
^Name ^Einwohnerzahl ^Fläche ^Staat |
|London |8,982 Mio |1572 km² |Großbritannien |
Selektion und Projektion können auch miteinander verbunden werden:
SELECT Staat
FROM Stadt
WHERE Name = 'London';
ergibt:
^Staat |
|Großbritannien |
====Verbund====
Ein **Verbund (Join)** ist eine Verbindung zwischen mehreren Tabellen einer Datenbank über ein bestimmtes Attribut. Um zu erklären, wie ein Verbund entsteht betrachten wir unsere bekannte Tabelle Stadt und fügen noch eine weitere Tabelle Staaten hinzu:
**Tabelle Stadt**
^Name ^Einwohnerzahl ^Fläche ^Staat |
|Berlin |3,769 Mio |891,8 km² | Deutschland|
|Hamburg |1,845 Mio |755,2 km² | Deutschland|
|London |8,982 Mio |1572 km² |Großbritannien |
|Paris |2,176 Mio |105,34 km² |Frankreich |
**Tabelle Staaten**
^Staat ^Sprache |
|Deutschland |Deutsch |
|Großbritanien |Englisch |
|Frankreich |Französisch |
Das Attribut Staat, welches in der Tabelle Staaten Primärschlüssel ist, ist in der Tabelle Stadt Fremdschlüssel, es verbindet also die Tabellen. (Die zweite Tabelle ist bewusst klein gehalten, dass der Umfang der Seite gesprengt wird.)
Wenn man die folgende Abfrage durchführt
SELECT *
FROM Stadt, Staaten;
erhält man die folgende Tabelle
^Name ^Einwohnerzahl ^Fläche ^Staat ^Staat ^Sprache|
|Berlin |3,769 Mio |891,8 km² | Deutschland| Deutschland| Deutsch|
|Hamburg |1,845 Mio |755,2 km² | Deutschland| Deutschland| Deutsch|
|London |8,982 Mio |1572 km² |Großbritannien | Deutschland| Deutsch|
|Paris |2,176 Mio |105,34 km² |Frankreich | Großbritanien| Englisch|
|Berlin |3,769 Mio |891,8 km² | Deutschland| Großbritanien| Englisch|
|Hamburg |1,845 Mio |755,2 km² | Deutschland| Großbritanien| Englisch|
|London |8,982 Mio |1572 km² |Großbritannien | Großbritanien| Englisch|
|Paris |2,176 Mio |105,34 km² |Frankreich | Frankreich| Französisch|
|Berlin |3,769 Mio |891,8 km² | Deutschland| Frankreich| Französisch|
|Hamburg |1,845 Mio |755,2 km² | Deutschland| Frankreich| Französisch|
|London |8,982 Mio |1572 km² |Großbritannien | Frankreich| Französisch|
|Paris |2,176 Mio |105,34 km² |Frankreich | Deutschland| Deutsch|
Es wird also jede Zeile der ersten Tabelle mit jeder Zeile der zweiten Tabelle kombiniert. Uns interessieren aber nur die Zeilen, in der die Eigenschaft Staat der einen Tabelle mit der Eigenschaft Staat der zweiten Tabelle übereinstimmt. Da die Spalte Staat in beiden Tabellen auftritt, muss im SQL-Befehl der Spaltenname mit dem Tabellenname verknüpft werden:
SELECT *
FROM Stadt, Staaten
WHERE Stadt.Staat = Staaten.Staat;
Die Abfrage ergibt:
^Name ^Einwohnerzahl ^Fläche ^Staat ^Staat ^Sprache|
|Berlin |3,769 Mio |891,8 km² | Deutschland| Deutschland| Deutsch|
|Hamburg |1,845 Mio |755,2 km² | Deutschland| Deutschland| Deutsch|
|London |8,982 Mio |1572 km² |Großbritannien | Großbritanien| Englisch|
|Paris |2,176 Mio |105,34 km² |Frankreich | Frankreich| Französisch|
Eine solche Abfrage nennt man Verbund oder Join. Man kann sie auch wie folgt formulieren:
SELECT *
FROM Stadt JOIN Staaten
ON Stadt.Staat = Staaten.Staat;
Auf das Ergebnis des Verbunds lassen sich dann wiederum Projektion und Selektion anwenden.
====Video====
{{youtube>_mlw4mEl3LI}}
\\
====Aufgaben====
Lade die Datenbank Geo herunter und teste die Beispiele aus dem Video. Überlege dir eigene Beispiele und teste sie.
{{ :datenbanken:geo.zip |Datenbank Geo}}
=====Filtern von Daten=====
Projektion, Selektion und Verbund können kombiniert werden, um bestimmte Daten aus Datenbanktabellen herauszufiltern. Um die Filterung noch mehr zu verfeinern, können innerhalb der ''WHERE''-Klausel noch **logische** und **Vergleichsoperatoren** genutzt werden.
====Logische Operatoren====
^Operator ^Bedeutung |
|**AND** |logisches UND, ist dann wahr wenn beide Bedingungen wahr sind |
|**OR** |logisches ODER, ist dann wahr, wenn mindestens eine der Bedingungen wahr ist |
|**NOT** |logisches NICHT, ist dann wahr, wenn die Bedingung falsch ist |
[[datenbanken:sql_filtern_bsp#logische_operatoren|Beispiele]]
====Vergleichsoperatoren====
(Liste nicht vollständig)
^Operator ^Bedeutung |
| = |gleich|
|<> |ungleich |
|< |kleiner |
|> |größer |
|%%<=%% |kleiner gleich |
|>= |größer gleich |
|LIKE |Vergleich mit einem Muster, % steht für beliebig viele Zeichen, _ steht für ein Zeichen|
|BETWEEN |zusammenhängender Bereich, Start- und Endwert gehören nicht zum Bereich |
[[datenbanken:sql_filtern_bsp#vergleichsoperatoren|Beispiele]]
Neben logischen und Vergleichsoperatoren gibt es noch weitere Operatoren
====Operatoren die die Ausgabe verfeinern====
^Operator ^Bedeutung |
|AS |benennt den Spaltenname in der Ausgabe um |
|ORDER BY Spalte ASC |ordnet die Ausgabe nach der angegebenen Spalte aufsteigend (ASC kann weggelassen werden)|
|ORDER BY Spalte DESC |ordnet die Ausgabe nach der angegebenen Spalte absteigend|
|DISTINCT |gibt mehrfach vorkommende gleiche Datensätze nur einmal aus |
[[datenbanken:sql_filtern_bsp#verfeinerung_der_ausgabe|Beispiele]]
====Mathematische Operatoren====
^Operator ^Bedeutung |
|COUNT |gibt die Anzahl der Datensätze aus |
|MAX |gibt das Maximum der Datensätze aus |
|MIN |gibt das Minimum der Datensätze aus |
|AVG |gibt das arithmetische Mittel der Datensätze aus |
|+,-,*,/ |Operatoren für die Grundrechenoperationen |
[[datenbanken:sql_filtern_bsp#mathematische_operatoren|Beispiele]]
====Gruppieren der Ausgabe====
Mit dem Operator GROUP BY kann die Ausgabe in Gruppen zerlegt werden über die dann wieder SQL-Befehle angewendet werden können.
[[datenbanken:sql_filtern_bsp#gruppieren_der_ausgabe|Beispiel]]
====Geschachtelte SQL-Befehle====
In der WHERE-Klausel kann man wiederum einen vollständigen SQL-Befehl in Klammern verwenden.
[[datenbanken:sql_filtern_bsp#geschachtelte_select-ausdruecke|Beispiel]]
[[datenbanken:sql_filtern_bsp|Alle Beispiele zum Filtern von Daten >>]]
====Video====
Dieses Video bezieht sich auf die Datenbank "Literatur", die bei den Beispielen zum Filtern von Daten vorgestellt wird.
{{youtube>oRROpcFz1Es}}
\\
====Aufgaben====
Teste alle Beispiele aus dem Video und von der Beispielseite zum Filtern von Daten!
{{ :datenbanken:literatur.zip |}}