SQL: Übersicht • SQL (Structured Query Language) ist ANSI‐ und ISO‐Standard • 1975 SEQUEL = Structured English Query Language für System R (IBM) • 1979 Oracle V2 (Relational Software Inc. ) erstes SQL Produkt • 1986 ANSI 1986 ANSI‐Standard Standard SQL1 SQL1 • 1987 Internationalen Organisation für Normung (ISO)‐Standard SQL1 • 1989 SQL1 (Version 2) standardisiert • 1992 SQL2 bzw. SQL‐92 von der ISO verabschiedet – Alle aktuellen DBMS halten sich im wesentlichen daran • 1999 SQL:1999 (ISO/IEC 9075:1999, auch SQL3 genannt) – Noch nicht in allen DBMS implementiert, gilt auch für die folgenden: Noch nicht in allen DBMS implementiert gilt auch für die folgenden: • 2003 SQL:2003 2008 SQL:2008 • 2008 SQL:2008 9. Prof. Jasper: Datenbanksysteme 1 SQL: Datendefinition • Datendefinition in SQL mittels CREATE, DROP und ALTER TABLE • CREATE TABLE – Definiert eine neue (Basis‐) Tabelle mit Namen und Attributspezifikation (Name und Datentyp aus INTEGER; FLOAT, DECIMAL(i, j), CHAR(n), (Name und Datentyp INTEGER; FLOAT DECIMAL(i j) CHAR(n) VARCHAR(n)) – Ein Constraint NOT NULL kann für Attribute definiert werden – Beispiel – CREATE TABLE Abteilung( Abt il ( ABT_NAME VARCHAR(10) NOT NULL, ABT_ID INTEGER NOT NULL, ABT_Leiter CHAR(9), ABT_Leiter_seit CHAR(9) ); 9. Prof. Jasper: Datenbanksysteme 2 SQL: Datendefinition • CREATE TABLE (Forts.) – In SQL2 können auch Primärschlüssel, Fremdschlüssel und Constraints für die referentielle Integrität spezifiziert werden – Primärschlüssel über die Schlüsselworte PRIMARY KEY und UNIQUE – Beispiel p CREATE TABLE Abteilung( ABT NAME ABT_NAME VARCHAR(10) NOT NULL NULL, ABT_ID INTEGER NOT NULL, ABT_Leiter CHAR(9), CHAR(9) ); ABT_Leiter_seit PRIMARY KEY (ABT_ID), UNIQUE (ABT_NAME), FOREIGN KEY (ABT (ABT_Leiter) Leiter) REFERENCES Personal); 9. Prof. Jasper: Datenbanksysteme 3 SQL: Datendefinition • DROP TABLE: – – – – Löscht eine Tabelle und ihre Definition Di T b ll kann Die Tabelle k nie i mehr h genutzt t t werden! d ! Beispiel: DROP TABLE Personal; • ALTER TABLE: – Fügt ein weiteres Attribut zu einer Relation hinzu – Nach Ausführung der Anweisung haben alle Tupel den Wert NULL für diese Att ib t Attribut – Somit ist NOT NULL‐Constraint hier nicht erlaubt – Beispiel: – ALTER TABLE Personal ADD Stellenbezeichung VARCHAR(12); – Der Nutzer muss für jedes Tupel einen Wert explizit eintragen 9. Prof. Jasper: Datenbanksysteme 4 SQL: Datendefinition • Weitere DDL‐Statements in SQL2 und SQL:1999 – CREATE SCHEMA • Ein Ei DB‐Schema wird DB S h i d explizit li it über üb einen i N Namen vereinbart i b t – Unterstützung der referentiellen Integrität • RESTRICT, CASCADE, SET NULL, SET DEFAULT • Beispiel: CREATE TABLE Abteilung( ABT_NAME VARCHAR(10) NOT NULL, ABT_ID INTEGER NOT NULL, CHAR(9), ( ), ABT_Leiter ABT_Leiter_seit CHAR(9) ); PRIMARY KEY (ABT_ID), UNIQUE Q ( (ABT_NAME), ), FOREIGN KEY (ABT_Leiter) REFERENCES Personal ON DELETE SET DEFAULT ON UPDATE CASCADE); 9. Prof. Jasper: Datenbanksysteme 5 SQL: Datendefinition • Referentielle Integrität (Forts.) – CREATE TABLE Personal( Name VARCHAR(30) NOT NULL, P_ID CHAR(9), NOT NULL Geb_Dat DATE, ABT_ID INTEGER DEFAULT 1, Vorgesetzter CHAR(9), PRIMARY KEY (P_ID), FOREIGN KEY (ABT_ID) REFERENCES DEPT ON DELETE SET NULL ON UPDATE CASCADE CASCADE, FOREIGN KEY (Vorgesetzter) REFERENCES Personal ON DELETE SET NULL ON UPDATE CASCADE); 9. Prof. Jasper: Datenbanksysteme 6 SQL: Datendefinition • Weitere Datentypen in SQL2 bzw‐ SQL:1999 DATE: Datums mit unterschiedlichen Formaten, Standard YYYY‐MM‐DD TIME Z it in Stunden, Minuten TIME: Zeit i St d Mi t und Sekunden, Standard hh:mm:ss dS k d St d d hh TIME(i): Zeit mit Sekundenbruchteilen (i‐stellig) hh:mm:ss:ii...i TIMESTAMP: besteht aus DATE und TIME TIMESTAMP: besteht aus DATE und TIME INTERVAL: Relative Angabe von Zeit im Vergleich zu einer absoluten Angabe („2008‐10‐25 plus 3 WEEKS“) – CLOB: Text ohne interne Struktur – BLOB: Digitales Objekt – … – – – – – 9. Prof. Jasper: Datenbanksysteme 7 SQL: Anfragen (Queries) • SQ SQL hat eine h i Anweisung i fü Anfragen: das SELECT‐Statement für f d S C S • Wichtiger Unterschied zwischen dem formalen relationalen Modell und dem “SQL‐Datenmodell”: SQL arbeitet Q Q mit Multimengen g ((Bags), g ), d.h. es können identische Tupel in einer Tabelle existieren. Beispiel: {A, B, C, A} ist ein Bag; {A, B, C} ist sowohl Bag als auch Menge • Die Grundform Die Grundform einer SQL SELECT Anweisung SQL SELECT Anweisung ist eine Abbildung, Abbildung auch SFW‐Klausel (SELECT‐FROM‐WHERE‐Block) genannt SELECT <attribute list> FROM <table list> WHERE<condition> – <attribute list> ist die Menge der Attributnamen, deren Werte das Ergebnis der Anfrage bilden – <table list> spezifiziert alle Tabellen (Relationen) zur Beantwortung der Anfrage – <condition> ist eine ((boolesche) Bedingung, die jedes ) g g, j Tupel p spezifiziert, p , das in der Antwortmenge ist. 9. Prof. Jasper: Datenbanksysteme 8 SQL: Anfragen (Queries) • Beispiels‐DB‐Schema: Personal V Name V_Name N Name N_Name P ID P_ID Geb Dat Geb_Dat Adr M W M_W Gehalt Vorg Abt Nr Abt_Nr Abteilung Abt_Name Abt_ID Abt_Leiter Abt_Leiter_Seit Standort Abt_ID Standort Projekt P_Name Proj_ID Standort Abt A b it t fü Arbeitet_für P_ID Proj_ID Stunden Angehörige P_Id An_Name M_W Geb_Dat Beziehung 9. Prof. Jasper: Datenbanksysteme 9 SQL: Anfragen (Queries) • Einfache Anfragen: – Entsprechen den Ausdrücken Selektion, Projektion und Join der RA – Anfrage auf einer Tabelle: • “Geburtsdatum und Adresse von Mitarbeiter Bernd Müller” • Q0: SELECT Geb_Dat, Adr FROM Personal WHERE V Name=‘Bernd' WHERE V_Name Bernd AND N_Name AND N Name=‘Müller’ Müller • Entspricht einer Selektion (WHERE‐Klausel) und Projektion (SELECT‐Klausel) • Resultat kann Duplikate enthalten – Anfrage auf zwei Tabellen: – “Name Name und Adresse und Adresse aller Mitabeiter der “Forschungs”‐Abteilung” Forschungs Abteilung • Q1: SELECT V_Name, N_Name, Adr FROM Personal, Abteilung WHERE Abt Name=‘Forschung' WHERE Abt_Name= Forschung AND Abt_ID=Abt_Nr AND Abt ID=Abt Nr • Entspricht einer Kombination von Selekton, Projektion und Join der RA 9. Prof. Jasper: Datenbanksysteme 10 SQL: Anfragen (Queries) • Einfache Anfragen (Forts.) Ei f h A f (F ) – „Gib mir die Projekt‐Id, die zugehörige Abteilungs_Id und Nachname, Adresse und Geburtsdatum des zuständigen Abteilungsleiters für jedes Projekt in Freiberg“ • Q2 Q2: SELECT Proj_ID, Abt_Id, N_Name, Adr, Geb_Dat SELECT P j ID Abt Id N N Ad G b D t FROM Projekt, Abteilung, Personal WHERE Abt=Abt_ID AND Abt_Leiter = P_ID AND Standort= 'Freiberg'; • IN Q2 gibt es zwei Joins – Aliase: • Attributnamen müssen in SQL‐Statements eindeutig sein (bzgl. Relationen) Falls Attribute mit gleichem Namen aus unterschiedlichen Tabellen in einer in einer Anweisung • Falls Attribute mit benötigt werden, müssen diese qulifiziert werden: Tabellennamen als Präfix • Beispiele: Personal.Geb_Dat, Projekt.Standort • In einigen Anfragen benötigt man eine Tabelle mehrfach; in diesem Fall (und für g p abkürzende Schreibweisen werden Aliase vergeben: Beispiel • Q8: “Gib mir Name und Name des direkten Vorgesetzten eines Mitarbeiters” Q8: SELECT P.V_Name, P.N_Name, V.V_Name, V.N_Name FROM Personal (AS) P V ( ) WHERE P.Vorg=V.P_ID • In Q8 sind die Tabellennamen P und V Aliase oder auch Tupelvariablen für die ; p unterschiedliche Kopien p P die Personal‐Tabelle; P und V repräsentieren Untergebenen, V die Vorgesetzten, AS ist optional 9. Prof. Jasper: Datenbanksysteme 11 SQL: Anfragen (Queries) • Einfache Anfragen (Forts.) – leere WHERE‐Klausel: • FFalls keine ll k i Bedingung B di (WHERE Kl (WHERE‐Klausel) existiert, sind l) i ti t i d alle ll Tupel T l für fü das Ergebnis d E b i qualifiziert • Entspricht WHERE TRUE • Beispiel: “ Gib mit die P_IDs aller Mitarbeiter” • Q Q9: SELECT P_ID FROM Personal; • Falls Falls mehrere mehrere Tabellen in der in der FROM‐Klausel FROM Klausel spezifiziert sind (ohne WHERE‐Klausel) WHERE Klausel) wird das kartesische Produkt ausgegeben • Beispiel: • Q10: SELECT P_ID, Abt_Name Q10 S L C I Ab FROM Personal, Abteilung; • Problem: Sehr große Antwortmengen möglich! 9. Prof. Jasper: Datenbanksysteme 12 SQL: Anfragen (Queries) • Einfache Anfragen (Forts.) – *: • Um alle Um alle Attribute der Attribute der spezifizierten Tabellen auszugeben wird * benutzt: benutzt: • Beispiele: • Q1C: SELECT * FROM Personal WHERE Abt_Nr=5; • Q1D: SELECT * FROM Personal, Abteilung WHERE Abt_Name=‘Forschung' AND Abt_Nr=Abt_ID; – DISTINCT: • SQL behandelt Q Tabellen nicht als Mengen; Duplikate g ; p können auftreten • Um Duplikate in der Antwort zu vermeiden wird DISTINCT genutzt: Beispiele mit/ohne Duplikate: • Q11: SELECT Gehalt FROM Personal • Q11A: SELECT DISTINCT Gehalt FROM Personal 9. Prof. Jasper: Datenbanksysteme 13 SQL: Anfragen (Queries) • Mengenoperationen SQL hat Mengenoperationen eingebaut UNION (und ein einigen Versionen von SQL MINUS und INTERSECT) ( d i i i V i SQL MINUS d INTERSECT) Ergebnisse sind immer Mengen, Duplikate werden eliminiert Mengenoperationen nur auf vereinigungsverträglichen Tabellen: hier Mengenoperationen nur auf vereinigungsverträglichen Tabellen: hier identische Attribute und diese in der gleichen Reihenfolge spezifiziert! – Beispiel: „Suche alle Projektnummern der Projekte, in denen ein Mitarbeiter mit Nachnamen Müller mitarbeitet oder die zu einer Abteilung gehören, die it N h Müll it b it t d di i Abt il hö di von einem Mitarbeiter Müller geleitet werden“ – Q4: (SELECT P_Name FROM Projekt, Abteilung, Personal WHERE Abt=Abt_ID AND Abt_Leiter=P_ID AND N_Name = ‘Müller’) UNION (SELECT P_Name FROM Projekt P, Arbeitet für A, Personal Pers WHERE P Proj ID=A WHERE P.Proj_ID A.Proj_ID Proj ID AND P.P_ID AND P P ID = Pers.P_ID Pers P ID AND N_Name = ‘Müller’) – – – – 9. Prof. Jasper: Datenbanksysteme 14 SQL: Anfragen (Queries) • Geschachtelte Anfragen: G h h l A f – Ein SELECT‐Statement kann als geschachtelte Subanfrage in einer WHERE‐Klausel der sogenannten äußeren Anfrage genutzt werden – Schachtelung ist oft eine Alternative zu Anfragen; Beispiel S h ht l i t ft i Alt ti A f B i i l – Q1: SELECT V_Name, N_Name, Adr FROM Personal WHERE Abt Nr IN (SELECT Abt_ID Abt_Nr IN (SELECT Abt ID FROM Abteilung WHERE Abt_Name=‘Forschung' ) – IN entspricht dem Element‐Operator erweitert auf Multimengen – Anfragen können beliebig tief geschachtelt werden – Attribute werden möglichst früh (am weitesten innen) zugeordnet – Korrellierte (Sub‐)Anfragen sind dadurch definiert, dass Attribute über Anfragegrenzen hinweg genutzt werden – Beispiel: “Name der Mitarbeiter mit Angehörigen mit identischem Vornamen – Q12: SELECT P.V_Name, P.N_Name FROM P FROM Personal AS P l AS P WHERE P.P_ID IN (SELECT P_ID FROM Angehörige _ _ _ _ ) WHERE P_ID = P.P_ID AND P.V_Name=An_Name) 9. Prof. Jasper: Datenbanksysteme 15 SQL: Anfragen (Queries) • Geschachtelte Anfragen (Forts.): – Jede geschachtelte Anfrage, die nur IN oder „=„ Operatoren in der Schachtelung nutzt kann durch eine einfache (nicht geschachtelte) SWF Schachtelung nutzt kann durch eine einfache (nicht geschachtelte) SWF‐ Klausel ausgedrückt werden – Beispiel (s.o.): – Q12A: SELECT P.V_Name, P.N_Name FROM Personal P, Angehörige A WHERE P.P ID=A.P WHERE P.P_ID A.P_ID AND P.V_Name ID AND P.V Name=A.An A.An_Name; Name; – EXISTS prüft, ob das Ergebnis einer korrelierten Subanfrage leer ist oder nicht – Beispiel (s.o.): – Q12B : SELECT P.V_Name, P.N_Name FROM Personal P FROM Personal P WHERE EXISTS (SELECT * FROM Angehörige WHERE P ID P P ID AND PV N WHERE P_ID=P.P_ID AND P.V_Name=An_Name) A N ) 9. Prof. Jasper: Datenbanksysteme 16 SQL: Anfragen (Queries) • Geschachtelte Anfragen (Forts.): – „Namen der Mitabeiter ohne Angehörige“ – Q6: SELECT V_Name, N_Name Q6 SELECT V N N N FROM Personal P WHERE NOT EXISTS (SELECT * FROM Angehörige WHERE P_ID=P.P_ID) – EXISTS ist EXISTS ist notwendig für die Ausdrucksmächtigkeit die Ausdrucksmächtigkeit von SQL! von SQL! – Explizite p Mengen g ((Aufzählungen) g ) – Statt Schachtelung können auch explizite Aufzählungen (Mengen) in einer WHERE‐Klausel genutzt werden: – Q13: SELECT DISTINCT P_ID FROM Arbeitet_für WHERE WH R Proj_I Proj ID IN IN (1, 2, 3) ( , , 3) 9. Prof. Jasper: Datenbanksysteme 17 SQL: Anfragen (Queries) • Anfragen und NULL – In SQL‐Anfragen kann auf NULL‐Wert geprüft werden – Hier ist IS Hi i t IS oder d IS NOT IS NOT als l Operator zu O t nutzen t (NULL W t sind (NULL‐Werte i d unterschiedlich, “=“ geht nicht!) – Beispiel: “Alle p Mitarbeiter ohne Vorgesetzten” g – Q14: SELECT V_Name, N_Name FROM Personal WHERE Vorg IS NULL WHERE Vorg IS NULL – Achtung: Bei Join‐Bedingungen werden NULL‐Werte nicht berücksichtigt! 9. Prof. Jasper: Datenbanksysteme 18 SQL: Anfragen (Queries) • Joins J i – In der FROM‐Klausel kann ein JOIN definiert werden – Sieht wie jede andere Tabelle aus – Verschieden Joins können spezifiziert werden ("theta" JOIN, NATURAL JOIN, LEFT OUTER JOIN, RIGHT OUTER JOIN, CROSS JOIN, etc) – Beispiele: • Q8 Q8: SELECT SELECT PV N P.V_Name, P.N_Name, V.V_Name, V.N_Name PN N VV N VN N FROM Personal P V WHERE P.Vorg=V.P_ID kann geschrieben werden als • Q8: SELECT P.V_Name, P.N_Name, V.V_Name, V.N_Name FROM (Personal P LEFT OUTER JOIN Personal V ON P.Vorg=V.P_ID) • Q1 Q1 (s.o.) (s o ) • Q1: SELECT FROM WHERE oder d als l • Q1: SELECT FROM WHERE V_Name, N_Name, Adr (Personal JOIN Abteilung ON Abt_Nr=Abt_ID) Abt_Name=‘Forschung’ V_Name, N_Name, Adr (Personal NATURAL JOIN Abteilung AS Abteilung(Name, Abt_Nr, AL, ALS) Name=‘Forschung’ 9. Prof. Jasper: Datenbanksysteme 19 SQL: Datendefinition • Aggregationen COUNT, SUM, MAX, MIN, und AVG – “Maximales, minimales und durchschnittliches Gehalt der Mitarbeiter” – Q15: SELECT MAX(SALARY), MIN(SALARY), AVG(SALARY) FROM Personal FROM Personal – In machen DBMS nur eine Aggregationsfunktion nach SELECT erlaubt! – Anzahl aller Mitarbeiter und Anzahl der Mitarbeiter in der Forschungsabteilung: – Q17: SELECT COUNT (*) Q17: SELECT COUNT (*) FROM Personal – Q18: SELECT COUNT (*) FROM Personal, Abteilung WHERE Abt_Nr=Abt_ID AND Abt_Name=‘Forschung’ 9. Prof. Jasper: Datenbanksysteme 20 SQL: Datendefinition • Gruppierung G i – Vielfach möchte man die Aggregationsfunktion auf Untergruppen der Tupelmenge anwenden – Jede Untergruppe wird definiert über identische Werte bezüglich eines oder J d U t i d d fi i t üb id ti h W t b ü li h i d mehrerer Gruppierungsattribute – Gruppierung geht über GROUP BY auf Attribute die auch selektiert werden müssen – Beispiel: Gib mir Nummer, Anzahl Mitarbeiter und deren Durchschnittsgehalt für j jede Abteilung g – Q20: SELECT Abt_Nr , COUNT (*), AVG (Gehalt) FROM Personal GROUP BY Abt_Nr Gr ppen bilden sich Gruppen si h her aufgrund her a f r nd identischer identis her Abt_Nr Abt Nr – Beispiel: Gib mir für jedes Projekt dessen Nr und Name sowie die Anzahl Mitarbeiter im Projekt – Q21: SELECT P.Proj_ID, P_Name, COUNT (*) FROM Projekt P, Arbeitet_für A j_ j_ WHERE P.Proj_ID=A.Proj_ID GROUP BY P.Proj_ID, P_Name 9. Prof. Jasper: Datenbanksysteme 21 SQL: Datendefinition • Group by having – Ergänzend können Gruppen, über die aggregiert werden soll, durch Bedingungen ausgewählt werden – Die Having‐Klausel selektiert Gruppen (statt individuelle Tupel) – Beispiel: Für jedes Projekt mit mehr als zwei Mitarbeitern gib mir dessen Nr und Name sowie die Anzahl Mitarbeiter im Projekt – Q21: SELECT P.Proj_ID, P_Name, COUNT (*) Q21 SELECT P P j ID P N COUNT (*) FROM Projekt P, Arbeitet_für A WHERE P.Proj_ID=A.Proj_ID GROUP BY P.Proj_ID, P_Name HAVING COUNT(*) >2 9. Prof. Jasper: Datenbanksysteme 22