4 Die Datenbankanfragesprache SQL © Prof. Dr.-Ing. Wolfgang Lehner | > Einleitung © Prof. Dr.-Ing. Wolfgang Lehner | SQL | 2 > Bestandteile einer Datenbanksprache Datendefinitionssprache (DDL = data definition language) Sprache zur Manipulation des Datenbankschemas (Meta-) Daten zur Beschreibung des Schemas (data dictionary) erlaubt die Spezifikation von weiteren Implementierungsdetails Datenmanipulationssprache (DML = data manipulation language) Aufgabe des Benutzers Einfügen, Löschen und Ändern von Datenobjekten in (aus) der Datenbank Suche nach Datenobjekten in der Datenbank Aufgabe des Datenbanksystems Übersetzung einer Anfrage, die ein Benutzer mittels von Objekten seiner externen Ebene formuliert hat, in eine Anfrage, die auf Objekten der physischen Ebene effizient ausgeführt werden kann. © Prof. Dr.-Ing. Wolfgang Lehner | SQL | 3 > Datenbankanfragesprachen Typen von Datenbanksprachen Prozedurale Datenbanksprachen Tupel- oder satzorientiert Programmierer denkt in Satzfolgen Navigation über Zugriffspfade durch die vorhandenen Daten (findNext(), FindFirst() ) Deskriptive Datenbanksprachen Mengenorientiert (typisch für das Relationenmodell) Programmierer denkt in Mengen von Sätzen mit bestimmten Eigenschaften Zugriff erfolgt durch inhaltliche Kriterien (… alle Sätze mit der Eigenschaft …) Zentral In prozeduralen Datenbankanfragesprachen wird spezifiziert, WIE das Datenbanksystem etwas zu suchen hat In deskriptiven Datenbankanfragesprachen wird spezifiziert, WAS das Datenbanksystem zu suchen hat © Prof. Dr.-Ing. Wolfgang Lehner | SQL | 4 > Structured Query Language (= SQL) Standardisierte Datenbanksprache (durch ISO) inzwischen von jedem relationalem DBS unterstützt (entsprechend viele Dialekte) entwickelt am IBM Research Lab in San Jose (CA) für das erste protypische relationale Datenbanksystem R (ca. 1974) entworfen, um für den Laien benutzbar zu sein. … ist sie aber wohl doch nicht! Erfordernisse einer vollständigen DB-Sprache Möglichkeiten zur Datendefinition und Anfrage Möglichkeiten zum Änderungsdienst (Einfügen, Löschen, Modifizieren einer Menge von Tupeln) Definition von Sichten, physischen Hilfsmitteln, Integritätsbedingungen, … Zugriffskontrolle im Sinne des Datenschutzes Möglichkeiten zur Kopplung mit einer Wirtssprache Eigenschaften Einsatz als interaktive Sprache und in Programmiersprachen (z. B. C, C++, …) Mischform aus relationaler Algebra und relationalem Kalkül mit einigen Erweiterungen (arithmetische Ausdrücke und Aggregatsfunktionen) © Prof. Dr.-Ing. Wolfgang Lehner | SQL | 5 > SQL-Standard und DBMS Realisierung des SQL Standards Bis 1992 enthielt der Standard minimale Anforderungen, die die gängigen Datenbanksysteme weitgehend erfüllten 1992 erster "kompletter" Standard DBMS erfüllen die Niveau‘s "intermediate" und "full" nur unzureichend SQL:1999 nimmt sehr viele neuen Anforderungen auf nach zu langer Entwicklungszeit nicht der wahre Erfolg DBMS 'hinken' hinterher Befehle werden nur teilweise implementiert oder sind nicht in der standardisierten Form vorhanden. Es wird der Funktionsumfang in inkompatibler Weise erweitert, um sich von der Konkurrenz abzugrenzen bzw. einen Marktvorteil zu erlangen. Meist ist der Standard den Implementierungen im Datenbanksystem voraus. …in einzelnen Features sind DBMS der Standardisierung voraus © Prof. Dr.-Ing. Wolfgang Lehner | SQL | 6 > Datendefinitionssprache (DDL) © Prof. Dr.-Ing. Wolfgang Lehner | SQL | 7 > SQL Datentypen Standardtypen (z.B. in ORACLE) CHAR(size) NUMBER(g,d) VARCHAR(size) DATE DECIMAL(s) Zeichenkette mit konstanter Länge size, size < 266 g = #Gesamtstellen, d = #Nachstellen var. lange Zeichenkette mit maximaler Länge size (< 2000) Datum: Jahr, Monat, …, Sekunde s = #Stellen der Dezimalzahl Spezielle Typen LONG CLOB LONG RAW BLOB ROWID XML © Prof. Dr.-Ing. Wolfgang Lehner | variabel lange Zeichenkette mit maximal 2 GB maximal ein Attribut vom Typ LONG in einer Relation evtl. eingeschränkte Form der Anfragebearbeitung variabel lange Bytekette mit maximal 2 GB Typ einer Pseudospalte, die Schlüsselkandidat ist Typ zur Ablage eines XML-Dokumentes SQL | 8 > Anlegen einer Relation nachfolgende Beispiele basieren auf dem folgenden Datenbankschema Kunde (KName, KAdr, Kto) Auftrag (KName, Ware, Menge) Lieferant (LName, LAdr, Ware, Preis) CREATE TABLE: Relationenschema anlegen Syntax CREATE TABLE <Relationen-Name> (<Spaltendefinition>[, <Spaltendefinition>]*) wobei <Spaltendefinition>::=<Attributname> <Typ> [NOT NULL] Beispiel CREATE TABLE Kunde (KName CHAR(20) NOT NULL, KAdresse VARCHAR(50), Kto DECIMAL(7)) Beachte: NOT NULL sagt aus, dass das Attribut explizit belegt werden muss!!! Es dürfen keine NULL-Werte auftreten. © Prof. Dr.-Ing. Wolfgang Lehner | SQL | 9 > Ändern und Löschen einer Relation ALTER TABLE: Relationenschema ändern Syntax ALTER TABLE <Relationen-Name> ADD <Attributname> <Typ> Beachte: Eine Spalte wird rechts außen hinzugefügt, wobei NOT NULL nicht erlaubt ist. Werte des neuen Attributes bestehender Tupel werden mit Nullwerten belegt. DROP TABLE: Relationenschema löschen Syntax DROP TABLE <Relationen-Name> © Prof. Dr.-Ing. Wolfgang Lehner | SQL | 10 > Erzeugen einer Indexstruktur CREATE INDEX: Index anlegen Indexe dienen der Verbesserung der Anfragezeit bezieht sich auf ein Attribut bzw. eine Menge von Attributen in kommerziellen Systemen: B-Bäume sowie Hashverfahren • Syntax CREATE [UNIQUE] INDEX <INDEX-Name> ON <Relationen-Name> (<Attributname> [<Ordnung>][, <Attributname> [<Ordnung>]]*) [CLUSTER] wobei gilt: <Ordnung> ::= ASC|DESC UNIQUE: Für alle Attributsnamen keine zwei Tupel mit gleichen Werten erlaubt -> erfüllt Schlüsselbedingung. CLUSTER: Die Tupel der Relation werden tatsächlich in die Indexstruktur eingefügt und nicht nur die Verweise (Primärindex) -> nur ein Cluster-Index pro Relation. Beispiel CREATE UNIQUE INDEX Kunden_idx ON Kunde (KName, KAdresse) DROP INDEX: Index löschen Syntax DROP INDEX <Index-Name> © Prof. Dr.-Ing. Wolfgang Lehner | SQL | 11 > Erzeugen einer Datenbankansicht CREATE VIEW: Sichten anlegen Sichten entsprechen externen DB-Schemata In relationalen Systemen werden Sichten als (abgeleitete) Relationen aufgefasst, die durch Anfragen definiert werden. Syntax CREATE VIEW <Sicht-Name> [(Attributname>[, <Attributname>]*)] AS <subquery> Beispiel CREATE VIEW Gute Kunden AS SELECT * FROM Kunde WHERE Kto > 10 Beachte: Das Schlüsselwort '*' stellt die Kurzschreibweise für die gesamte Attributliste der in der FROM-Klausel angegebenen Relationen dar. DROP VIEW: Sichten löschen Syntax: DROP VIEW <Sicht-Name> © Prof. Dr.-Ing. Wolfgang Lehner | SQL | 12 > Datenmanipulationssprache (DML) © Prof. Dr.-Ing. Wolfgang Lehner | SQL | 13 > Grundschema für Abfragen Grundschema zur Formulierung einer Anfrage in der DML SELECT <Liste von Attributen> FROM <ein oder mehrere Relationen> [WHERE <Bedingung>] SELECT KName FROM Kunde WHERE Kto < 0 Bemerkungen SELECT-Klausel entspricht der Projektion in der relationalen Algebra (und nicht der Selektion). Die Bedingung nach der WHERE-Klausel enthält Vergleichsoperatoren (<, >, = …) boolsche Operatoren (AND, OR, NOT) Mengenoperatoren (IN, NOT IN) und Quantoren (ANY, SOME, ALL) Reihenfolge der Ausführung wird durch Klammern bestimmt Attribute mit gleichen Namen, die zu verschiedenen Relationen gehören, werden mittels des Relationsnamen unterschieden (Punktnotation) Beispiel: R.A, S.B, wobei R, S Relationen und A, B Attribute bezeichnen. © Prof. Dr.-Ing. Wolfgang Lehner | SQL | 14 > Algebra-Operationen in SQL Relation R SELECT * FROM R Projektion πA,C(R) SELECT FROM R DISTINCT A, C -- keine standardmäßige Duplikateeleminierung !!! Selektion σB=b(R) SELECT * FROM R WHERE B = b Kartesisches Produkt R x S SELECT * FROM R, S © Prof. Dr.-Ing. Wolfgang Lehner | SQL | 15 > Algebra-Operationen in SQL (2) Theta-Join auf Relationen R(A,B) und S(C,D): RBΦDS SELECT * FROM R, S WHERE B Φ D Vereinigung der Relationen R und T (R und T haben die gleichen Attribute) SELECT * FROM R UNION SELECT * FROM T Differenz der Relationen R und T (R und T haben die gleichen Attribute) SELECT * FROM R MINUS SELECT * FROM T © Prof. Dr.-Ing. Wolfgang Lehner | SQL | 16 > Algebra-Operationen in SQL (3) Allgemeine Bedeutung "SELECT … FROM … WHERE" - Klausel SELECT A, B, C, … FROM R, S, T, … WHERE Bedingung entspricht in der relationalen Algebra πA,B,C, …(σBedingung(R x S x T x …)) Bemerkung Die SELECT-Klausel alleine beseitigt keine Duplikate in der Ergebnisrelation. Duplikateeliminierung wird durch Hinzufügen des Schlüsselwortes "DISTINCT" erzwungen. SELECT DISTINCT A, B, C, … FROM R, S, T, … WHERE Bedingung © Prof. Dr.-Ing. Wolfgang Lehner | SQL | 17 > Beispielanfragen Beispielszenario Kunde (KName, KAdr, Kto) Auftrag (KName, Ware, Menge) Lieferant (LName, LAdr, Ware, Preis) Welche Lieferanten liefern "CD-Rom-" oder "DVD-Drives"? SELECT DISTINCT LName FROM Lieferant WHERE WARE = 'CD-Rom' OR WARE = 'DVD' Welche Lieferanten liefern irgendetwas, das Huber bestellt hat? SELECT DISTINCT LName FROM Lieferant, Auftrag WHERE Lieferant.Ware = Auftrag.Ware AND Kname = 'Huber' © Prof. Dr.-Ing. Wolfgang Lehner | SQL | 18 > Sprachelemente jenseits der relationalen Algebra © Prof. Dr.-Ing. Wolfgang Lehner | SQL | 19 > Sprachelemente jenseits der rel. Algebra Eigenschaften von Aggregatsfunktionen Transformation, Verdichtung einzelner Tupel zu einem Gesamtwert Funktion COUNT() kann auf eine Menge von Tupeln angewendet werden Funktionen SUM(), AVG(), MIN() und MAX() können auf eine Menge von Zahlen, die als Spalte einer Relation gegeben ist, angewandt werden. Zusätzlich stehen die statistischen Größen STDDEV() (Standardabweichung) und VARIANCE() (Varianz) zur Verfügung. Wieviele Lieferanten gibt es? SELECT COUNT(DISTINCT LName) FROM Lieferant Wieviele DVD-Laufwerke sind insgesamt bestellt? SELECT SUM(Menge) FROM Auftrag WHERE Ware = 'DVD' © Prof. Dr.-Ing. Wolfgang Lehner | SQL | 20 > Gruppieren und Ordnen Erweiterte Form der "SELECT … FROM … WHERE" - Klausel SELECT ….. FROM ….. [WHERE …..] [GROUP BY <Liste von Attributen> [HAVING <Bedingung>]] [ORDER BY <Liste von Attributen>] "GROUP BY" - Klausel Tupel mit gleichen Werten für die angegebenen Attribute werden in Gruppen zusammengefasst Pro Gruppe erzeugt die Anfrage ein Tupel der Ergebnisrelation deshalb: hinter der SELECT-Klausel sind nur Attribute mit einem Wert pro Gruppe zugelassen © Prof. Dr.-Ing. Wolfgang Lehner | SQL | 21 > Gruppieren und Ordnen (2) "HAVING" - Klausel Auswahl der Gruppen anhand der Bedingung (es dürfen nur Argumente mit einem Wert pro Gruppe auftreten) "ORDER BY" - Klausel wird nach der WHERE-, GROUP BY- und HAVING-Klausel ausgeführt. Ergebnisrelation wird nach einem oder mehreren Attributen absteigend (DESC) oder aufsteigend (ASC) sortiert. Beispiel SELECT LName FROM Lieferant GROUP BY LName HAVING COUNT(*) > 5 Merke COUNT(X) zählt jeweils nur die Anzahl von Werten in X mit von NULL verschiedenen Werten! © Prof. Dr.-Ing. Wolfgang Lehner | SQL | 22 > Beispiel zur Aggregation und Sortierung Erstelle eine alphabetisch geordnete Liste aller Waren, in der für jede Ware der minimale, maximale und der Durchschnittspreis angegeben ist. SELECT Ware, MIN(Preis), MAX(Preis), AVG(Preis) FROM Lieferant GROUP BY Ware ORDER BY Ware Welche Waren werden nur von einem Lieferanten geliefert? SELECT Ware FROM Lieferant GROUP BY Ware HAVING COUNT(*) = 1 Sortiere die Bestellungen nach Waren, für jede Ware nach der Größe der Bestellung SELECT * FROM Auftrag ORDER BY Ware, Menge DESC © Prof. Dr.-Ing. Wolfgang Lehner | SQL | 23 > Innere und äußere Verbundoperationen Alternative Schreibweise zur "normalen" Verbundoperation SELECT * FROM x, y WHERE x.z = y.z kann analog formuliert werden als SELECT * FROM x INNER JOIN y ON x.z = y.z Outer-Joins unterschieden werden: rechte, linke und vollständige Outer-Joins SELECT * FROM x RIGHT OUTER JOIN y ON x.z = y.z SELECT * FROM x LEFT OUTER JOIN y ON x.z = y.z SELECT * FROM x FULL OUTER JOIN y ON x.z = y.z © Prof. Dr.-Ing. Wolfgang Lehner | SQL | 24 > Tabellenausdrücke In der FROM-Klausel kann ein beliebiger SELECT-Ausdruck stehen SELECT * FROM (SELECT x, y, z FROM …) TempTab WHERE … der geschachtelten Tabelle muss ein Name zugewiesen werden kann auch ein (beliebiger externer) Funktionsaufruf sein! Beispiel Gemeinsamer Durchschnittspreis von CD-Rom und DVD-Laufwerken SELECT AVG(Preis) SELECT AVG(Preis) FROM (SELECT Preis FROM TABLE (JavaGetPrices(…)) x FROM Lieferant -- beliebige Java-Fkt! WHERE Ware = 'CD-Rom' OR Ware = 'DVD') x © Prof. Dr.-Ing. Wolfgang Lehner | SQL | 25 > Tupelvariablen Benennung von Relationen Anfragen sollen auch Relationen mit sich selber verknüpfen können dafür notwendig die Benennung von Relationen -> Tupelvariablen Beispiele Gesucht sind Namen und Adressen aller Kunden, deren Kontostand kleiner als der von Huber ist. SELECT K1.KName, K1.KAdr FROM Kunde K1, Kunde K2 WHERE K1.Kto < K2.Kto AND K2.KName = 'Huber' Finde alle Paare von Lieferanten, die eine gleiche Ware liefern. SELECT DISTINCT L1.LName, L2.LName FROM Lieferant L1, Lieferant L2 WHERE L1.Ware = L2.Ware AND L1.LName < L2.LName © Prof. Dr.-Ing. Wolfgang Lehner | SQL | 26 > Geschachtelte Anfragen Prinzip der geschachtelten Anfragen Bedingungen in der WHERE-Klausel können die folgende Form haben: Subquery muss eine Relation mit einem Attribut liefern <Attributname> IN <subquery> oder Bedingung ist wahr, falls Subquery nicht leer ist [NOT] EXISTS <Subquery> Beispiel Welche Lieferanten liefern irgendetwas, das Huber bestellt hat? SELECT DISTINCT LName FROM Lieferant WHERE Ware IN (SELECT Ware FROM Auftrag WHERE KName = 'Huber') Wie kann die gleiche Anfrage formuliert werden, ohne dabei eine Subquery zu benutzen? © Prof. Dr.-Ing. Wolfgang Lehner | SQL | 27 > Weitere Sprachelemente von SQL © Prof. Dr.-Ing. Wolfgang Lehner | SQL | 28 > Weitere Sprachelemente von SQL Verwendung von "ALL" und "SOME/ANY" Einige Anfragen mit Allquantoren können durch den ALL-Operator formuliert werden. Gib für alle Waren die Namen der günstigsten Lieferanten aus! SELECT Name, Ware FROM Lieferant L WHERE Preis <= ALL (SELECT Preis FROM Lieferant WHERE Ware = L.Ware) Eine Bedingung mit SOME bzw. ANY ist erfüllt, wenn sie für mindestens ein Element der Menge erfüllt ist. Arithmetische Ausdrücke in der SELECT-Klausel Gib die Preise der Waren der einzelnen Lieferanten in DM an! SELECT LName, Ware, Preis * 1,9554 FROM Lieferant © Prof. Dr.-Ing. Wolfgang Lehner | SQL | 29 > Weitere Sprachelemente von SQL (2) Suche nach Teilstrings Schreibweise: <Attributname> LIKE <Zeichenmuster> SELECT * FROM Kunde WHERE KAdr LIKE '%Dresden%' Beachte Das SQL-Schlüsselzeichen '%' repräsentiert einen beliebigen String, während '_' ein einziges Zeichen markiert. Negierte Form: KAdr NOT LIKE '%Dresden%' ist äquivalent zu NOT(KAdr LIKE '%Dresden%' Test auf NULL-WERT Schreibweise: <Attributname> IS [NOT] NULL Gib alle Kundennamen aus, deren Adresse in der Datenbank nicht gespeichert ist! SELECT KName FROM Kunde WHERE KAdr IS NULL © Prof. Dr.-Ing. Wolfgang Lehner | SQL | 30 > Semantik von NULL-Werten Typen von NULL-Werten not applicable zeigt an, dass ein Sachverhalt nicht anwendbar ist, bzw. ein Wert in der realen Welt nicht vorkommt Beispiel: Typ des Videosystems bei einer Waschmaschine not available zeigt an, dass ein Wert (noch) nicht bekannt ist Beispiel: Typ des Videosystems bei einem Videorecorder Beachtenswert im Umgang mit NULL-Werten es gilt immer: (NULL == NULL) ist immer falsch! COUNT(X) = 0, falls die Werte in X keinen von NULL verschiedenen Wert aufweisen! © Prof. Dr.-Ing. Wolfgang Lehner | SQL | 31 > Änderungsoperationen © Prof. Dr.-Ing. Wolfgang Lehner | SQL | 32 > Tupelkonstruktor Konstruktion eines Tupels aus mehreren Attributwerten: VALUES () VALUES (4711); 1 ----------4711 VALUES (CURRENT DATE); 1 ----------03/23/2009 VALUES ('Wolfgang', 'Lehner', 'Dresden'), ('Hartmut', 'Wedekind', Erlangen); 1 2 3 -------------- -------------- -------------Wolfgang Lehner Dresden Hartmut Wedekind Erlangen VALUES (CURRENT TIMESTAMP - '2009-01-08-03.50.00.000000'); 1 -------------------------------310930085355.773001 © Prof. Dr.-Ing. Wolfgang Lehner | SQL | 33 > Änderungsoperationen INSERT: Einfügen von Tupeln INSERT INTO <Relationen-Name>[(<Attributname> [, <Attributname>]*)] VALUES (<Konstante> [, Konstante]*) oder INSERT INTO <Relationen-Name>[(<Attributname> [, <Attributname>]*)] SELECT … FROM … WHERE … DELETE: Löschen von Tuplen DELETE FROM <Relationen-Name> [WHERE <Bedingung>] UPDATE: Verändern von Tupeln UPDATE <Relationen-Name> SET <Attributname> = <Ausdruck> [, <Attributname> = <Ausdruck>]* [WHERE <Bedingung>] © Prof. Dr.-Ing. Wolfgang Lehner | SQL | 34 > Beispiele zu Änderungsoperationen Füge den Kunden Schmidt mit dem Kontostand 0 € ein INSERT INTO Kunde (KName, Kto) VALUES ('Schmidt', 0) Erhöhe den Kontostand von Schmidt um 200 UPDATE Kunde SET Kto = Kto + 200 WHERE KName = 'Schmidt' Konvertiere alle Kontostände in Euro! UPDATE Kunde SET Kto = Kto/1,9554 Lösche alle Kunden, deren Kontostand höher ist als der Durchschnitt DELETE FROM Kunde WHERE Kto > (SELECT AVG(Kto) FROM Kunde) © Prof. Dr.-Ing. Wolfgang Lehner | SQL | 35 > Zusammenfassung Eigenschaften von Anfragesprachen prozedural versus deskriptiv Data Definition Language und Data Manipulation Language Structured Query Language: SQL Reflexion der Operatoren der relationalen Algebra Geschachtelte Anfragen / Tupelvariable Gruppierung, Aggregation, Sortierung Rekursive Anfrage Spezifikation von Integritätsbedingungen Referentielle Integrität © Prof. Dr.-Ing. Wolfgang Lehner | SQL | 36