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\SHQIU'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