Kapitel 4 (Teil 1/3)

Transcription

Kapitel 4 (Teil 1/3)
64/'LH6SUDFKHUHODWLRQDOHU'%06
64/'LH6SUDFKHUHODWLRQDOHU'%06
‰ Basierend auf dem Tupelkalkül und der relationalen Algebra wurden mit dem
Aufkommen relationaler DBMS auch spezielle Sprachen entwickelt.
–
SQL ist die derzeit marktbeherrschende Anfragesprache
–
Von praktischer Bedeutung waren auch noch bis Ende der 80er Jahre:
a) QBE (Query by Example, basierend auf dem Domainkalkül)
b) Quel (Anfragesprache von Ingres basierend auf dem Tupelkalkül).
Bei Anfragesprachen wird unterschieden zwischen der
‰ Datendefinitionssprache (DDL)
– Anlegen und Ändern der Datenstrukturen für die drei Ebenen einer Datenbank
(externe Ebenen, konzeptionelle Ebene, physische Ebene)
–
Festlegen von Integritätsbedingungen
– Festlegen der Zugriffsrechte
‰ Datenmanipulationssprache (DML)
–
Einfügen, Ändern und Löschen von Datenobjekten
– Formulieren von Anfragen
Seite 93 von 122
+LVWRULH
64/'LH6SUDFKHUHODWLRQDOHU'%06
‰ SQL (structured query language) wurde bei IBM als Sprache des relationalen DBMS
System R entwickelt (1974, ''&KDPEHUOLQHWDO)
‰ Heute ist SQL quasi der Standard für Sprachen relationaler DBMS
–
SQL1, 1985
–
SQL2, 1992 (wird auch als SQL92 bezeichnet)
–
SQL3 (SQL:1999 und SQL 2003)
‰ SQL wird als interaktive Sprache eingesetzt, kann aber auch durch eine geeignete
Kopplung in einer Programmiersprachen wie z. B. C und Java genutzt werden.
‰ SQL kann als eine Mischform aus einer erweiterten relationalen Algebra und dem
Tupelkalkül verstanden werden.
Anmerkung
‰ Das offizielle Dokument, in dem der Standard von SQL beschrieben wird, ist sehr groß,
so dass im Rahmen dieser Vorlesung deshalb nur die wichtigsten Konzepte von SQL
vorgestellt werden können.
‰ Viele Hersteller wie Oracle haben in ihren Systemen Erweiterungen von SQL
implementiert.
Seite 94 von 122
64/'LH6SUDFKHUHODWLRQDOHU'%06
/H[LNDOLVFKH(OHPHQWH
‰ Wie jede andere Programmiersprache besitzt SQL lexikalische Elemente
–
Leerzeichen, Zeilenumbruch und Tabulatoren trennen lexikalische Elemente
Bezeichner
‰ Bezeichner werden benutzt, um Namen an Datenbanken, Relationen und Attribute zu
vergeben.
‰ Aufbau eines Bezeichners
–
Erstes Zeichen ist ein Buchstabe.
–
Weiterhin können darin Zahlen und _ enthalten sein.
–
Bezeichner müssen sich von einem Schlüsselwort unterscheiden
Konstanten (Literale)
‰ sehr ähnlich zu den Konstanten in üblichen Programmiersprachen
‰ Gewöhnungsbedürftig sind Konstanten von Zeichenketten:
–
´Gerd´ ist eine Konstante
–
Einige DBMS unterstützen auch andere Formate.
Seite 95 von 122
''/
64/'LH6SUDFKHUHODWLRQDOHU'%06
Vorbemerkungen
‰ Im Folgenden werden nun einige wichtige Aspekte bei der Datendefinition erläutert ohne
jedoch auf viele der angebotenen Optionen einzugehen.
‰ Wir werden beispielhaft die Definition von Datenstrukturen der konzeptionellen Ebene
(Relation) erläutern
–
Definition von Datenstrukturen der internen Ebene (Index) und der externen Ebene
(View) erfolgt später.
Aufbau des Kapitels:
‰ Datentypen
‰ Definition von Relationen
‰ Einfache Integritätsbedingungen
Seite 96 von 122
'DWHQW\SHQ
64/'LH6SUDFKHUHODWLRQDOHU'%06
‰ Datenbanksysteme bieten eine sehr reichhaltige Palette von Datentypen an, die sich bis
auf einen Kern erheblich unterscheiden.
–
Zum Teil findet man gleiche Datentypen mit unterschiedlichen Namen.
–
Auch wenn die Namen gleich sind, werden nicht die gleichen Operationen
angeboten oder unterschiedliche Namen für die gleiche Methode.
‰ Heutige Systeme unterstützen auch die Definition benutzerdefinierter Datentypen
–
Interbase bietet hierfür einen speziellen Befehl an.
‰ Klassifizierung
–
Zeichenketten
–
Zahlen
–
Individuelle Erweiterungen, die es in nahezu allen DBMS gibt:
binäre Daten (BLOB), Texte (CLOB), Date
–
DBMS spezifische Datentypen
‰ Die unterschiedlichen Datentypen tragen insbesondere dazu bei, dass eine Kopplung von
SQL-Datenbanken nicht so einfach ist.
Seite 97 von 122
6WDQGDUGW\SHQ
64/'LH6SUDFKHUHODWLRQDOHU'%06
Zeichenketten
‰ FKDU(VL]H)
Zeichenkette mit konstanter Länge VL]H
–
Maximallänge ist abhängig vom System.
–
FKDU spezifiziert eine Zeichenkette mit einem Zeichen.
‰ YDUFKDU(VL]H)
variabel lange Zeichenkette mit maximaler Länge VL]H
– Bedarfsorientierter Speicherplatzverbrauch
‰ Die maximale Größe für VL]H hängt von dem spezifischen DBMS ab, z. B. 8000 bei SQL
Server. Wird VL]H nicht angegeben, so hat die Zeichenkette die Länge 1.
‰ Unicode-Unterstützung durch spezielle Typen: QFKDU, QYDUFKDU
Operationen auf Zeichenketten
‰ Relationale Operatoren: =, <>, <, <=, =>, > sind überall verfügbar, aber die Semantik
kann je nach DBMS sich unterscheiden.
‰ Weitere Operatoren im SQL92 Standard (der aber in dieser Form nicht von allen DBMS
unterstützt wird):
–
|| ist z. B. die Verknüpfung von zwei Zeichenketten
Seite 98 von 122
=DKOHQ
64/'LH6SUDFKHUHODWLRQDOHU'%06
‰ QXPHULF(J,G) bzw. GHFLPDO(J,G)
–
Gleitkommazahlen mit:J = #Gesamtstellen, G = #Nachkommastellen
‰ Darüber hinaus gibt es die üblichen Datentypen:
LQWHJHU, VPDOOLQW, UHDO, GRXEOHSUHFLVLRQ
‰ Operationen
– *, /, +, –
und noch viele andere. Z. B.: DEV
spezielle Datentypen
‰ Die oben genannten Datentypen sind in ihrer Größe erheblich eingeschränkt. Anfang der
90er Jahre wurde dieses Defizit durch Einführung neuer Datentypen gemildert.
ORQJ:
–
variabel lange Zeichenkette mit maximal 2 GB.
–
Erhebliche Einschränkungen bei der Anfragebearbeitung
FOREEORE: variabel lange Zeichenfolge / Bytefolge mit maximal 4 GB
‰ GDWH/WLPH
'DWHQW\SHQIU'DWXPXQG8KU]HLW
–
date unterstützt ein Datum bis zum Jahr 9999
Seite 99 von 122
64/'LH6SUDFKHUHODWLRQDOHU'%06
'HILQLWLRQQHXHU'DWHQW\SHQ
‰ In SQL lassen sich neue Wertebereiche anlegen, indem bestehende Wertebereiche
eingeschränkt werden.
– Syntax:
create domain Name![as] <Datentyp> [<Defaultwert>] [<Integritätsbedingung>]
–
Beispiel:
create domain Adresse varchar(50) default 'Marburg'
‰ Weiterhin können Datentypen zur Laufzeit verändert
–
alter domain …
und gelöscht werden.
–
drop domain Adresse
Bemerkung
‰ Es handelt sich hierbei um eine sehr eingeschränkte Form der Definition von Datentypen.
Es ist dadurch z. B. nicht möglich, strukturierte Datentypen zu definieren.
‰ Syntax dieses Befehl ist nicht für alle DBMS einheitlich
Seite 100 von 122
64/'LH6SUDFKHUHODWLRQDOHU'%06
$QOHJHQHLQHV5HODWLRQHQVFKHPDV
Eine Beispielgrammatik zur Definition eines Subsets
‰ create table <Relationen-Name>
(<Relationenkomponente>[,<Relationenkomponente>]*)
‰ <Relationenkomponente> ::= <Spaltendefinition> | <Integritätsbedingung>
‰ <Spaltendefinition>::= <Attributname> <Typ> [<Defaultwert>] [not null | unique]
‰ <Defaultwert>::= default <Literal> | null
‰ Die genaue Behandlung von Integritätsbedingungen erfolgt später. Im weiteren werden
wir einige Möglichkeiten exemplarisch erläutern.
Beispiele basieren auf dem folgenden Datenbankschema:
Kunde (KName, KAdr, Kto)
Auftrag (KName, Ware, Menge)
Lieferant (LName, LAdr, Ware, Preis)
Seite 101 von 122
64/'LH6SUDFKHUHODWLRQDOHU'%06
Beispiel
create table Kunde(
KName char (20) not null,
KAdresse varchar (50) not null unique,
Kto
decimal (7) not null, /* decimal(7) ist eine Kurzform von decimal(7,0) */
primary key (KName)
)
Anmerkungen zu den Integritätsbedingungen
‰ unique drückt aus, dass dieses Attribut ein Schlüsselkandidat ist. Wird ein
Schlüsselkandidat durch mehrere Attribute A1, …, An gebildet, so wird dies durch die
Integritätsbedingung unique (A1,…,An) angegeben.
‰ not null sagt aus, dass das Attribut explizit belegt werden muss. Es dürfen keine NullWerte auftreten.
‰ Durch primary key (A1,…,An) wird festgelegt, dass die Attributmenge {A1,…,An} der
Primärschlüssel der Relation ist.
–
Direkt hinter dem Attribut, wenn Primärschlüssel aus einem Attribut besteht.
‰ Durch Angabe eines Defaultwertes wird beim Einfügen eines Tupels dieser Wert zur
Initialisierung benutzt, wenn explizit keine Wertzuweisung vorgenommen wurde.
Seite 102 von 122
64/'LH6SUDFKHUHODWLRQDOHU'%06
Beispiel:
create table Auftrag(
KName char(20) not null,
Ware
varchar(50) not null,
Menge decimal(7) default 100,
primary key (KName, Ware),
foreign key(KName) references Kunde(KName)
)
Anmerkungen zu den Integritätsbedingungen
‰ Ein Fremdschlüssel kann über die Intergritätsbedingung foreign key angegeben werden.
Damit wird sichergestellt, dass das Tupel mit dem Schlüssel tatsächlich in der Relation
(in unserem Beispiel ist das die Relation Kunde) existiert.
–
Beim Einfügen eines neuen Tupels muss deshalb eine entsprechende Überprüfung
stattfinden (was zu einem hohen Berechnungsaufwand führen kann).
–
Entsprechend muss beim Löschen eines Tupels aus einer Relation geprüft werden,
ob eine Referenz auf dieses Tupel existiert.
Seite 103 von 122
%HLVSLHO
64/'LH6SUDFKHUHODWLRQDOHU'%06
‰ Betrachten wir unsere Datenbank mit den Relationen Maschinen, Personal, Abteilung, …
‰ Die Relationen der Datenbank werden dann durch folgende Befehle angelegt:
–
create table Maschinen(mnr int primary key, mname varchar(10))
–
create table Personal(pnr int primary key,
pname varchar(10),
vorname varchar(10),
abtnr int foreign key references Abteilung(abtnr), lohn char(2))
–
create table leitet(pnr int primary key foreign key references Personal(pnr),
abtnr int foreign key references Abteilung(abtnr))
–
create table Abteilung(abtnr int primary key, aname varchar(10))
–
create table pmzuteilung(pnr int foreign key references Personal(pnr),
mnr int foreign key references Maschinen(mnr),
note int,
constraint pk primary key (pnr,mnr))
Seite 104 von 122
64/'LH6SUDFKHUHODWLRQDOHU'%06
bQGHUQ/|VFKHQHLQHV5HODWLRQHQVFKHPD
bQGHUQHLQHV5HODWLRQHQVFKHPDV
alter table <Relationen-Name> add <Relationenkomponente>
Besonderheiten
‰ Prinzipiell ist die Syntax und Semantik solcher Befehle stark von dem jeweiligen
Systemhersteller abhängig.
/|VFKHQHLQHV5HODWLRQHQVFKHPDV
drop table <Relationen-Name>
Seite 105 von 122
64/'LH6SUDFKHUHODWLRQDOHU'%06
'0/*UXQGNRQ]HSWH
‰ Anfragen an die Datenbank werden in der DML formuliert
‰ Grundschema:
z.B.
select KName
select < Liste von Attributsnamen >
from Kunde
from < ein oder mehrere Relationennamen >
where Kto < 1000
[ where< Bedingung > ]
Bemerkungen:
‰ Die select-Klausel entspricht der Projektion in der relationalen Algebra (und nicht der
Selektion).
‰ Die Bedingung nach der where-Klausel enthält
1. Vergleichsoperatoren (<, >, = ... )
2. boolesche Operatoren (and, or , not)
3. Mengenoperatoren (in, not in) und Quantoren (exists, any, some, all)
Reihenfolge der Ausführung wird durch Klammern bestimmt.
‰ Attribute mit gleichen Namen, die zu verschiedenen Relationen gehören, werden mittels
des Relationennamen unterschieden.
Seite 106 von 122
64/'LH6SUDFKHUHODWLRQDOHU'%06
$OJHEUD2SHUDWLRQHQLQ64/
‰ Relation R
select *
from R
Bei Angabe von “*” in der select-Klausel werden alle Attribute der Relation aus der
from-Klausel ausgegeben.
‰ Projektion S $ & R
select distinct A, C
from R
Ohne das Schlüsselwort distinct würde als Ergebnis eine M-Relation erzeugt werden.
‰ Selektion V % = E 5
select *
from R
where B = b
‰ kartesisches Produkt 5 u 6
select *
from R, S
Seite 107 von 122
64/'LH6SUDFKHUHODWLRQDOHU'%06
‰ Theta-Join auf Relationen R(A,B) und S(C,D) 5 %T' 6
select *
from R, S
where B T D
‰ Vereinigung der Relationen R(A,B) und T(A,B)
select * from R
union
select * from T
‰ Differenz der Relationen R und T
select * from R /* Dies wird nicht in Interbase unterstützt */
except
select * from T
‰ Allgemeine Bedeutung der “select … from … where”-Klausel in der relationalen
Algebra:
select distinctA,B,C,..
S A,B,C,} V F R u S u T u }
R,S,T,...
from
F
where
Damit ist insbesondere die Reihenfolge bei der Verarbeitung der Klausel bestimmt.
Seite 108 von 122
64/'LH6SUDFKHUHODWLRQDOHU'%06
Bemerkungen zu der Duplikatbeseitigung
‰ Die gewöhnliche select-Klausel beseitigt keine Duplikate in der Ergebnisrelation. Dies ist
aber durch Hinzufügen des Schlüsselworts GLVWLQFW möglich:
select distinct A, B, C, …
from R,S,T,…
where Bedingung
Durch GLVWLQFW wird als Ausgabe eine Relation erzeugt. Ansonsten wird eine M-Relation
ausgegeben.
‰ Die minus-Operation auf zwei Multi-Mengen entspricht der Semantik, wie wir sie bereits
bei der erweiterten relationalen Algebra kennengelernt haben. Das Schlüsselwort minus
wird nur von Oracle benutzt. In SQL92 wird stattdessen das Schlüsselwort except
benutzt.
–
except all entspricht der Summendifferenz der erweiterten relationalen Algebra
‰ Bei der Vereinigung auf Relationen werden automatisch Duplikate beseitigt. Dies gilt
auch für M-Relationen. Sollen Duplikate nicht beseitigt werden, muss hinter dem
Schlüsselwort union das Schlüsselwort all folgen.
Seite 109 von 122
%HLVSLHODQIUDJHQ
64/'LH6SUDFKHUHODWLRQDOHU'%06
Datenbankschema (zur Erinnerung):
Kunde (KName, KAdr, Kto)
Auftrag (KName, Ware, Menge)
Lieferant (LName, LAdr, Ware, Preis)
Welche Lieferanten liefern Milch oder Mehl?
select distinct LName
from Lieferant
where Ware = ’Mehl’ or Ware = ’Milch’
Welche Lieferanten liefern irgendetwas, das Huber bestellt hat?
select distinct LName
from Lieferant, Auftrag
where Lieferant.Ware = Auftrag.Ware and KName = ’Huber’
Seite 110 von 122
)URP.ODXVHO
64/'LH6SUDFKHUHODWLRQDOHU'%06
‰ Innerhalb einer From-Klausel können auch Tupelvariablen definiert werden.
…
from Lieferant L /* L Ist eine Tupelvariable */
…
‰ Damit kann nun über die Tupelvariable die Attribute in der Relation L angesprochen
werden.
–
Dies ist notwendig, wenn Attribute mit gleichem Namen in den Relationen
existieren. Z. B. dann, wenn ein Join einer Relation mit sich selbst ausgeführt wird.
select distinct L1.LName, L2.LName, L1.Adresse
from Lieferant L1, Lieferant L2
where L1.Adresse = L2.Adresse
–
Man beachte, dass bei Angabe eines Attributs die Tupelvariable (bzw.
Relationennamen) angegeben werden muss, es sei denn das Attribut kann eindeutig
einer Relation in der from-Klausel zugeordnet werden.
‰ In einer from-Klausel können nicht nur physische Relationen angegeben werden, sondern
auch wiederum Anfragen auftreten:
select L1.LName
from (select LName, Ware from Lieferant where Ware = 'Kaffee') L1
Seite 111 von 122
64/'LH6SUDFKHUHODWLRQDOHU'%06
–
Dann muss zwingend auch eine Tupelvariable benutzt werden. Diese Möglichkeit
wird aber noch nicht in allen DBMS unterstützt
Joins in der From-Klausel
‰ Die Joinbedingung kann sowohl direkt in der from-Klausel als auch in der where-Klausel
angegeben werden. Letzteres wird in allen Systemen unterstützt.
‰ Natural Join /* Wird nicht von Interbase, SQL Server, … unterstützt */
… from R natural join S …
oder
… from R join S using (
T -Join (auch als inner join bezeichnet)
… from R join S on A T B …
‰ left outer join
… from T left join S on A T B …
‰ right outer join
… from T right join S on A T B …
‰
Bemerkung
‰ Im wesentlichen wurde diese Notation zur Formulierung von äußeren Joins eingeführt.
Seite 112 von 122
64/'LH6SUDFKHUHODWLRQDOHU'%06
(LQIDFKH)RUPHOQLQ:KHUH.ODXVHOQ
‰ In einer where-Klausel wird eine Boolesche Funktion angegeben, die im Wesentlichen
einer Formel des Tupelkalküls entspricht. Wir wollen zunächst einfache Formeln
betrachten.
Im wesentlichen setzen sich Formeln aus Atomen der Form A op B zusammen,
‰ op ist die Menge relationaler Operatoren
‰ Diese Atome können mit den Operatoren not, or und and zu komplexeren Formeln
verknüpft werden.
‰ Dabei können sich A und B nicht nur auf Attribute bzw. Konstanten beziehen, sondern
können komplexere Terme sein, die durch Verwendung der üblichen Operationen
definiert werden.
–
Bei numerischen Werten sind dies unter anderem die 4 Grundoperationen.
Weiterhin können alle im DBS angebotenen Operationen wie z. B. abs verwendet
werden.
–
Bei Zeichenketten umfasst dies insbesondere die Konkatenation “||”.
Seite 113 von 122
64/'LH6SUDFKHUHODWLRQDOHU'%06
Weitere Varianten von atomaren Formeln:
‰ Das Schlüsselwort and kommt nochmals als Bestandteil eines anderen Operators vor:
–
A between B and C
–
Diese Boolesche Funktion ist äquivalent zu B <= A and A <= C
‰ Ein im Zusammenhang mit Strings wichtiger Operator in der where-Klausel ist like.
–
A like B
Hierbei wird überprüft, ob die Zeichenkette A gleich der Zeichenkette B ist. Der Term
kann nicht nur eine gewöhnliche Zeichenkette sein, sondern auch Wildcards enthalten:
–
% bedeutet, dass hier beliebig viele Zeichen stehen können.
–
_ bedeutet, dass genau ein beliebiges Zeichen hier steht.
Beispiel:
select KName
from Kunde
where KAdresse like '%b_rg'
‰ Eine weitere atomare Formel benutzt das Schlüsselwort in:
–
A in (b,c,…,z)
Dabei ist A ein beliebiger Ausdruck und b,…,z Konstanten.
Dieser Ausdruck is äquivalent zu
–
A = b or A = c or … or A = z
Seite 114 von 122
1XOOZHUWH
64/'LH6SUDFKHUHODWLRQDOHU'%06
‰ SQL benutzt zur Unterstützung von Nullwerten in Anfragen eine dreiwertige Logik.
‰ Beispiel
–
Annahme: Es gibt ein Tupel ('Schneider', 'Lampen', NULL) in Relation Auftrag.
–
Sowohl
select * from Auftrag where Menge > 100
als auch
select * from Auftrag where not Menge > 100
liefert uns nicht das Tupel als Ergebnis.
‰ Wir benötigen noch eine Möglichkeit, um Tupel mit Nullwerten zu finden. Dazu bedient
man sich in SQL92 des Schlüsselworts is:
–
select * from Auftrag where Menge is null
liefert die Tupel, deren Attribut 0HQJH keinen Wert (also null) besitzt.
Bemerkung
‰ Man könnte auch ein relationales Modell ohne die Verwendung von NULL-Werten
entwickeln.
‰ NULL-Werte werden unterschiedlich in den kommerziellen DBMS verarbeitet.
Seite 115 von 122
6HOHFW.ODXVHO
64/'LH6SUDFKHUHODWLRQDOHU'%06
‰ Die Select-Klausel wird als letztes bei der SQL-Anfrage ausgeführt.
‰ Wurde eine Relation R berechnet, so werden durch
select * …
die Tupel mit allen Attributen der Relation R ausgegeben.
‰ Entsprechend können alle Attribute eine am Join beteiligten Relation S durch
select S.* from S,… where …
ausgegeben werden.
‰ Prinzipiell kann als Ergebnis in der select-Klausel ein Ausdruck stehen, der von mehreren
Attributen abhängt. Man kann nun durch das Schlüsselwort as einer Spalte explizit einen
neuen Namen zuweisen.
select A*B as X from R
Man kann dabei das Schlüsselwort as auch einfach weglassen.
‰ Zur Wiederholung: select distinct beseitigt Duplikate, wohingegen select all dies nicht
macht (Default ist select all)
Seite 116 von 122
64/'LH6SUDFKHUHODWLRQDOHU'%06
$JJUHJDWIXQNWLRQHQ
‰ In SQL werden folgende Aggregatfunktionen angeboten: count, sum, avg, min und max
–
Aggregate dürfen nur in der select-Klausel einer Anfrage auftreten. Man beachte,
dass die select-Klausel zuletzt angewendet wird und dass zuvor eine Relation R als
Zwischenergebnis bereits berechnet wurde.
–
Bei der Berechnung eines Aggregats wird eine Relation mit einem Tupel erzeugt.
–
Als Parameter eines Aggregats ist ein Ausdruck erlaubt. Das Aggregat count kann
auch als Parameter einen “*” besitzen. Dann wird als Ergebnis die Anzahl der Tupel
der Relation R geliefert.
–
Bei Angabe des Schlüsselworts GLVWLQFW vor dem Ausdruck werden zunächst die
Duplikate beseitigt, die durch Auswertung des Ausdrucks auf der Relation R
entstehen. Danach wird das eigentliche Aggregat berechnet wird.
‰ Die Aggregatfunktionen min, max und count können auf beliebige Ausdrücke
angewendet werden. Die Funktionen sum und avg erwarten als Eingabe eine Zahl.
–
min berechnet das Minimum
–
max berechnet das Maximum
–
count die Anzahl der Terme
– sum berechnet die Summe aller Terme
–
avg berechnet den Durchschnitt über alle Terme.
Seite 117 von 122
64/'LH6SUDFKHUHODWLRQDOHU'%06
Beispiele
‰ Wieviele Liter Milch wurden insgesamt bestellt?
select sum (Menge)
from Auftrag
where Ware = ’Milch’
‰ Wieviele Lieferanten mit verschiedenen Namen gibt es?
select count (distinct LName)
from Lieferant
‰ Berechne die Anzahl der Lieferanten, die Milch liefern, sowie deren durchschnittliche,
minimale und maximale Liefermenge.
select count(KName), min(Menge), avg(Menge), max(Menge)
from Auftrag
where Ware = ’Milch’
Nullwerte und Aggregate
‰ Nullwerte werden bei der Berechnung eines Aggregats nicht berücksichtigt, mit
Ausnahme von count(*).
‰ Ist die Eingabe für das Aggregat leer, wird als Ergebnis null geliefert. Nur bei count wird
der Wert 0 zurück gegeben.
Seite 118 von 122
*UXSSLHUXQJ
64/'LH6SUDFKHUHODWLRQDOHU'%06
Allgemeinere Form der “select...from...where”-Klausel:
select .....
from.....
[where.....]
[group by <group-by-expression>[,<group-by-expression>]*]
[having < Bedingung>]
[order by <order-expression>]
³JURXSE\´.ODXVHO
‰ Diese wird nach der where-Klausel ausgeführt, aber noch vor der select-Klausel.
‰ Zunächst werden anhand der Attribute in der Klausel Äquivalenzklasse gebildet.
–
Zwei Tupel sind in der gleichen Klasse, wenn diese bzgl. der in der Klausel
spezifizierten Attribute gleich sind.
‰ Pro Klasse wird dann durch die select-Klausel ein Tupel erzeugt. Die select-Klausel
besteht dabei nur aus
– Aggregaten, die dann auf die Gruppen angewendet werden.
– Attributen, die bereits in der group_by-Klausel aufgetreten sind.
Seite 119 von 122
64/'LH6SUDFKHUHODWLRQDOHU'%06
Bemerkung
‰ Wird für das group-by Attribut der Wert NULL angenommen, so wird eine
entsprechende Gruppe eröffnet.
³KDYLQJ´.ODXVHO
‰ Filtern der durch die group_by-Klausel erzeugten Gruppen anhand einer Bedingung
– Es dürfen nur Argumente mit einem Wert pro Gruppe auftreten.
–
Innerhalb einer having-Klausel sind Aggregate erlaubt (im Gegensatz zur whereKlausel)
Beispiel:
select LName
from Lieferant
where Preis > 100
group by LName
having count (*) > 5
Seite 120 von 122
64/'LH6SUDFKHUHODWLRQDOHU'%06
³RUGHUE\´.ODXVHO
order by [asc|desc] A1,…,[asc|desc] An
‰ Durch diese Klausel wird die Ausgabe des SQL-Befehls sortiert ausgegeben, wobei die
Sortierreihenfolge bzgl. den angegebenen Attributen erfolgt (absteigend: desc oder
aufsteigend: asc). Statt eines Attributs kann auch ein Ausdruck benutzt werden.
‰ Sind mehrere Kriterien angegeben, so wird nach deren lexikographischer Ordnung
sortiert.
‰ Die order-by Klausel ist die letzte Klausel in einem SQL-Befehl
‰ Unterschied zwischen SQL92 und dem SQL von Oracle
– Bei SQL92 kann nur ein Attribut (Ausdruck) in der order-by Klausel verwendet
werden, das auch in der select-Klausel vorzufinden ist.
–
Bei Oracle und Interbase kann auch bzgl. Attributen sortiert werden, die nicht in der
select-Klausel auftreten.
‰ Beim Sortieren wird nullentwederstets als höchster oder kleinster Wert interpretiert
(unabhängig ob asc oder desc angegeben wurde).
–
Welche der beiden Möglichkeiten gewählt wird, hängt vom zugrundeliegenden
DBMS ab.
Seite 121 von 122
%HLVSLHOH
64/'LH6SUDFKHUHODWLRQDOHU'%06
‰ Erstelle eine alphabetisch geordnete Liste aller Waren, in der für jede Ware der minmale,
der maximale und der Durchschnittspreis angegeben ist!
select
Ware, min (Preis) as MinP, max (Preis) as MaxP, avg (Preis) as AvgP
Lieferant
from
Ware
group by
order by
Ware
‰ Welche Waren werden nur von einem Lieferanten geliefert?
Ware
select
from
Lieferant
Ware
group by
count(*) = 1
having
‰ Sortiere die Bestellungen nach Waren, für jede Ware die Kunden nach der Größe der
Bestellung!
select
*
Auftrag
from
Ware, Menge desc
order by
Seite 122 von 122