5. Datenabfrage mit SQL

Werbung
Informationsbestände analysieren
Datenabfrage mit SQL
5.
Datenabfrage mit SQL14
5.1.
Einige Infos zu SQL
SQL wurde Ende der 70er Jahre in den IBM Labors entwickelt und später als
Standard für relationale Datenbank eingeführt.
Bei SQL handelt es sich um eine deklarative Programmiersprache, d.h. dass nicht
das WIE – typisch bei prozeduralen (auch imperativen) Programmiersprachen wie
Pascal, C usw. – sonder das WAS im Vordergrund steht.
Was will ich von der Datenbank wissen?
Beispiel :
Zeige mir alle Datensätze von Peter Meier an der Hohlstrasse in Zürich, bei
denen der Kaufbetrag über Fr.100.- liegt und die Rechnung noch nicht
beglichen ist.
5.1.1. Sprachteile von SQL
SQL selbst setze sich aus diversen Sprachteilen zusammen, die je nach Aktion (des
Benutzers bzw. Administrators) zum Einsatz kommen.
Ebenen eines DB-Systems
SQL
Anwender 1
Anwender 2
DQL
DML
Externe
Sicht
Programm 1
Programm 2
DDL
DCL
TPL
ER
Konzeptionelle
Sicht
Logische Datenstruktur
Interne
Sicht
Physische Datenstruktur
Betriebssystem
File
ls -l
cd mydir
Hardware
Abbildung 54 :
14
SQL und Datenbanksystem
Structured Query Language
© René Probst
Jan 2004
5-1
Modul-100
Theorie
DQL
Data Query Language, beschreibt den Teil der Sprache, mit dem sich Daten aus
dem bestand der DB abfragen lassen
DML
Data Manipulation Language, beschreibt den Teil der Sprache, der für einfügen,
ändern und löschen von Daten zuständig ist.
DDL
Data Definitin Language, beschreibt den Teil der Sprache, der für die Definition der
Datentabellen und der Beziehungen benötigt wird.
DCL
Data Control Language, beschreibt den Teil, der für die sogenannte referentielle
Integrität der Daten verantwortlich ist.
Unter referentieller Integrität versteht man eine durch die Datenbank überwachte
Beziehung zwischen Tabellen.
Beispiel :
Wenn die Beziehung Person-Konto eine
referentielle Integrität aufweist, lässt sich
eine Person nicht löschen, solange ein
zugehörender Eintrag in der Tabelle Konto
existiert. Anderseits lässt sich in der
Tabelle Konto ein Datensatz nur
speichern, wenn auch eine Referenz auf
einen Eintrag in der Tabelle Person
besteht.
Person
PID
Name
Konto
KID
Person
Saldo
TPL
Transaction Programing Language, beschreibt den Teil der Sprache, der für
umfassende Lese-/Schreibvorgänge verwendet wird.
Unter einer Transaktion versteht man mehrere zusammengehörende SQLAnweisungen, die nur in ihrer Gesamtheit einen Sinn ergeben. Daher muss bei
deren Ausführung geprüft werden, ob alle Schritte korrekt abgelaufen sind, damit
dann die gemachten Änderungen in der Datenbank auch wirklich gültig sind.
Beispiel :
Vom Bankkonto von Frau Huber soll der Betrag von Fr. 540.05 abgebucht und
bei der Firma TopVersand wieder eingebucht werden. Wenn z.B. nach dem
Abbuchen das Computersystem einen Ausfall erfährt, würde der Betrag bei
Frau Huber fehlen, wäre aber bei der Firma TopVersand noch nicht
eingebucht, weshalb diese dann den Betrag wohl mahnen würde.
In diesem Beispiel muss die Transaktionskontrolle der Datenbank dafür sorgen,
dass die Änderungen temporär einmal festgehalten sind, dass aber die
tatsächlichen Buchungen erst nach Abschluss der gesamten Transaktion ausgeführt
werden. Nur so ist die Integrität der Daten gesichert.
5-2
Modul 100 V1.2b.doc
Abteilung Informatik/Technik
Informationsbestände analysieren
Datenabfrage mit SQL
5.2.
Erstellen von Abfragen mit SQL
5.2.1. Struktur der DB
Damit mittels SQL Daten aus einer Datenbank abgefragt werden können, müssen
alle Tabellen sowie deren Attribute und Beziehungen bekannt sein. Es ist also
wichtig, dass die Darstellung des ERD bekannt ist und auch interpretiert werden
kann.
Abbildung 55 :
Beispiel eines ERD in Access
5.2.2. Grundkonzept von SQL-SELECT
SQL wurde so konzipiert, dass auch „nicht Informatiker“ die Sprache für den
Umgang mit Datenbanken nutzen können. Man hat daher eine Syntax gewählt, die
sich stark an der Umgangssprache orientiert.
Beispiel :
Zeige mir alle Hobbys von Edit Hasler, die sie erst seit dem Jahr 2000 ausübt.
Dieser Satz muss für die Anwendung mittels SQL noch ein wenig strukturiert
werden. So müssen
alle Spalten genannt werden, von denen Informationen gelesen werden
alle beteiligten Tabellen genannt werden
Verknüpfungen der Tabellen angegeben werden (über die Schlüssel-Paare)
Beispiel :
Zeige mir Name und Vorname sowie alle Hobbys der Tabellen Hobby, Person
und PersonHobby, bei denen der Name „Hasler“ und der Vorname „Edith“
lautet und bei denen das Datum grösser als 2000 ist.
In SQL wird das wie folgt angeschrieben:
SELECT Person.Name, Person.Vorname, Hobby.Bezeichnung
FROM Person, PersonHobby, Hobby
WHERE Person.Name = 'Hasler' AND Person.Vorname = 'Edith' AND
PersonHobby.seit > 2000 AND
Person.PID = PersonHobby.Person AND
Hobby.HID = PersonHobby.Hobby
ORDER BY Person.Name ASC
Dieses Beispiel zeigt den grundlegenden Aufbau des SELECT-Befehls. Er besteht
aus
Befehl
SELECT
Attributliste
Tabelle.Attribut oder * (für alle Attribute)
Quelle
FROM Tabelle
Bedingung
WHERE ............................
GROUP BY / ORDER BY
© René Probst
Jan 2004
5-3
Modul-100
Theorie
5.2.3. Alle Zeilen einer Tabelle abfragen
Natürlich wollen wir als erstes nicht gleich eine so komplexe Abfrage betrachten. Wir
lesen zuerst einmal alle bzw. definierte Spalten einer Tabelle aus.
Beispiel :
Gesucht sind alle Personen die in der DB gespeichert sind
SELECT * FROM Person;
Abbildung 56 :
Beispiel :
SELECT : alle Spalten
Gesucht sind Name und Vorname aller Personen
SELECT Person.Name, Person.PLZ FROM Person;
Abbildung 57 :
SELECT : benannte Spalten
Der „vollqualifizierte Name“ einer Spalte setzt sich aus
Tabellenname.Attributname
zusammen und garantiert, dass bei komplexen Abfragen keine Verwechslung bei
gleich benannten Spalten auftreten können.
5.2.4. Sortieren von Daten
Daten lassen sich einfacher auswerten, wenn sie sortiert sind. Dabei können die
Werte jeder beliebigen Spalte in absteigender (DESC15) oder aufsteigender (ASC16)
Form ausgegeben werden. Zudem ist es auch möglich, mehrere Sortierebenen zu
definieren.
Beispiel :
Zeige alle Personen aufsteigend sortiert nach Name und absteigend sortiert
nach Vorname
SELECT * FROM Person
ORDER BY Person.Name ASC, Person.Vorname DESC;
ASC
DESC
Abbildung 58 :
15
16
5-4
SELECT : sortiert nach Spalten (auf- und absteigend)
descending
ascending
Modul 100 V1.2b.doc
Abteilung Informatik/Technik
Informationsbestände analysieren
Datenabfrage mit SQL
5.2.5. Kombinieren von Daten aus mehreren Tabellen
Wir haben im bisherigen Verlauf bereits gesehen, dass bei einer Relationale
Datenbank die Daten meist auf mehrere – über Schlüsselwerte verknüpfte –
Tabellen verteilt abgespeichert sind. Wenn also mehrere Tabellen in einer Selektion
verwendet werden, so muss der Datenbank mitgeteilt werden, welche Kriterien für
die Verknüpfung massgebend sind.
Beispiel :
Zeige alle Personen sowie deren Hobbys aufsteigend nach Namen sortiert.
SELECT Person.Name, Person.Vorname,
Hobby.Bezeichnung
FROM Person, PersonHobby, Hobby
WHERE Person.PID = PersonHobby.Person AND
Hobby.HID = PersonHobby.Hobby
ORDER BY Person.Name;
Abbildung 59 :
SELECT über mehrer verknüpfte Tabellen
Für die Veknüpfungsbeziehung zwischen den Tabellen werden die Schlüsselpaare
einander gleichgesetzt. Dabei sind immer Anzahl Tabellen minus 1 Bedingungen
nötig.
Abbildung 60 :
© René Probst
Verknüpfung über Schlüsselwert-Paare
Jan 2004
5-5
Theorie
Modul-100
5.2.6. Verdichten von Daten
In manchen Fällen ergeben sich beim Verknüpfen von mehreren Tabellen
Datensätze mit identischen Werten. Wenn aber für die Auswertung lediglich die
Wertekombinationen wichtig sind, aber nicht die Anzahl des Auftretens, so kann
über den Zusatz DISTINCT beim SELECT-Befehl eine Verdichtung der Daten erzielt
werden, in dem die Mehrfachausgabe inhaltlich gleicher Datensätze unterdrückt
wird.
Beispiel :
Zeige alle Personen sowie die Art der Hobbys die sie ausüben.
SELECT DISTINCT Person.Name, Person.Vorname, Art.Art
FROM Person, PersonHobby, Hobby, Art
WHERE Person.PID = PersonHobby.Person AND
Hobby.HID = PersonHobby.Hobby AND
Art.HAID = Hobby.Art
ORDER BY Person.Name;
Abbildung 61 :
5-6
SELECT ohne (links) und mit (rechts) DISTINCT
Modul 100 V1.2b.doc
Abteilung Informatik/Technik
Informationsbestände analysieren
Datenabfrage mit SQL
5.3.
Filtern von Daten
5.3.1. Die WEHRE Klausel
Eine Tabelle kann bezüglich der Werte ihrer Attribute gefiltert werden. D.h. dass nur
die Daten angezeigt werden, deren Wert dem Suchbegriff entsprechen.
Die Werte lassen sich dabei mit den bekannten Operatoren vergleichen.
Operator Bedeutung
=
Gleich
<
Kleiner als
>
Grösser als
<>
Ungleich
<=
Kleiner gleich
>=
Grösser gleich
Die Bedingung wird mit der WHERE-Klausel eröffnet
Beispiel :
Gesucht sind alle Personen deren Nachname mit A, B ...G beginnt.
SELECT * FROM Person
WHERE Person.Name < 'H';
Abbildung 62 :
Beispiel :
Gesucht sind alle Personen die im Dorf mit der Postleitzahl 9991 wohnen.
SELECT * FROM Person
WHERE Person.PLZ = 9991;
Abbildung 63 :
Beispiel :
Filter auf Zahlen
Gesucht sind alle Personen, die Meier heissen
SELECT * FROM Person
WHERE Person.Name = 'Meier';
Abbildung 64 :
© René Probst
Filter auf Zeichen
Filter auf Zeichenkette
Jan 2004
5-7
Modul-100
Theorie
Beispiel :
Zeige Name und Vorname der Personen, die ein Hobby erst seit dem Jahr
2000 betreiben.
SELECT DISTINCT Person.Name, Person.Vorname
FROM Person, PersonHobby
WHERE Person.PID = PersonHobby.Person AND
PersonHobby.seit >= #2000-01-01#;
Abbildung 65 :
Filter auf ein Datum
Die Angabe von Daten ist in den unterschiedlichen SQL-Implementierungen
verschieden. So wird bei Acces das Datum wie gezeigt mit #Jahr-Monat-Tag#
angeschrieben, während bei DB2 von IBM ’Tag.Monat.Jahr’ in der Form
’01.12.1985’ und bei Oracle mit ’15-feb-1975’ angegeben werden.
5.3.2. Der LIKE Operator
Der Versuch alle Personen die mit dem Buchstaben M beginnen über den Vergleich
Person.Name = ’M’
zu erhalten wird scheitern.
Um nach einem Muster zu suchen wird statt der mathematischen Operatoren der
LIKE-Operator verwendet.
Beispiel :
Zeige alle Personen, deren Name mit dem Buchstaben M beginnt.
SELECT Person.Name, Person.Vorname FROM Person
WHERE Person.Name LIKE 'M%';
Abbildung 66 :
Filter mit dem LIKE-Operator
Um nach Muster zu suchen können die Platzhalter % (für beliebige Zeichen) und _
(für genau ein Zeichen) verwendet werden.
5-8
Modul 100 V1.2b.doc
Abteilung Informatik/Technik
Informationsbestände analysieren
Datenabfrage mit SQL
5.3.3. Filter auf mehrere Attribute
Mittels logischer Operationen (UND, ODER, NICHT) lassen sich beliebig komplexe
Abfragen gestalten.
UND-Verknüpfung
Es werden zwei oder mehr Bedingungen genant, die alle erfüllt sein müssen.
Beispiel :
Zeige alle Personen, die an der Hauptstrasse in Vorstadt wohnen.
SELECT * FROM Person
WHERE Person.Adresse LIKE 'Haupt%' AND
Person.Ort = 'Vorstadt';
Abbildung 67 :
Filter auf UND-Verknüpfte Attribute
ODER-Verknüpfung
Es werden zwei oder mehr Bedingungen genannt, von denen eine zutreffen muss.
Beispiel :
Zeige alle Personen, die an einer Strasse die mit Haupt- bzw. Dorf- beginnt
wohnen.
SELECT * FROM Person
WHERE Person.Adresse LIKE 'Haupt%' OR
Person.Adresse LIKE 'Dorf%';
Abbildung 68 :
Filter auf ODER-Verknüpfte Attribute
NICHT-Verknüpfung
Die Bedeutung der Aussage wird durch den NOT-Operator invertiert. Dabei ist es
wichtig, dass durch Klammerung der Teil der Aussage gekapselt wird, der nicht
zutreffen darf.
Beispiel :
Zeige alle Personen, die nicht an der Hauptstrasse in Vorstadt wohnen
SELECT * FROM Person
WHERE Person.Adresse NOT LIKE 'Haupt%' AND
Person.Ort = 'Vorstadt';
Abbildung 69 :
© René Probst
Filter mit NICHT-Operator
Jan 2004
5-9
Theorie
Modul-100
Operationsreihenfolge
Wie in der Mathematik die Regel Punkt-vor-Strich gilt, wird bei logischen
Operationen immer zuerst die UND-Funktion ausgewertet und erst dann die ODERFunktion.
Es ist daher wichtig, dass durch korrekte Klammerung die gewünschte Aussage
erzielt wird.
Beispiel :
Zeige alle Personen aus Winterdorf, die an einer Strasse die mit Haupt- bzw.
Dorf- beginnt wohnen.
SELECT * FROM Person
WHERE Person.Adresse LIKE 'Haupt%' OR
Person.Adresse LIKE 'Dorf%' AND
Person.Ort = 'Winterdorf';
Abbildung 70 :
UND/ODER-Verknüpfung ohne Klammerung
Offensichtlich ist das erzielte Ergebnis nicht korrekt, da nebst Winterdorf auch
weitere Ortschaften ausgegeben werden.
In diesem Fall wird die UND-Verknüpfung nur auf die ODER-Verknüpfung
Person.Adresse LIKE ’Dorf%’
angewendet, was sichtlich falsch ist.
Beispiel :
Korrekte Formulierung des SQL-Befehls
SELECT * FROM Person
WHERE( Person.Adresse LIKE 'Haupt%' OR
Person.Adresse LIKE 'Dorf%') AND
Person.Ort = 'Winterdorf';
Abbildung 71 :
5-10
UND/ODER-Verknüpfung mit Klammerung
Modul 100 V1.2b.doc
Abteilung Informatik/Technik
Informationsbestände analysieren
Datenabfrage mit SQL
5.3.4. Bereichsprüfungen
Auswahl
Wenn aus einer bestimmten Menge von Werten einige zutreffen sollen, so kann dies
durch eine Auflistung mit ODER-Operationen erfolgen. Einfacher und sicherer ist
aber der Einsatz des IN-Befehls.
Beispiel :
Zeige alle Personen die in Winterdorf bzw. Sportdorf wohnen
SELECT * FROM Person
WHERE Ort IN ('Winterdorf', 'Sportdorf');
Abbildung 72 :
IN-Befehl
Bereich
Anstelle eines Grösser-Kleiner-Vergleichs mit UND-Operation kann der BETWEENBefehl verwendet werden.
Beispiel :
Zeige alle Personen, mit Postleitzahlen zwischen 7000 und 9000.
SELECT * FROM Person
WHERE PLZ BETWEEN 6999 AND 9000;
Abbildung 73 :
© René Probst
BETWEEN-Befehl
Jan 2004
5-11
Theorie
5.4.
Modul-100
Schnitt- und Vereinigungsmenge zweier Tabellen
Union
Wenn es darum geht, aus einer Menge von unterschiedlichen Zuordnungen die
Vereinigungsmenge zu bilden, kann der UNION-Befehl verwendet werden.
Er verknüpft zwei Abfragen zu einer gemeinsamen Menge
Beispiel :
Aus zwei Tabellen „Fussball“ und „Handball“ sollen alle erfassten Personen in
einer gemeinsamen Auflistung erscheinen.
SELECT Name FROM Fussball
UNION
SELECT Name FROM Handball;
Die Union Operation zeigt – ähnlich dem DISTINCT-Befehl – identische Einträge nur
einmal an. Sollen trotzdem alle Datensätze gezeigt werden –also auch redundante
Einträge – wird der Befehl UNION ALL verwendet.
Fussball
Abbildung 74 :
Handball
Vereinigungsmenge
Intersect
Oft interessiert aber gerade, welche Datensätze in zwei Tabellen enthalten sind.
Hier geht es also um die Schnittmenge. Sie kann durch den INTERSECT-Befehl
erzeugt werden.
Beispiel :
Aus den beiden Tabellen „Handball“ und „Fussball“ sollen alle jene Personen
aufgelistet werden, die in beiden Tabellen erfasst sind.
SELECT Name FROM Fussball
INTERSECT
SELECT Name FROM Handball;
Fussball
Abbildung 75 :
5-12
Handball
Schnittmenge
Modul 100 V1.2b.doc
Abteilung Informatik/Technik
Informationsbestände analysieren
Datenabfrage mit SQL
Minus
Soll nun die Menge aller Datensätze gezeigt werden, die entweder in der einen oder
der andern Tabelle – aber eben nicht in beiden- zufinden sind, wird der MINUSBefehl verwendet.
Beispiel :
Zeige alle Personen die nur in der Tabelle Fussball aber nicht in der Tabelle
Handball stehen.
SELECT Name FROM Fussball
MINUS
SELECT Name FROM Handball;
Fussball
Abbildung 76 :
© René Probst
Handball
Differenzmenge
Jan 2004
5-13
Modul-100
Theorie
5.5.
Aggregierende Funktionen
5.5.1. GROUP BY-Klausel
Wenn die Daten nicht mehr in ihrer ursprünglichen tabellarischen Form sondern
durch (mathematische) Operationen verdichtet sind, spricht man bei RDB’s von
Aggregierung.
Damit Aggregats-Funktionen eingesetzt werden können, müssen bestimmte
Datenwert mehrfach (redundant) in der Abfrage vorkommen. Dabei ist es wichtig,
dass das Attribut bzw. die Attribute nach denen gruppiert wird in der GROUP BY
Klausel aufgelistet werden.
Regel :
Alle Attribute die in der SELECT Anweisung genannt sind und keine AggregatsFunktion zugewiesen haben, müssen in der GROUP BY-Klausel aufgelistet werden.
5.5.2. COUNT-Funktion
Werden zu einem Attributswert mehrere andere Werte aufgelistet (wie das z.B. bei
Person und Hobby der Fall ist), so kann nach der Anzahl der Nennungen gefragt
werden.
Beispiel :
Zeige die Anzahl der Hobbys jeder Person
SELECT Person.PID, Person.Name, Person.Vorname,
Count(PersonHobby.Hobby) AS Hobbyanzahl
FROM Person, PersonHobby
WHERE Person.PID=PersonHobby.Person
GROUP BY Person.PID, Person.Name, Person.Vorname
ORDER BY Person.Name;
Abbildung 77 :
COUNT-Funktion
Die AS-Klausel
Wird durch eine Aggregation ein neues Ergebnis erzielt, kann mit der AS-Klausel die
Beschriftung der Spalte festgelegt werden.
5-14
Modul 100 V1.2b.doc
Abteilung Informatik/Technik
Informationsbestände analysieren
Datenabfrage mit SQL
Schlüsselattribute
Damit bei der Gruppierung keine Fehler entstehen, ist es wichtig, dass immer auch
das Schlüsselattribut der Tabelle eingefügt wird, nach der gruppiert wird. In obigem
Beispiel würden sonst die beiden “Meier“ als eine Person mit 5 Hobbies
ausgegeben!
5.5.3. Summierung von Zahlenwerten
Nebst der Anzahl zutreffender Beziehungen ist die Summenbildung eine wichtige
Aggregatsfunktion. Nur so lässt sich z.B. mittels einer DB eine automatisierte
Rechnungsstellung realisieren.
Wichtig dabei ist, dass sich nebst der Spalte mit den zu addierenden Werten keine
weiteren abweichenden Daten in der Abfrage wiederfinden.
Beispiel :
Wieviel Aufwand betreibt jede Person für all ihre Hobbys?
SELECT Person.PID, Person.Name, Person.Vorname,
SUM(PersonHobby.Aufwand) AS Aufwand
FROM Person, PersonHobby
WHERE Person.PID = PersonHobby.Person
GROUP BY Person.PID, Person.Name, Person.Vorname
ORDER BY Person.Name;
Abbildung 78 :
SUM-Funktion
5.5.4. AVG-Funktion
Oft ist es interessant zu wissen, was ein bestimmtes Attribut im Mittel (Durchschnitt)
ergibt.
Beispiel :
Wieviele Stunden werden im Durchschnitt für das Hobby im Jahr
aufgewendet?
SELECT AVG(Aufwand) AS 'Aufwand im Durchschnitt'
FROM PersonHobby;
Abbildung 79 :
© René Probst
AVG-Funktion
Jan 2004
5-15
Theorie
Modul-100
5.5.5. MIN/MAX-Funktion
Nebst dem Durchschnitt ist auch das Minimum und das Maximum oft von Interesse,
weil sich dadurch gewisse Aussagen über die Streuung von Datenwerte bezüglich
dem Durchschnitt machen lassen.
Beispiel :
Wieviel Zeit wird im Minimum, im Maximum und im Durchschnitt für das
Hobby pro Jahr aufgewendet?
SELECT MIN(PersonHobby.Aufwand) AS Minimum,
AVG(PersonHobby.Aufwand) AS Durchschnitt,
MAX(PersonHobby.Aufwand) AS Maximum
FROM PersonHobby;
Abbildung 80 :
5-16
MIN- und MAX-Funktion
Modul 100 V1.2b.doc
Abteilung Informatik/Technik
Informationsbestände analysieren
Datenabfrage mit SQL
5.5.6. Ein Beispiel
Ein Lehrer führt alle seine Prüfungsdaten in einer Datenbank. Die Struktur sieht wie
folgt aus:
Abbildung 81 :
Datenbank „Noten“
Es sollen folgende Aussagen abgerufen werden:
1.
Minimum, Maximum und Durchschnitt einer Prüfung
2.
Minimum, Maximum und Durchschnitt eines Fachs
3.
Minimum, Maximum und Durchschnitt eines Fachs eines Schülers
4.
Minimum, Maximum und Durchschnitt aller Noten eines Schülers
Beispiel :
Es ist die Auswertung der ersten Mathe Prüfung vom 26.8.2003 zu erstellen!
SELECT MIN(Noten.Note) AS Min, AVG(Noten.Note) AS Avg,
MAX(Noten.Note) AS Max
FROM Noten, Test
WHERE Noten.Datum = Test.TID AND
Test.Datum = #2003-08-26#;
Abbildung 82 :
Beispiel :
Es ist die Auswertung für das Fach Französisch zu erstellen!
SELECT MIN(Noten.Note) AS Min, AVG(Noten.Note) AS
Schnitt,
Max(Noten.Note) AS Max
FROM Noten, Fach
WHERE Noten.Fach = Fach.FID AND
Fach.Bezeichnung = 'Franz';
Abbildung 83 :
© René Probst
Daten der Prüfung vom 26.8.2003
Daten des Fachs „Französisch“
Jan 2004
5-17
Modul-100
Theorie
Beispiel :
Es sind die Mathe-Noten für Bea Auf der Mauer auszuwerten!
SELECT Schueler.Name, Schueler.Vorname,
MIN(Noten.Note) AS Min, AVG(Noten.Note) AS
Schnitt,
Max(Noten.Note) AS Max
FROM Noten, Fach, Schueler
WHERE Noten.Fach = Fach.FID AND
Noten.Schuler = Schueler.PID AND
Fach.Bezeichnung = 'Mathe' AND
Schueler.Name LIKE "auf*"
GROUP BY Schueler.Name, Schueler.Vorname
Abbildung 84 :
Beispiel :
Es ist eine Statistik aller Fächer für Tomy Schneider zu erstellen
SELECT Schueler.Name, Schueler.Vorname, Fach.Bezeichnung,
MIN(Noten.Note) AS Min, AVG(Noten.Note) AS
Schnitt,
Max(Noten.Note) AS Max
FROM Noten, Fach, Schueler
WHERE Noten.Fach = Fach.FID AND
Noten.Schuler = Schueler.PID AND
Schueler.Name LIKE "schnei*"
GROUP BY Schueler.Name, Schueler.Vorname,
Fach.Bezeichnung
Abbildung 85 :
5-18
Daten von Bea Auf der Mauer in Mathe
Daten von Tomy Schneider
Modul 100 V1.2b.doc
Abteilung Informatik/Technik
Informationsbestände analysieren
Datenabfrage mit SQL
5.5.7. HAVING-Klausel
Wir haben zu beginn dieses Abschnitts gelernt, dass aggregierende Funktionen wie
COUNT,SUM usw. die GROUP BY-Klausel erfordern.
Wenn eine Aggregation aber auch noch ein Bedingung erfüllen muss, so genügt die
WHERE-Klausel nicht mehr. Für solche Fälle muss nach der GROUP BY-Klausel
die HAVING-Klausel folgen.
Beispiel :
Es sollen alle Personen aufgelistet werden, die für ihre Hobbys mehr als 250
Stunden im Jahr aufwenden.
SELECT Person.PID, Person.Name, Person.Vorname,
SUM(PersonHobby.Aufwand) AS Aufwand
FROM Person, PersonHobby
WHERE Person.PID = PersonHobby.Person
GROUP BY Person.PID, Person.Name, Person.Vorname
HAVING SUM(PersonHobby.Aufwand) > 250
ORDER BY Person.Name;
Abbildung 86 :
HAVING-Klausel
Die HAVING-Klausel kann auch eine komplexe Abfrage mit AND, OR, BETWEEN,
IN usw. enthalten.
Beispiel :
Zeige alle Personen, die jährlich zwischen 250 und 400 Stunden für ihre
Hobbys aufwenden.
SELECT.....
.....
HAVING SUM(PersonHobby.Aufwand) BETWEEN 250 AND 400
....
Abbildung 87 :
© René Probst
HAVING-Klausel mit komplexem Vergleich
Jan 2004
5-19
Theorie
5.6.
Modul-100
Bedeutung der Verknüpfung
Wir haben bereits im vorher gehende Kapitel die Bedeutung von Inner- und OuterJoin behandelt und gehen daher hier nicht mehr auf deren Bedeutung ein, sondern
schauen uns nur noch die Umsetzung in SQL an.
Sowohl Inner- als auch Outer-Join sind nicht Bestandteil des ANSI-Standards. Sie
sind wohl in irgendeiner Weise in den meisten Datenbanken implementiert, die
Schreibweise zwischen den Produkten variiert aber!
5.6.1. Inner-Join
Der Inner-Join verbindet zwei oder mehr Tabellen über die Schlüssel-Paare, wobei
auf die WHERE-Klausel - wie weiter oben gezeigt – verzichtet werden kann.
Beispiel :
Abfrage aller Personen die ein Beziehung zu Hobby haben, wobei über die
Entität ’PersonHobby’ ein Schlüssel-Fremdschlüssel Paar geprüft wird.
SELECT Person.PID, Person.Name, Person.Vorname
FROM Person
INNER JOIN PersonHobby ON Person.PID = PersonHobby.Person
GROUP BY Person.PID, Person.Name, Person.Vorname;
Abbildung 88 :
Resultat der Abfrage mit Inner-Join
Die Tabelle Person weist wohl 20 Einträge auf. Da aber offenbar eine Person keine
Hobbys hat, werden beim Inner-Join nur die 19 Datensätze angezeigt, die
mindestens einen korrespondierenden Eintrag in der Tabelle PersonHobby haben.
5-20
Modul 100 V1.2b.doc
Abteilung Informatik/Technik
Informationsbestände analysieren
Datenabfrage mit SQL
Bei mehr als zwei Tabellen wird die JOIN-Klausel durch Klammern geordnet als
„Kette“ von Verknüpfungen angeschrieben.
Beispiel :
Zeige die Hobbys aller Personen.
SELECT Person.PID, Person.Name, Person.Vorname,
Hobby.Bezeichnung
FROM Hobby
INNER JOIN (Person INNER JOIN PersonHobby
ON Person.PID = PersonHobby.Person)
ON Hobby.HID = PersonHobby.Hobby
GROUP BY Person.PID........
5.6.2. Outer-Join
Beim Outer-Join wird unterschieden, ob aus der erst bzw. zweit genannte Tabelle
alle Datensätze angezeigt werden sollen. Bei Access unterscheidet man daher den
• LEFT JOIN
• RIGHT JOIN
Beispiel :
Zeige alle Personen sowie den allfälligen Aufwand, den sie jährlich für ihre
Hobbys aufwenden.
SELECT Person.PID, Person.Name, Person.Vorname,
Sum(PersonHobby.Aufwand) AS [Summe von Aufwand]
FROM Person
LEFT JOIN PersonHobby ON Person.PID = PersonHobby.Person
GROUP BY Person.PID, Person.Name, Person.Vorname;
Abbildung 89 :
Outer-Join auf Tabelle Person
Das Ergebnis zeigt wie erwartet 20 Personen an, wobei für Grainer Hendrik kein
Eintrag in der Tabelle PersonHobby existiert und somit auch kein Aufwand
berechnet werden kann.
© René Probst
Jan 2004
5-21
Theorie
Modul-100
5.6.3. Outer-Join bei m:m-Beziehungen
Bei QBE haben Sie gelernt, dass die gewünschte Abfrage in zwei Schritten zu
realisieren ist. So ähnlich verhält es sich auch bei SQL, nur dass hier die eine
SELECT-Anweisung als Unterabfrage in einer andern SELECT-Anweisung stehen
kann.
Unterabfragen werden aber hier nicht weiter behandelt!
Beispiel :
Es sollen alle Personen und auch deren Hobbys gezeigt werden.
Dazu müssen die Tabellen ’Hobby’ und ’PersonHobby’ in einer Unterabfrage
verknüpft werden, so dass die Spalten
- Hobby.Bezeichnung und
- HobbyPerson.Person
verfügbar sind. .
SELECT Person.PID, Person.Name, Person.Vorname, T.Hobby
FROM Person
LEFT JOIN (
SELECT Bezeichnung AS Hobby, Person AS ID
FROM Hobby
INNER JOIN PersonHobby ON Hobby.HID = PersonHobby.Hobby
GROUP BY Hobby.Bezeichnung, PersonHobby.Person) T
ON Person.PID = T.ID
Damit die Spalten der Unterabfrage selektiert werden können, muss diese einen
Namen erhalten, in diesem Fall T. Über diesen Namen werden dann die selektierten
Spalten angesprochen, wobei auch diese einen Alias-Namen erhalten (über die ASKlausel)
Abbildung 90 :
5-22
Outer-Join mit Unterabfrage bei m:m-Beziehung
Modul 100 V1.2b.doc
Abteilung Informatik/Technik
Informationsbestände analysieren
Datenabfrage mit SQL
Kapitel 5 : Eigene Notizen
© René Probst
Jan 2004
5-23
Theorie
5-24
Modul 100 V1.2b.doc
Modul-100
Abteilung Informatik/Technik
Herunterladen