Relationale Abfragesprachen Relationale Abfragesprachen Acknowledgments Datenmodellierung VU 184.685, WS 2015 Relationale Abfragesprachen – SQL Die Folien sind eine kleine Erweiterung der Folien von Katrin Seyr. Sebastian Skritek Institut für Informationssysteme Technische Universität Wien Sebastian Skritek Seite 1 Relationale Abfragesprachen Sebastian Skritek Seite 2 Relationale Abfragesprachen 1. SQL einst und jetzt SQL einst und jetzt Überblick SQL wurde auf Basis von relationaler Algebra und Relationenkalkül entwickelt deklarative Sprache 1 SQL einst und jetzt 2 Datendefinitionssprache 3 Datenabfragesprache 4 Datenmanipulationssprache mengenorientierte Sprache Abarbeitung Übersetzung der Abfragen mittels Parser in relationale Algebra und Optimierung durch Anfragenoptimierer des DBMS (VU Datenbanksysteme) Relationen werden dargestellt in Form von Tabellen SQL stellt eine standardisierte Datendefinitions (DDL)Datenmanipulations (DML)Anfrage (Query)-Sprache Sebastian Skritek Seite 3 Sebastian Skritek Seite 4 Relationale Abfragesprachen 1. SQL einst und jetzt Relationale Abfragesprachen SQL einst und jetzt Datendefinitionssprache Datentypen: Konstrukte für Zeichenketten, Zahlen, Datum, . . . SQL 99: erweiterte SQL 92 um objektrelationale Konstrukte, rekursive Abfragen und Trigger character ( n ) , char ( n ) character varying ( n ) , varchar ( n ) SQL 2003: bietet erweiterte Unterstützung von Nested Tables, von Merge Operationen und auf XML bezogene Eigenschaften numeric (p , s ) integer , int SQL 2006: Brücke zu XML, XQuery SQL 2008, 2011: 2011 ist derzeit aktueller Standard System R (IBM): erster DBMS Prototyp, Sprache: Structured English Query Language ⇒ SQL date blob , raw clob DBMS: Oracle (Oracle Corporation), Informix (Informix), SQL-Server (Microsoft), DB2 (IBM), PostgreSQL, MySQL Sebastian Skritek Relationale Abfragesprachen 2. Datendefinitionssprache Seite 5 2. Datendefinitionssprache Sebastian Skritek Relationale Abfragesprachen Datendefinitionssprache % für große binäre bzw . Text Daten % für große Text Daten Seite 6 2. Datendefinitionssprache Datendefinitionssprache Schemadefinition und -veränderung Schemadefinition und -veränderung create table Professoren ( PersNr integer primary key , Name varchar (10) not null , Rang character (2)); create table Professoren ( PersNr integer primary key , Name varchar (10) not null , Rang character (2)); create table voraussetzen ( VorgNr integer , NachfNr integer , primary key ( VorgNr , NachfNr ) ); Sebastian Skritek Seite 7 Sebastian Skritek Seite 7 Relationale Abfragesprachen 2. Datendefinitionssprache Relationale Abfragesprachen Datendefinitionssprache 2. Datendefinitionssprache Datendefinitionssprache Schemadefinition und -veränderung Schemadefinition und -veränderung drop table Professoren ; drop table Professoren ; alter table Professoren rename to Vortragende ; alter table Professoren add Raum integer ; alter table Professoren drop Raum ; alter table Professoren alter Name type varchar (30); Sebastian Skritek Relationale Abfragesprachen Seite 8 2. Datendefinitionssprache Sebastian Skritek Relationale Abfragesprachen Datendefinitionssprache Seite 8 3. Datenabfragesprache Datenabfragesprache Schemadefinition und -veränderung drop table Professoren ; alter table Professoren rename to Vortragende ; alter table Professoren add Raum integer ; alter table Professoren drop Raum ; alter table Professoren alter Name type varchar (30); alter table Professoren alter column Name set data type varchar (30); Sebastian Skritek Seite 8 1 Einfache SQL-Anfragen 2 Anfragen über mehrere Relationen 3 Mengenoperationen 4 Aggregatfunktionen 5 Aggregate und Gruppierung 6 Geschachtelte Anfragen 7 Existenziell quantifizierte Anfragen 8 Allquantifizierte Anfragen 9 Nullwerte 10 Spezielle Sprachkonstrukte 11 Sichten (Views) Sebastian Skritek Seite 9 Relationale Abfragesprachen 3. Datenabfragesprache 3.1. Einfache SQL Anfragen Relationale Abfragesprachen Einfache SQL Anfragen 3. Datenabfragesprache 3.1. Einfache SQL Anfragen Einfache SQL Anfragen Example Example select * from Professoren ; select * from Professoren ; Professoren Sebastian Skritek Relationale Abfragesprachen Seite 10 3. Datenabfragesprache 3.1. Einfache SQL Anfragen Rang Sokrates C4 Raum 226 2126 Russel C4 232 2127 Kopernikus C3 310 2133 Popper C3 52 2134 Augustinus C3 309 2136 Curie C4 36 2137 Kant C4 7 Seite 10 3. Datenabfragesprache 3.1. Einfache SQL Anfragen Einfache SQL Anfragen Example select Name , Raum from Professoren ; Name 2125 Sebastian Skritek Relationale Abfragesprachen Einfache SQL Anfragen PersNr Example select Name , Raum from Professoren ; πName,Raum (Professoren) πName,Raum (Professoren) Professoren Name 226 Russel 232 Kopernikus 310 Popper Augustinus Sebastian Skritek Seite 11 Sebastian Skritek Raum Sokrates 52 309 Curie 36 Kant 7 Seite 11 Relationale Abfragesprachen 3. Datenabfragesprache 3.1. Einfache SQL Anfragen Relationale Abfragesprachen Einfache SQL Anfragen – Duplikate 3. Datenabfragesprache 3.1. Einfache SQL Anfragen Einfache SQL Anfragen – Duplikate Beispiel (Duplikatelimination) Beispiel (Duplikatelimination) Geben Sie alle Rangbezeichnungen für Professoren aus (rel. Algebra) Geben Sie alle Rangbezeichnungen für Professoren aus (rel. Algebra) πRang (Professoren) πRang (Professoren) Ergebnis Rang C4 C3 Sebastian Skritek Relationale Abfragesprachen Seite 12 3. Datenabfragesprache 3.1. Einfache SQL Anfragen Sebastian Skritek Relationale Abfragesprachen Einfache SQL Anfragen – Duplikate Seite 12 3. Datenabfragesprache 3.1. Einfache SQL Anfragen Einfache SQL Anfragen – Duplikate Beispiel (Duplikatelimination) Beispiel (Duplikatelimination) Geben Sie alle Rangbezeichnungen für Professoren aus (rel. Algebra) Geben Sie alle Rangbezeichnungen für Professoren aus (rel. Algebra) πRang (Professoren) πRang (Professoren) Geben Sie alle Rangbezeichnungen für Professoren aus (SQL) Geben Sie alle Rangbezeichnungen für Professoren aus (SQL) select Rang from Professoren ; select Rang from Professoren ; Ergebnis Rang C4 C4 C4 C4 C3 C3 C3 Sebastian Skritek Seite 12 Sebastian Skritek Seite 12 Relationale Abfragesprachen 3. Datenabfragesprache 3.1. Einfache SQL Anfragen Relationale Abfragesprachen Einfache SQL Anfragen – Duplikate 3. Datenabfragesprache 3.1. Einfache SQL Anfragen Einfache SQL Anfragen – Duplikate Beispiel (Duplikatelimination) Beispiel (Duplikatelimination) Geben Sie alle Rangbezeichnungen für Professoren ohne Duplikate aus Geben Sie alle Rangbezeichnungen für Professoren ohne Duplikate aus select distinct Rang from Professoren ; select distinct Rang from Professoren ; Ergebnis Rang C4 C3 Sebastian Skritek Relationale Abfragesprachen Seite 13 3. Datenabfragesprache 3.1. Einfache SQL Anfragen Sebastian Skritek Relationale Abfragesprachen Einfache SQL Anfragen – Duplikate Seite 13 3. Datenabfragesprache 3.1. Einfache SQL Anfragen Einfache SQL Anfragen Example Beispiel (Duplikatelimination) Finde die Raumnummer von Professor Popper Geben Sie alle Rangbezeichnungen für Professoren ohne Duplikate aus select distinct Rang from Professoren ; Ergebnis Rang C4 C3 distinct . . . eliminiert Duplikate aus dem Ergebnis Sebastian Skritek Seite 13 Sebastian Skritek Seite 14 Relationale Abfragesprachen 3. Datenabfragesprache 3.1. Einfache SQL Anfragen Relationale Abfragesprachen Einfache SQL Anfragen 3. Datenabfragesprache 3.1. Einfache SQL Anfragen Einfache SQL Anfragen Example Example Finde die Raumnummer von Professor Popper Finde die Raumnummer von Professor Popper select Name , Raum from Professoren where Name = ‘ Popper ’; select Name , Raum from Professoren where Name = ‘ Popper ’; πName,Raum σName=‘Popper 0 (Professoren) πName,Raum σName=‘Popper 0 (Professoren) Professoren Name Popper Sebastian Skritek Relationale Abfragesprachen Seite 14 3. Datenabfragesprache 3.1. Einfache SQL Anfragen 52 Sebastian Skritek Relationale Abfragesprachen Einfache SQL Anfragen Raum Seite 14 3. Datenabfragesprache 3.1. Einfache SQL Anfragen Einfache SQL Anfragen Example Example Finde die Raumnummer von Professor Popper Finde die Raumnummer von Professor Popper select Raum from Professoren where Name = ‘ Popper ’; πRaum σName=‘Popper 0 (Professoren) Professoren Raum 52 Sebastian Skritek Seite 15 Sebastian Skritek Seite 15 Relationale Abfragesprachen 3. Datenabfragesprache 3.1. Einfache SQL Anfragen Relationale Abfragesprachen Einfache SQL Anfragen 3. Datenabfragesprache 3.1. Einfache SQL Anfragen Einfache SQL Anfragen Struktur einer einfachen Anfrage: Struktur einer einfachen Anfrage: select Attribute from Tabelle where Bedingung ; select Attribute from Tabelle where Bedingung ; Attribute: Liste jener Attribute, die ausgegeben werden Tabelle: Name der Tabelle, die durchsucht wird Bedingung: Kriterium, das jedes ausgegebene Tupel erfüllen muss Sebastian Skritek Seite 16 Relationale Abfragesprachen 3. Datenabfragesprache 3.1. Einfache SQL Anfragen Sebastian Skritek Seite 16 Relationale Abfragesprachen Einfache SQL Anfragen 3. Datenabfragesprache 3.1. Einfache SQL Anfragen Einfache SQL Anfragen Beispiel Beispiel Geben Sie Personalnummer und Name aller C4 Professoren an: Geben Sie Personalnummer und Name aller C4 Professoren an: Professoren Ergebnis Raum Professoren Ergebnis PersNr Name Rang PersNr Name PersNr Name Rang PersNr Name 2125 Sokrates C4 226 2125 Sokrates 2125 Sokrates C4 Raum 226 2125 Sokrates 2126 Russel C4 232 2126 Russel 2126 Russel C4 232 2126 Russel 2127 Kopernikus C3 310 2136 Curie 2127 Kopernikus C3 310 2136 Curie 2133 Popper C3 52 2137 Kant 2133 Popper C3 52 2137 Kant 2134 Augustinus C3 309 2134 Augustinus C3 309 2136 Curie C4 36 2136 Curie C4 36 2137 Kant C4 7 2137 Kant C4 7 select PersNr , Name from Professoren where Rang = ’ C4 ’; Sebastian Skritek Seite 17 Sebastian Skritek Seite 17 Relationale Abfragesprachen 3. Datenabfragesprache 3.1. Einfache SQL Anfragen Relationale Abfragesprachen Einfache SQL Anfragen – Sortierung 3. Datenabfragesprache 3.1. Einfache SQL Anfragen Einfache SQL Anfragen – Sortierung Beispiel (Sortierung) Beispiel (Sortierung) Geben Sie die Personalnummer, Name und Rang aller Professoren an. Sortieren Sie das Ergebnis absteigend nach dem Rang und aufsteigend nach dem Namen. Geben Sie die Personalnummer, Name und Rang aller Professoren an. Sortieren Sie das Ergebnis absteigend nach dem Rang und aufsteigend nach dem Namen. Ergebnis PersNr Name Rang 2136 Curie C4 2137 Kant C4 2126 Russel C4 2125 Sokrates 2134 Augustinus 2127 2133 Rang Curie C4 2137 Kant C4 2126 Russel C4 C4 2125 Sokrates C4 C3 2134 Augustinus C3 Kopernikus C3 2127 Kopernikus C3 Popper C3 2133 Popper C3 Seite 18 3. Datenabfragesprache Ergebnis Name Sebastian Skritek Relationale Abfragesprachen select PersNr , Name , Rang PersNr from Professoren order by Rang desc , Name asc ; 2136 3.1. Einfache SQL Anfragen Sebastian Skritek Relationale Abfragesprachen Einfache SQL Anfragen – Sortierung Seite 18 3. Datenabfragesprache 3.1. Einfache SQL Anfragen Einfache SQL Anfragen Beispiel (Sortierung) Beispiel Geben Sie die Personalnummer und den Namen aller Professoren an. Sortieren Sie das Ergebnis absteigend nach dem Rang und aufsteigend nach dem Namen. select PersNr , Name from Professoren order by Rang desc , Name asc ; Sebastian Skritek Welche Professoren lesen die LVA Mäeutik? Ergebnis PersNr Name 2136 Curie 2137 Kant 2126 Russel 2125 Sokrates 2134 Augustinus 2127 Kopernikus 2133 Popper Seite 19 Sebastian Skritek Seite 20 Relationale Abfragesprachen 3. Datenabfragesprache 3.1. Einfache SQL Anfragen Relationale Abfragesprachen Einfache SQL Anfragen 3. Datenabfragesprache 3.1. Einfache SQL Anfragen Einfache SQL Anfragen Beispiel Beispiel Welche Professoren lesen die LVA Mäeutik? Information aus Tabelle: Professoren, Vorlesungen Welche Professoren lesen die LVA Mäeutik? Information aus Tabelle: Professoren, Vorlesungen Professoren (PersNr, Name , Rang , Raum ) Vorlesungen ( VorlNr , Titel , SWS , gelesenVon) Professoren (PersNr, Name , Rang , Raum ) Vorlesungen ( VorlNr , Titel , SWS , gelesenVon) select Name , Titel from Professoren , Vorlesungen where PersNr = gelesenVon and Titel = ‘ Mäeutik ’; Sebastian Skritek Relationale Abfragesprachen Seite 20 3. Datenabfragesprache 3.2. Anfragen über mehrere Relationen Sebastian Skritek Relationale Abfragesprachen Anfragen über mehrere Relationen Seite 20 3. Datenabfragesprache 3.2. Anfragen über mehrere Relationen Anfragen über mehrere Relationen Struktur einer Abfrage über mehrere Tabellen: Struktur einer Abfrage über mehrere Tabellen: select Attribute from Tabelle1 , Tabelle2 , ... , TabelleN where Bedingungen ; select Attribute from Tabelle1 , Tabelle2 , ... , TabelleN where Bedingungen ; Bedingungen: greifen auf die Attribute der verschiedenen Tabellen zu Sebastian Skritek Seite 21 Sebastian Skritek Seite 21 Relationale Abfragesprachen 3. Datenabfragesprache 3.2. Anfragen über mehrere Relationen Relationale Abfragesprachen Anfragen über mehrere Relationen 3. Datenabfragesprache 3.2. Anfragen über mehrere Relationen Anfragen über mehrere Relationen Beispiel Struktur einer Abfrage über mehrere Tabellen: Welche Professoren lesen die LVA Mäeutik? Information aus Tabelle: Professoren, Vorlesungen select Attribute from Tabelle1 , Tabelle2 , ... , TabelleN where Bedingungen ; Professoren (PersNr, Name , Rang , Raum ) Vorlesungen ( VorlNr , Titel , SWS , gelesenVon) Bedingungen: greifen auf die Attribute der verschiedenen Tabellen zu select Name , Titel from Professoren , Vorlesungen where PersNr = gelesenVon and Titel = ‘ Mäeutik ’; Auswertung: 1 Bilde Kreuzprodukt der from Tabellen 2 Überprüfe für jede Zeile die where Bedingungen 3 Projiziere auf select Attribute Sebastian Skritek Relationale Abfragesprachen Seite 21 3. Datenabfragesprache 3.2. Anfragen über mehrere Relationen Sebastian Skritek Seite 22 Relationale Abfragesprachen Anfragen über mehrere Relationen 1 Welche Professoren lesen die LVA Mäeutik? Information aus Tabelle: Professoren, Vorlesungen Bilde Kreuzprodukt der from Tabellen Professoren Professoren (PersNr, Name , Rang , Raum ) Vorlesungen ( VorlNr , Titel , SWS , gelesenVon) select Name , Titel from Professoren , Vorlesungen where PersNr = gelesenVon and Titel = ‘ Mäeutik ’; Sebastian Skritek 3.2. Anfragen über mehrere Relationen Anfragen über mehrere Relationen – Abarbeitung Beispiel πName,Titel σPersNr=gelesenVon∧Titel=‘Mäeutik’ (Professoren × Vorlesungen) 3. Datenabfragesprache Name Rang VorlNr Titel 2125 Sokrates C4 226 5001 Grundzüge 4 2137 2126 Russel C4 232 5041 Ethik 4 2125 2127 Kopernikus C3 310 5043 Erkenntnistheorie 3 2126 2133 Popper C3 52 5049 Mäeutik 2 2125 2134 Augustinus C3 309 4052 Logik 4 2125 2136 Curie C4 36 5052 Wissenschaftstheorie 3 2126 2137 Kant C4 7 5216 Bioethik 2 2126 5259 Der Wiener Kreis 2 2133 5022 Glaube und Wissen 2 2134 4630 Die drei Kritiken 4 2137 × Seite 22 Vorlesungen PersNr Sebastian Skritek Raum SWS PersNr Seite 23 Relationale Abfragesprachen 3. Datenabfragesprache 3.2. Anfragen über mehrere Relationen Relationale Abfragesprachen Anfragen über mehrere Relationen – Abarbeitung Professoren × Vorlesungen Raum SWS 3. Datenabfragesprache 3.2. Anfragen über mehrere Relationen Anfragen über mehrere Relationen – Abarbeitung Professoren × Vorlesungen PersNr Name Rang VorlNr Titel VPersNr PersNr Name Rang VorlNr Titel 2125 Sokrates C4 226 5001 Grundzüge 4 2137 2125 Sokrates C4 226 5001 Grundzüge 4 2137 2125 .. . Sokrates .. . C4 .. . 226 .. . 5041 .. . Ethik .. . 4 .. . 2125 .. . 2125 .. . Sokrates .. . C4 .. . 226 .. . 5041 .. . Ethik .. . 4 .. . 2125 .. . 2125 .. . Sokrates .. . C4 .. . 226 .. . 5049 .. . Mäeutik .. . 2 .. . 2125 .. . 2125 .. . Sokrates .. . C4 .. . 226 .. . 5049 .. . Mäeutik .. . 2 .. . 2125 .. . 2137 Kant C4 7 4630 Die drei Kritiken 4 2137 2137 Kant C4 7 4630 Die drei Kritiken 4 2137 2 Sebastian Skritek Seite 24 Relationale Abfragesprachen 3. Datenabfragesprache 3.2. Anfragen über mehrere Relationen σPersNr =VPersNr ∧Titel=0 Mäeutik 0 (Professoren × Vorlesungen) PersNr Name Rang 2125 Sokrates C4 Raum 226 VorlNr Titel 5049 Mäeutik SWS 2 σPersNr =VPersNr ∧Titel=0 Mäeutik 0 (Professoren × Vorlesungen) PersNr Name Rang 2125 Sokrates C4 VPersNr Raum 226 VorlNr Titel 5049 Mäeutik SWS 2 VPersNr 2125 Sebastian Skritek Seite 24 3. Datenabfragesprache 3.2. Anfragen über mehrere Relationen Anfragen über mehrere Relationen – Abarbeitung σPersNr =VPersNr ∧Titel=0 Mäeutik 0 (Professoren × Vorlesungen) VPersNr PersNr Name Rang 2125 2125 Sokrates C4 3 Sebastian Skritek SWS Überprüfe für jede Zeile die where Bedingungen Relationale Abfragesprachen Anfragen über mehrere Relationen – Abarbeitung Raum Seite 25 Sebastian Skritek Raum 226 VorlNr Titel 5049 Mäeutik SWS 2 VPersNr 2125 Projiziere auf select Attribute Seite 25 Relationale Abfragesprachen 3. Datenabfragesprache 3.2. Anfragen über mehrere Relationen Relationale Abfragesprachen Anfragen über mehrere Relationen – Abarbeitung 3. Datenabfragesprache 3.2. Anfragen über mehrere Relationen Anfragen über mehrere Relationen Beispiel σPersNr =VPersNr ∧Titel=0 Mäeutik 0 (Professoren × Vorlesungen) PersNr Name Rang 2125 Sokrates C4 3 Raum 226 VorlNr Titel SWS 5049 Mäeutik 2 Geben Sie Name und Matrikelnummer der Studierenden und den Titel der von ihnen gehörten Vorlesungen aus. VPersNr 2125 Studenten (MatrNr, Name , Sem ) hören (MatrNr, VorlNr) Vorlesungen (VorlNr, Titel , SWS , gelesenVon ) Projiziere auf select Attribute πName,Titel (. . . ) Name Titel Sokrates Mäeutik Sebastian Skritek Relationale Abfragesprachen Seite 25 3. Datenabfragesprache 3.2. Anfragen über mehrere Relationen Sebastian Skritek Relationale Abfragesprachen Anfragen über mehrere Relationen Seite 26 3. Datenabfragesprache 3.2. Anfragen über mehrere Relationen Platzhalter für Tabellen und Umbenennung von Attributen Beispiel Beispiel Selbe Anfrage bei der Vergabe von Platzhaltern für Tabellennamen: Geben Sie Name und Matrikelnummer der Studierenden und den Titel der von ihnen gehörten Vorlesungen aus. select s . MatrNr , s . Name , v . Titel from Studenten s , hören h , Vorlesungen v where s . MatrNr = h . MatrNr and h . VorlNr = v . VorlNr ; Studenten (MatrNr, Name , Sem ) hören (MatrNr, VorlNr) Vorlesungen (VorlNr, Titel , SWS , gelesenVon ) select Studenten . MatrNr , Name , Titel from Studenten , hören , Vorlesungen where Studenten . MatrNr = hören . MatrNr and hören . VorlNr = Vorlesungen . VorlNr ; Sebastian Skritek Seite 26 Sebastian Skritek Seite 27 Relationale Abfragesprachen 3. Datenabfragesprache 3.2. Anfragen über mehrere Relationen Relationale Abfragesprachen Platzhalter für Tabellen und Umbenennung von Attributen 3. Datenabfragesprache 3.2. Anfragen über mehrere Relationen Anfragen über mehrere Relationen Beispiel Selbe Anfrage bei der Vergabe von Platzhaltern für Tabellennamen: Struktur einer Abfrage über mehrere Tabellen: select s . MatrNr , s . Name , v . Titel from Studenten s , hören h , Vorlesungen v where s . MatrNr = h . MatrNr and h . VorlNr = v . VorlNr ; select Atrribut1 [ Attribut2 [ ... , AttributM [ from Tabelle1 [ as Tabelle2 [ as ... , TabelleN [ as where Bedingungen ; Beispiel Finde die Vorlesungsnummern der Vorlesungen, die indirekte Vorgänger 2. Stufe der VO 5216 sind (= Vorgänger der Vorgänger von 5216) voraussetzen ( VorgNr , NachfNr ) as ] a1 , as ] a2 , as ] aM ] t1 , ] t2 , ] tN select v1 . VorgNr as Vorg_Stufe_2 from voraussetzen v1 , voraussetzen v2 where v1 . NachfNr = v2 . VorgNr and v2 . NachfNr =5216; Sebastian Skritek Relationale Abfragesprachen Seite 27 3. Datenabfragesprache 3.2. Anfragen über mehrere Relationen Sebastian Skritek Seite 28 Relationale Abfragesprachen Übersetzung in relationale Algebra 3. Datenabfragesprache 3.2. Anfragen über mehrere Relationen Übersetzung in relationale Algebra Allgemeine Form einer (ungeschachteteln) SQL-Anfrage: Allgemeine Form einer (ungeschachteteln) SQL-Anfrage: select A1 , . . . , An from R1 , . . . , Rk where P ; select A1 , . . . , An from R1 , . . . , Rk where P ; wird zu: πA1 ,...,An σP (R1 × · · · × Rk ) Sebastian Skritek Seite 29 Sebastian Skritek Seite 29 Relationale Abfragesprachen 3. Datenabfragesprache 3.2. Anfragen über mehrere Relationen Relationale Abfragesprachen 3.3. Mengenoperationen Mengenoperationen Übersetzung in relationale Algebra Anfragen mit typkompatiblen Ausgabeattributen können mittels Mengenoperationen verknüpft werden. πA1 ,...,An Allgemeine Form einer (ungeschachteteln) SQL-Anfrage: σP Ohne Duplikate: union, intersect, except (minus) Mit Duplikaten: union all, intersect all, except all select A1 , . . . , An from R1 , . . . , Rk where P ; × × wird zu: πA1 ,...,An σP (R1 × · · · × Rk ) × R1 Rk R3 R2 Sebastian Skritek Relationale Abfragesprachen 3. Datenabfragesprache Seite 29 3. Datenabfragesprache 3.3. Mengenoperationen Sebastian Skritek Relationale Abfragesprachen Mengenoperationen Seite 30 3. Datenabfragesprache 3.4. Aggregatfunktionen Aggregatfunktionen Anfragen mit typkompatiblen Ausgabeattributen können mittels Mengenoperationen verknüpft werden. Aggregatfunktionen sind Operationen, die nicht auf einzelnen Tupeln, sondern auf einer Menge von Tupeln arbeiten: Ohne Duplikate: union, intersect, except (minus) Mit Duplikaten: union all, intersect all, except all Beispiel Suchen Sie den Namen aller Assistenten oder Professoren ( select Name from Assistenten ) union ( select Name from Professoren ); Sebastian Skritek Seite 30 Sebastian Skritek Seite 31 Relationale Abfragesprachen 3. Datenabfragesprache 3.4. Aggregatfunktionen Relationale Abfragesprachen Aggregatfunktionen 3. Datenabfragesprache 3.4. Aggregatfunktionen Aggregatfunktionen Aggregatfunktionen sind Operationen, die nicht auf einzelnen Tupeln, sondern auf einer Menge von Tupeln arbeiten: Aggregatfunktionen sind Operationen, die nicht auf einzelnen Tupeln, sondern auf einer Menge von Tupeln arbeiten: avg(), max(), min(), sum() berechnen den Wert einer Menge von Tupeln, avg(), max(), min(), sum() berechnen den Wert einer Menge von Tupeln, count() zählt die Anzahl der Tupel in der Menge. Sebastian Skritek Relationale Abfragesprachen Seite 31 3. Datenabfragesprache 3.4. Aggregatfunktionen Sebastian Skritek Relationale Abfragesprachen Aggregatfunktionen Seite 31 3. Datenabfragesprache 3.4. Aggregatfunktionen Aggregatfunktionen Beispiel Beispiel Geben Sie die durchschnittliche/maximale/minimale Inskriptionsdauer der Studenten an; geben Sie an, wieviele Studierende es gibt. Geben Sie die durchschnittliche/maximale/minimale Inskriptionsdauer der Studenten an; geben Sie an, wieviele Studierende es gibt. Studenten Sebastian Skritek Seite 32 Sebastian Skritek MatrNr Name Sem 24002 Xenokrates 18 25403 Jonas 12 26120 Fichte 10 26830 Aristoxenos 8 27550 Schopenhauer 6 28106 Carnap 3 29120 Theophrastos 2 29555 Feuerbach 2 Seite 32 Relationale Abfragesprachen 3. Datenabfragesprache 3.4. Aggregatfunktionen Relationale Abfragesprachen Aggregatfunktionen 3. Datenabfragesprache 3.4. Aggregatfunktionen Aggregatfunktionen Beispiel Beispiel Geben Sie die Summe der von C4 Professoren gehaltenen Vorlesungsstunden an. Geben Sie die durchschnittliche/maximale/minimale Inskriptionsdauer der Studenten an; geben Sie an, wieviele Studierende es gibt. select avg ( Semester ) from Studenten ; select max ( Semester ) from Studenten ; select min ( Semester ) from Studenten ; select count ( MatrNr ) from Studenten ; Studenten MatrNr Name Sem 24002 Xenokrates 25403 Jonas 12 26120 Fichte 10 26830 Aristoxenos 8 27550 Schopenhauer 6 28106 Carnap 3 29120 Theophrastos 2 29555 Feuerbach Vorlesungen 18 VorlNr 2 Sebastian Skritek Seite 32 Relationale Abfragesprachen 3. Datenabfragesprache 3.4. Aggregatfunktionen Titel Professoren gelesenVon 5001 Grundzüge 4 2137 5041 Ethik 4 2125 5043 Erkenntnistheorie 3 2126 5049 Mäeutik 2 2125 4052 Logik 4 2125 5259 Der Wiener Kreis 2 2133 5216 .. . Bioethik .. . 2 .. . 2126 .. . PersNr Name Rang 2125 Sokrates C4 2126 Russel C4 2133 .. . Popper .. . C3 .. . Sebastian Skritek Relationale Abfragesprachen Aggregatfunktionen SWS Seite 33 3. Datenabfragesprache 3.5. Aggregate und Gruppierung Aggregate und Gruppierung Beispiel Geben Sie die Summe der von C4 Professoren gehaltenen Vorlesungsstunden an. select sum ( SWS ) from Vorlesungen , Professoren where gelesenVon = PersNr and Rang = ’ C4 ’; Problem: Wollen nicht die Summe aller Vorlesungsstunden absolut berechnen, sondern zu jedem Vortragenden die Summe der von ihm gehaltenen Stunden. Vorlesungen VorlNr Titel SWS 5001 Grundzüge 4 2137 5041 Ethik 4 2125 5043 Erkenntnistheorie 3 2126 5049 Mäeutik 2 2125 4052 Logik 4 2125 5259 Der Wiener Kreis 2 2133 5216 .. . Bioethik .. . 2 .. . 2126 .. . Sebastian Skritek Professoren gelesenVon PersNr Name Rang 2125 Sokrates C4 2126 Russel C4 2133 .. . Popper .. . C3 .. . Seite 33 Sebastian Skritek Seite 34 Relationale Abfragesprachen 3. Datenabfragesprache 3.5. Aggregate und Gruppierung Relationale Abfragesprachen Aggregate und Gruppierung 3. Datenabfragesprache 3.5. Aggregate und Gruppierung Aggregate und Gruppierung Problem: Wollen nicht die Summe aller Vorlesungsstunden absolut berechnen, sondern zu jedem Vortragenden die Summe der von ihm gehaltenen Stunden. Problem: Wollen nicht die Summe aller Vorlesungsstunden absolut berechnen, sondern zu jedem Vortragenden die Summe der von ihm gehaltenen Stunden. Lösung: Bilde zu jedem Vortragenden eine Gruppe (mittels der group by Klause) und summiere nur innerhalb dieser Gruppe. Lösung: Bilde zu jedem Vortragenden eine Gruppe (mittels der group by Klause) und summiere nur innerhalb dieser Gruppe. Allgemein: Alle Zeilen einer Tabelle, die auf den Attributen der group by Klause den selben Wert annehmen, werden zu einer Gruppe zusammengefasst und die Aggregatfunktionen werden bezüglich der Gruppe ausgewertet. Sebastian Skritek Relationale Abfragesprachen Seite 34 3. Datenabfragesprache 3.5. Aggregate und Gruppierung Sebastian Skritek Relationale Abfragesprachen Aggregate und Gruppierung Seite 34 3. Datenabfragesprache 3.5. Aggregate und Gruppierung Bsp: Aggregate und Gruppierung Problem: Wollen nicht die Summe aller Vorlesungsstunden absolut berechnen, sondern zu jedem Vortragenden die Summe der von ihm gehaltenen Stunden. Beispiele Geben Sie zu jedem C4 Professor die Summe der von ihr/ihm gehaltenen Vorlesungsstunden an. Lösung: Bilde zu jedem Vortragenden eine Gruppe (mittels der group by Klause) und summiere nur innerhalb dieser Gruppe. Professoren ( PersNr , Name , Rang , Raum ) Vorlesungen ( VorlNr , Titel , SWS , gelesenVon ) Allgemein: Alle Zeilen einer Tabelle, die auf den Attributen der group by Klause den selben Wert annehmen, werden zu einer Gruppe zusammengefasst und die Aggregatfunktionen werden bezüglich der Gruppe ausgewertet. Bedingungen an die aggregierten Werte werden in der having Klause angeführt. Sebastian Skritek Seite 34 Sebastian Skritek Seite 35 Relationale Abfragesprachen 3. Datenabfragesprache 3.5. Aggregate und Gruppierung Relationale Abfragesprachen Bsp: Aggregate und Gruppierung 3. Datenabfragesprache 3.5. Aggregate und Gruppierung Bsp: Aggregate und Gruppierung Beispiele Beispiele Geben Sie zu jedem C4 Professor die Summe der von ihr/ihm gehaltenen Vorlesungsstunden an. Geben Sie zu jedem C4 Professor, der vor allem lange Vorlesungen (Durchschnitt größer gleich 3) hält, die Summe der von ihr/ihm gehaltenen Vorlesungsstunden an. Professoren ( PersNr , Name , Rang , Raum ) Vorlesungen ( VorlNr , Titel , SWS , gelesenVon ) Professoren ( PersNr , Name , Rang , Raum ) Vorlesungen ( VorlNr , Titel , SWS , gelesenVon ) select gelesenVon , sum ( SWS ) from Vorlesungen , Professoren where gelesenVon = PersNr and Rang = ’ C4 ’ group by gelesenVon ; Sebastian Skritek Relationale Abfragesprachen Seite 35 3. Datenabfragesprache 3.5. Aggregate und Gruppierung Sebastian Skritek Seite 36 Relationale Abfragesprachen Bsp: Aggregate und Gruppierung 3. Datenabfragesprache 3.5. Aggregate und Gruppierung Aggregate und Gruppierung – Abarbeitung Beispiele Geben Sie zu jedem C4 Professor, der vor allem lange Vorlesungen (Durchschnitt größer gleich 3) hält, die Summe der von ihr/ihm gehaltenen Vorlesungsstunden an. Professoren ( PersNr , Name , Rang , Raum ) Vorlesungen ( VorlNr , Titel , SWS , gelesenVon ) select gelesenVon , Name , sum ( SWS ) from Vorlesungen , Professoren where gelesenVon = PersNr and Rang = ’ C4 ’ group by gelesenVon , Name having avg ( SWS ) >= 3; PersNr Name Rang 2125 Sokrates C4 2125 .. . Sokrates .. . C4 .. . 2125 .. . Sokrates .. . 2133 .. . 2137 Professoren × Vorlesungen Raum VorlNr Titel SWS gelesenVon 226 5001 Grundzüge 4 2137 226 .. . 5041 .. . Ethik .. . 4 .. . 2125 .. . C4 .. . 226 .. . 5049 .. . Mäeutik .. . 2 .. . 2125 .. . Popper .. . C3 .. . 52 .. . 5001 .. . Grundzüge .. . 4 .. . 2137 .. . Kant C4 7 4630 Die drei Kritiken 4 2137 where-Bedingung Sebastian Skritek Seite 36 Sebastian Skritek Seite 37 Relationale Abfragesprachen 3. Datenabfragesprache 3.5. Aggregate und Gruppierung Relationale Abfragesprachen Aggregate und Gruppierung 3. Datenabfragesprache Aggregate und Gruppierung Gruppierung where-Bedingung PersNr Name Rang 2137 Kant C4 2125 Sokrates C4 2126 Russel C4 2125 Sokrates C4 2125 Sokrates 2126 2126 2137 gelesenVon PersNr Name Rang 4 2137 2125 Sokrates C4 4 2125 2125 Sokrates C4 Erkenntnistheorie 3 2126 2125 Sokrates Mäeutik 2 2125 2126 Russel 4052 Logik 4 2125 2126 232 5052 Wissenschaftstheorie 3 2126 232 5216 Bioethik 2 2126 7 4630 Die drei Kritiken 4 2137 Raum VorlNr Titel 7 5001 Grundzüge 226 5041 Ethik 232 5043 226 5049 C4 226 Russel C4 Russel C4 Kant C4 SWS VorlNr Titel SWS 226 5041 Ethik 4 2125 226 5049 Mäeutik 2 2125 C4 226 4052 Logik 4 2125 C4 232 5043 Erkenntnistheorie 3 2126 Russel C4 232 5052 Wissenschaftstheorie 3 2126 2126 Russel C4 232 5216 Bioethik 2 2126 2137 Kant C4 7 5001 Grundzüge 4 2137 2137 Kant C4 7 4630 Die drei Kritiken 4 2137 Gruppierung Seite 38 3. Datenabfragesprache 3.5. Aggregate und Gruppierung Seite 39 3. Datenabfragesprache Rang 2125 Sokrates C4 2125 Sokrates C4 2125 Sokrates 2137 2137 Raum 3.5. Aggregate und Gruppierung Aggregate und Gruppierung having-Bedingung Name gelesenVon Sebastian Skritek Relationale Abfragesprachen Aggregate und Gruppierung PersNr Raum having-Bedingung Sebastian Skritek Relationale Abfragesprachen 3.5. Aggregate und Gruppierung having-Bedingung VorlNr Titel SWS gelesenVon PersNr Name Rang 226 5041 Ethik 226 5049 Mäeutik 4 2125 2125 Sokrates C4 2 2125 2125 Sokrates C4 C4 226 4052 Logik 4 2125 2125 Sokrates Kant C4 7 Kant C4 7 5001 Grundzüge 4 2137 2137 4630 Die drei Kritiken 4 2137 2137 Raum VorlNr Titel SWS gelesenVon 226 5041 Ethik 4 2125 226 5049 Mäeutik 2 2125 C4 226 4052 Logik 4 2125 Kant C4 7 5001 Grundzüge 4 2137 Kant C4 7 4630 Die drei Kritiken 4 2137 Aggregation (sum) und Projektion Sebastian Skritek Seite 40 Sebastian Skritek gelesenVon Name sum(SWS) 2125 Sokrates 10 2137 Kant 8 Seite 40 Relationale Abfragesprachen 3. Datenabfragesprache 3.5. Aggregate und Gruppierung Relationale Abfragesprachen Aggregate und Gruppierung 3. Datenabfragesprache 3.5. Aggregate und Gruppierung Aggregate und Gruppierung Achtung: SQL erzeugt pro Gruppe ein Ergebnistupel Achtung: SQL erzeugt pro Gruppe ein Ergebnistupel ⇒ Alle in der select Klausel aufgeführten Attribute- außer den aggregierten - müssen auch in der group by Klausel aufgeführt werden. So wird sichergestellt, dass die ausgegebenen Attribute sich nicht innerhalb der Gruppe ändern. ⇒ Alle in der select Klausel aufgeführten Attribute- außer den aggregierten - müssen auch in der group by Klausel aufgeführt werden. So wird sichergestellt, dass die ausgegebenen Attribute sich nicht innerhalb der Gruppe ändern. select gelesenVon , Name, sum ( SWS ) ........ group by gelesenVon , Name; Sebastian Skritek Relationale Abfragesprachen Seite 41 3. Datenabfragesprache 3.5. Aggregate und Gruppierung Sebastian Skritek Relationale Abfragesprachen Bsp: Aggregate und Gruppierung Seite 41 3. Datenabfragesprache 3.5. Aggregate und Gruppierung Bsp: Aggregate und Gruppierung Beispiel Beispiel Geben Sie die Namen der Studenten aus, die am längsten studieren. Geben Sie die Namen der Studenten aus, die am längsten studieren. Studenten ( MatrNr , Name , Semester ) Studenten ( MatrNr , Name , Semester ) select Name , max ( Semester ) from Studenten ; select Name , max ( Semester ) from Studenten ; ⇒ ORA-00937: not a single-group group function Sebastian Skritek Seite 42 Sebastian Skritek Seite 42 Relationale Abfragesprachen 3. Datenabfragesprache 3.5. Aggregate und Gruppierung Relationale Abfragesprachen Bsp: Aggregate und Gruppierung 3. Datenabfragesprache 3.5. Aggregate und Gruppierung Bsp: Aggregate und Gruppierung Beispiel Beispiel (2. Versuch) Geben Sie die Namen der Studenten aus, die am längsten studieren. Geben Sie die Namen der Studenten aus, die am längsten studieren. Studenten ( MatrNr , Name , Semester ) Studenten ( MatrNr , Name , Semester ) select Name , max ( Semester ) from Studenten ; ⇒ ORA-00937: not a single-group group function ⇒ ERROR: column ‘‘studenten.name’’ must appear in the GROUP BY clause or be used in an aggregate function Sebastian Skritek Relationale Abfragesprachen Seite 42 3. Datenabfragesprache 3.5. Aggregate und Gruppierung Sebastian Skritek Relationale Abfragesprachen Bsp: Aggregate und Gruppierung Seite 43 3. Datenabfragesprache 3.5. Aggregate und Gruppierung Bsp: Aggregate und Gruppierung Beispiel (2. Versuch) Beispiel (2. Versuch) Geben Sie die Namen der Studenten aus, die am längsten studieren. Geben Sie die Namen der Studenten aus, die am längsten studieren. Studenten ( MatrNr , Name , Semester ) Studenten ( MatrNr , Name , Semester ) select Name , max ( Semester ) from Studenten group by Name ; select Name , max ( Semester ) from Studenten group by Name ; ⇒ Alle Tupel ?!? Sebastian Skritek Seite 43 Sebastian Skritek Seite 43 Relationale Abfragesprachen 3. Datenabfragesprache 3.5. Aggregate und Gruppierung Relationale Abfragesprachen Bsp: Aggregate und Gruppierung 3. Datenabfragesprache 3.6. Geschachtelte Anfragen Geschachtelte Anfragen Es gibt vielfältige Möglichkeiten select Anweisungen zu verknüpfen. Folgende Einteilung ist abhängig vom Ergebnis der Unteranfrage (ein Wert oder eine Relation) Beispiel (2. Versuch) Geben Sie die Namen der Studenten aus, die am längsten studieren. Ergebnis der Unteranfrage besteht aus einem Tupel mit einem Attribut (= ein Wert): Studenten ( MatrNr , Name , Semester ) • Unteranfrage anstelle eines skalaren Wertes in select bzw. where Klausel select Name , max ( Semester ) from Studenten group by Name ; ⇒ Alle Tupel ?!? Lösung: Geschachtelte Anfrage Sebastian Skritek Seite 43 Relationale Abfragesprachen 3. Datenabfragesprache 3.6. Geschachtelte Anfragen Sebastian Skritek Seite 44 Relationale Abfragesprachen Geschachtelte Anfragen 3. Datenabfragesprache 3.6. Geschachtelte Anfragen Geschachtelte Anfragen Es gibt vielfältige Möglichkeiten select Anweisungen zu verknüpfen. Folgende Einteilung ist abhängig vom Ergebnis der Unteranfrage (ein Wert oder eine Relation) Es gibt vielfältige Möglichkeiten select Anweisungen zu verknüpfen. Folgende Einteilung ist abhängig vom Ergebnis der Unteranfrage (ein Wert oder eine Relation) Ergebnis der Unteranfrage besteht aus einem Tupel mit einem Attribut (= ein Wert): Ergebnis der Unteranfrage besteht aus einem Tupel mit einem Attribut (= ein Wert): • Unteranfrage anstelle eines skalaren Wertes in select bzw. where • Unteranfrage anstelle eines skalaren Wertes in select bzw. where Klausel Klausel Ergebnis der Unterabfrage eine Relation Ergebnis der Unterabfrage eine Relation • Unteranfrage in from Klausel • Mengenvergleiche: in, not in, any, all • Verknüpfung über Quantoren: exists • Unteranfrage in from Klausel • Mengenvergleiche: in, not in, any, all • Verknüpfung über Quantoren: exists Bei geschachtelten Abfragen ist für die Laufzeit ausschlaggebend, ob es sich um korrelierte oder unkorrelierte Abfragen handelt Sebastian Skritek Seite 44 Sebastian Skritek Seite 44 Relationale Abfragesprachen 3. Datenabfragesprache 3.6. Geschachtelte Anfragen Relationale Abfragesprachen Geschachtelte Anfragen 3. Datenabfragesprache 3.6. Geschachtelte Anfragen Geschachtelte Anfragen Unteranfrage in der where Klausel Unteranfrage in der where Klausel Beispiel Geben Sie die Namen der Studenten aus, die am längsten studieren. Studenten ( MatrNr , Name , Semester ) Sebastian Skritek Relationale Abfragesprachen Seite 45 3. Datenabfragesprache 3.6. Geschachtelte Anfragen Sebastian Skritek Relationale Abfragesprachen Geschachtelte Anfragen Seite 45 3. Datenabfragesprache 3.6. Geschachtelte Anfragen Geschachtelte Anfragen Unteranfrage in der select Klausel Unteranfrage in der where Klausel Beispiel Geben Sie die Namen der Studenten aus, die am längsten studieren. Studenten ( MatrNr , Name , Semester ) select Name from Studenten where Semester = ( select max ( Semester ) from Studenten ); Sebastian Skritek Seite 45 Sebastian Skritek Seite 46 Relationale Abfragesprachen 3. Datenabfragesprache 3.6. Geschachtelte Anfragen Relationale Abfragesprachen Geschachtelte Anfragen 3. Datenabfragesprache 3.6. Geschachtelte Anfragen Geschachtelte Anfragen Unteranfrage in der select Klausel Unteranfrage in der select Klausel Beispiel Beispiel Geben Sie zu jedem Vortragenden seine Lehrbelastung aus. Geben Sie zu jedem Vortragenden seine Lehrbelastung aus. Professoren ( PersNr , Name , Rang , Raum ) Vorlesungen ( VorlNr , Titel , SWS , gelesenVon ) Professoren ( PersNr , Name , Rang , Raum ) Vorlesungen ( VorlNr , Titel , SWS , gelesenVon ) select p . Name , ( select sum ( SWS ) from Vorlesungen where gelesenVon = p . PersNr ) from Professoren p ; select p . Name , ( select sum ( SWS ) from Vorlesungen where gelesenVon = p . PersNr ) from Professoren p ; Achtung: Die Unteranfrage ist korreliert (= sie greift auf Attribute der umschließenden Anfrage zu). Für jedes Ergebnistupel wird die Unteranfrage einmal ausgeführt. Sebastian Skritek Relationale Abfragesprachen Seite 46 3. Datenabfragesprache 3.6. Geschachtelte Anfragen Sebastian Skritek Relationale Abfragesprachen Geschachtelte Anfragen Seite 46 3. Datenabfragesprache 3.6. Geschachtelte Anfragen Geschachtelte Anfragen Beispiel (Entschachtelung mittels group by) Beispiel (Entschachtelung mittels group by) Geben Sie zu jedem Vortragenden seine Lehrbelastung aus. Geben Sie zu jedem Vortragenden seine Lehrbelastung aus. Professoren ( PersNr , Name , Rang , Raum ) Vorlesungen ( VorlNr , Titel , SWS , gelesenVon ) Professoren ( PersNr , Name , Rang , Raum ) Vorlesungen ( VorlNr , Titel , SWS , gelesenVon ) select p . PersNr , p . Name , sum ( SWS ) from Professoren p , Vorlesungen v where v . gelesenVon = p . PersNr group by p . PersNr , p . Name Sebastian Skritek Seite 47 Sebastian Skritek Seite 47 Relationale Abfragesprachen 3. Datenabfragesprache 3.6. Geschachtelte Anfragen Relationale Abfragesprachen Geschachtelte Anfragen 3. Datenabfragesprache 3.6. Geschachtelte Anfragen Geschachtelte Anfragen Unteranfrage in der from Klausel Unteranfrage in der from Klausel Beispiel Gesucht sind jene Studenten, die mehr als 2 Vorlesungen hören. Studenten ( MatrNr , Name , Semester ) hören ( MatrNr , VorlNr ) Sebastian Skritek Relationale Abfragesprachen Seite 48 3. Datenabfragesprache 3.6. Geschachtelte Anfragen Sebastian Skritek Relationale Abfragesprachen Geschachtelte Anfragen Seite 48 3. Datenabfragesprache 3.6. Geschachtelte Anfragen Geschachtelte Anfragen Unteranfrage in der from Klausel Beispiel Beispiel (Entschachtelung mittels having) Gesucht sind jene Studenten, die mehr als 2 Vorlesungen hören. Gesucht sind jene Studenten, die mehr als 2 Vorlesungen hören. Studenten ( MatrNr , Name , Semester ) hören ( MatrNr , VorlNr ) Studenten ( MatrNr , Name , Semester ) hören ( MatrNr , VorlNr ) select tmp . MatrNr , tmp . Name , tmp . VorlAnzahl from ( select s . MatrNr , s . Name , count (*) as VorlAnzahl from Studenten s , hören h where s . MatrNr = h . MatrNr group by s . MatrNr , s . Name ) tmp where tmp . VorlAnzahl > 2; select s . MatrNr , s . Name , count (*) as VorlAnzahl from Studenten s , hören h where s . MatrNr = h . MatrNr group by s . MatrNr , s . Name having count (*) > 2; Sebastian Skritek Seite 48 Sebastian Skritek Seite 49 Relationale Abfragesprachen 3. Datenabfragesprache 3.6. Geschachtelte Anfragen Relationale Abfragesprachen Geschachtelte Anfragen – Mengenvergleiche Unteranfrage in der where Klausel Mengenvergleich mit in/not in Sebastian Skritek Seite 50 3. Datenabfragesprache 3.6. Geschachtelte Anfragen Geschachtelte Anfragen – Mengenvergleiche Unteranfrage in der where Klausel Relationale Abfragesprachen 3. Datenabfragesprache 3.6. Geschachtelte Anfragen Sebastian Skritek Relationale Abfragesprachen Geschachtelte Anfragen – Mengenvergleiche Seite 50 3. Datenabfragesprache 3.6. Geschachtelte Anfragen Geschachtelte Anfragen – Mengenvergleiche Unteranfrage in der where Klausel Mengenvergleich mit in/not in Unteranfrage in der where Klausel Mengenvergleich mit in/not in Beispiel Beispiel Gesucht sind jene Professoren, die keine Lehrveranstaltungen halten. Gesucht sind jene Professoren, die keine Lehrveranstaltungen halten. Professoren ( PersNr , Name , Rang , Raum ) Vorlesungen ( VorlNr , Titel , SWS , gelesenVon ) Professoren ( PersNr , Name , Rang , Raum ) Vorlesungen ( VorlNr , Titel , SWS , gelesenVon ) select Name from Professoren where PersNr not in ( select gelesenVon from Vorlesungen ); Sebastian Skritek Seite 50 Sebastian Skritek Seite 50 Relationale Abfragesprachen 3. Datenabfragesprache 3.6. Geschachtelte Anfragen Relationale Abfragesprachen Geschachtelte Anfragen – Mengenvergleiche 3. Datenabfragesprache 3.6. Geschachtelte Anfragen Geschachtelte Anfragen – Mengenvergleiche Mengenvergleich mit in/not in Mengenvergleich mit in/not in Beispiel Beispiel Gesucht sind für alle Studierenden jene Vorlesungen die sie gehört und zu denen sie eine positive Prüfung abgelegt haben. Gesucht sind für alle Studierenden jene Vorlesungen die sie gehört und zu denen sie eine positive Prüfung abgelegt haben. hören ( MatrNr , VorlNr ) prüfen ( MatrNr , VorlNr , PersNr , Note ) hören ( MatrNr , VorlNr ) prüfen ( MatrNr , VorlNr , PersNr , Note ) select MatrNr , VorlNr from hören where ( MatrNr , VorlNr ) in ( select MatrNr , VorlNr from prüfen where Note < 5); Sebastian Skritek Relationale Abfragesprachen Seite 51 3. Datenabfragesprache 3.6. Geschachtelte Anfragen Sebastian Skritek Relationale Abfragesprachen Geschachtelte Anfragen – Mengenvergleiche Seite 51 3. Datenabfragesprache 3.6. Geschachtelte Anfragen Geschachtelte Anfragen – Mengenvergleiche Beispiel (Entschachtelung mittels intersect) Beispiel (Entschachtelung mittels intersect) Gesucht sind für alle Studierenden jene Vorlesungen die sie gehört und zu denen sie eine positive Prüfung abgelegt haben. Gesucht sind für alle Studierenden jene Vorlesungen die sie gehört und zu denen sie eine positive Prüfung abgelegt haben. hören ( MatrNr , VorlNr ) prüfen ( MatrNr , VorlNr , PersNr , Note ) hören ( MatrNr , VorlNr ) prüfen ( MatrNr , VorlNr , PersNr , Note ) ( select MatrNr , VorlNr from hören ) intersect ( select MatrNr , VorlNr from prüfen where Note < 5); Sebastian Skritek Seite 52 Sebastian Skritek Seite 52 Relationale Abfragesprachen 3. Datenabfragesprache 3.6. Geschachtelte Anfragen Relationale Abfragesprachen Geschachtelte Anfragen – Mengenvergleiche 3. Datenabfragesprache 3.6. Geschachtelte Anfragen Geschachtelte Anfragen – Mengenvergleiche Mengenvergleich mit any/all (Achtung: kein Allquantor, nur der Vergleich eines Wertes mit einer Menge von Werten.) Mengenvergleich mit any/all (Achtung: kein Allquantor, nur der Vergleich eines Wertes mit einer Menge von Werten.) Beispiel Suchen Sie jene Studenten, die am längsten studieren. select Name from Studenten where Semester >= all ( select Semester from Studenten ); Sebastian Skritek Relationale Abfragesprachen Seite 53 3. Datenabfragesprache 3.6. Geschachtelte Anfragen Sebastian Skritek Relationale Abfragesprachen Geschachtelte Anfragen – Mengenvergleiche Seite 53 3. Datenabfragesprache 3.6. Geschachtelte Anfragen Geschachtelte Anfragen – Mengenvergleiche Mengenvergleich mit any/all (Achtung: kein Allquantor, nur der Vergleich eines Wertes mit einer Menge von Werten.) Beispiel Beispiel Suchen Sie jene Studenten, die nicht am längsten studieren. Suchen Sie jene Studenten, die am längsten studieren. select Name from Studenten where Semester < any ( select Semester from Studenten ); select Name from Studenten where Semester >= all ( select Semester from Studenten ); gleichbedeutend mit: select Name from Studenten where Semester = ( select max ( Semester ) from Studenten ); Sebastian Skritek Seite 53 Sebastian Skritek Seite 54 Relationale Abfragesprachen 3. Datenabfragesprache 3.6. Geschachtelte Anfragen Relationale Abfragesprachen Geschachtelte Anfragen – Mengenvergleiche 3. Datenabfragesprache 3.6. Geschachtelte Anfragen Geschachtelte Anfragen – Aggregatfunktionen Geschachtelte Aggregatfunktionen sind nicht erlaubt ⇒ Unteranfrage verwenden Beispiel Suchen Sie jene Studenten, die nicht am längsten studieren. select Name from Studenten where Semester < any ( select Semester from Studenten ); gleichbedeutend mit: select Name from Studenten where Semester < ( select max ( Semester ) from Studenten ); Sebastian Skritek Relationale Abfragesprachen Seite 54 3. Datenabfragesprache 3.6. Geschachtelte Anfragen Sebastian Skritek Relationale Abfragesprachen Geschachtelte Anfragen – Aggregatfunktionen Seite 55 3. Datenabfragesprache 3.6. Geschachtelte Anfragen Geschachtelte Anfragen – Aggregatfunktionen Geschachtelte Aggregatfunktionen sind nicht erlaubt ⇒ Unteranfrage verwenden Geschachtelte Aggregatfunktionen sind nicht erlaubt ⇒ Unteranfrage verwenden Beispiel Beispiel Suchen Sie C4 Professoren, die die meisten Vorlesungsstunden halten. Suchen Sie C4 Professoren, die die meisten Vorlesungsstunden halten. Professoren ( PersNr , Name , Rang , Raum ) Vorlesungen ( VorlNr , Titel , SWS , gelesenVon ) Professoren ( PersNr , Name , Rang , Raum ) Vorlesungen ( VorlNr , Titel , SWS , gelesenVon ) select gelesenVon , max(sum(SWS)) from Vorlesungen , Professoren where gelesenVon = PersNr and Rang = ’ C4 ’ group by gelesenVon ; Sebastian Skritek Seite 55 Sebastian Skritek Seite 55 Relationale Abfragesprachen 3. Datenabfragesprache 3.6. Geschachtelte Anfragen Relationale Abfragesprachen Geschachtelte Anfragen – Aggregatfunktionen 3. Datenabfragesprache 3.6. Geschachtelte Anfragen Geschachtelte Anfragen – Aggregatfunktionen Geschachtelte Aggregatfunktionen sind nicht erlaubt ⇒ Unteranfrage verwenden Geschachtelte Aggregatfunktionen sind nicht erlaubt ⇒ Unteranfrage verwenden Beispiel Beispiel Suchen Sie C4 Professoren, die die meisten Vorlesungsstunden halten. Suchen Sie C4 Professoren, die die meisten Vorlesungsstunden halten. select gelesenVon , sum ( SWS ) from Vorlesungen , Professoren where gelesenVon = PersNr and Rang = ’ C4 ’ group by gelesenVon having sum ( SWS ) >= all ( select sum ( SWS ) from Vorlesungen , Professoren where gelesenVon = PersNr and Rang = ’ C4 ’ group by gelesenVon ); Sebastian Skritek Relationale Abfragesprachen Seite 56 3. Datenabfragesprache 3.7. Existentiell quantifizierte Anfragen Sebastian Skritek Relationale Abfragesprachen Existentiell quantifizierte Anfragen Seite 56 3. Datenabfragesprache 3.7. Existentiell quantifizierte Anfragen Existentiell quantifizierte Anfragen Verknüpfung mit einer Unteranfrage durch Existenzquantor exists Verknüpfung mit einer Unteranfrage durch Existenzquantor exists exists überprüft, ob die Unterabfrage Tupel enthält oder nicht. exists überprüft, ob die Unterabfrage Tupel enthält oder nicht. Beispiel Gesucht sind all jene Studenten, die älter als der jüngste Professor sind. Sebastian Skritek Seite 57 Sebastian Skritek Seite 57 Relationale Abfragesprachen 3. Datenabfragesprache 3.7. Existentiell quantifizierte Anfragen Relationale Abfragesprachen Existentiell quantifizierte Anfragen 3. Datenabfragesprache 3.7. Existentiell quantifizierte Anfragen Existentiell quantifizierte Anfragen Verknüpfung mit einer Unteranfrage durch Existenzquantor exists Verknüpfung mit einer Unteranfrage durch Existenzquantor exists exists überprüft, ob die Unterabfrage Tupel enthält oder nicht. exists überprüft, ob die Unterabfrage Tupel enthält oder nicht. Beispiel Beispiel Gesucht sind all jene Studenten, die älter als der jüngste Professor sind. Gesucht sind all jene Studenten, die älter als der jüngste Professor sind. select s .* from Studenten s where exists ( select p .* from Professoren p where p . GebDatum > s . GebDatum ); select s .* from Studenten s where exists ( select p .* from Professoren p where p . GebDatum > s . GebDatum ); Korrelierte Unteranfrage (s.GebDatum und Studenten s)! Sebastian Skritek Relationale Abfragesprachen Seite 57 3. Datenabfragesprache 3.7. Existentiell quantifizierte Anfragen Sebastian Skritek Relationale Abfragesprachen Existentiell quantifizierte Anfragen Seite 57 3. Datenabfragesprache 3.7. Existentiell quantifizierte Anfragen Existentiell quantifizierte Anfragen Eine nicht korrelierte Lösung ist: Eine nicht korrelierte Lösung ist: Beispiel (Nicht korreliert) Beispiel (Nicht korreliert) Gesucht sind all jene Studenten, die älter als der jüngste Professor sind. Gesucht sind all jene Studenten, die älter als der jüngste Professor sind. select s .* from Studenten s where s . GebDatum < ( select max ( p . GebDatum ) from Professoren p ); select s .* from Studenten s where s . GebDatum < ( select max ( p . GebDatum ) from Professoren p ); oder select s .* from Studenten s where s . GebDatum < any ( select p . GebDatum from Professoren p ); oder . . . Sebastian Skritek Seite 58 Sebastian Skritek Seite 58 Relationale Abfragesprachen 3. Datenabfragesprache 3.7. Existentiell quantifizierte Anfragen Relationale Abfragesprachen Existentiell quantifizierte Anfragen 3. Datenabfragesprache 3.7. Existentiell quantifizierte Anfragen Existentiell quantifizierte Anfragen Beispiel Beispiel Suchen Sie all jene Professoren, die keine Lehrveranstaltungen halten. Suchen Sie all jene Professoren, die keine Lehrveranstaltungen halten. Professoren ( PersNr , Name , Rang , Raum ) Vorlesungen ( VorlNr , Titel , SWS , gelesenVon ) Professoren ( PersNr , Name , Rang , Raum ) Vorlesungen ( VorlNr , Titel , SWS , gelesenVon ) select Name from Professoren where not exists ( select * from Vorlesungen where gelesenVon = PersNr ); Sebastian Skritek Relationale Abfragesprachen Seite 59 3. Datenabfragesprache 3.7. Existentiell quantifizierte Anfragen Sebastian Skritek Relationale Abfragesprachen Existentiell quantifizierte Anfragen Seite 59 3. Datenabfragesprache 3.7. Existentiell quantifizierte Anfragen Existentiell quantifizierte Anfragen Eine nicht korrelierte Lösung ist: Beispiel select Name from Professoren where PersNr not in ( select gelesenVon from Vorlesungen ); Suchen Sie all jene Professoren, die keine Lehrveranstaltungen halten. Professoren ( PersNr , Name , Rang , Raum ) Vorlesungen ( VorlNr , Titel , SWS , gelesenVon ) oder select Name from Professoren where not exists ( select * from Vorlesungen where gelesenVon = PersNr ); Korrelierte Unteranfrage (PersNr und Professoren)! Sebastian Skritek Seite 59 Sebastian Skritek Seite 60 Relationale Abfragesprachen 3. Datenabfragesprache 3.7. Existentiell quantifizierte Anfragen Relationale Abfragesprachen Existentiell quantifizierte Anfragen 3. Datenabfragesprache 3.7. Existentiell quantifizierte Anfragen Existentiell quantifizierte Anfragen Eine nicht korrelierte Lösung ist: Beispiel select Name from Professoren where PersNr not in ( select gelesenVon from Vorlesungen ); Suchen Sie jene Assistenten, die für einen Professor arbeiten, der jünger ist, als sie selbst. Professoren ( PersNr , Name , Rang , Raum , GebDatum ) Assistenten ( PersNr , Name , GebDatum , Boss ) oder ( select PersNr from Professoren ) except ( select gelesenVon from Vorlesungen ); Sebastian Skritek Relationale Abfragesprachen Seite 60 3. Datenabfragesprache 3.7. Existentiell quantifizierte Anfragen Sebastian Skritek Relationale Abfragesprachen Existentiell quantifizierte Anfragen Seite 61 3. Datenabfragesprache 3.7. Existentiell quantifizierte Anfragen Existentiell quantifizierte Anfragen Beispiel Beispiel Suchen Sie jene Assistenten, die für einen Professor arbeiten, der jünger ist, als sie selbst. Suchen Sie jene Assistenten, die für einen Professor arbeiten, der jünger ist, als sie selbst. Professoren ( PersNr , Name , Rang , Raum , GebDatum ) Assistenten ( PersNr , Name , GebDatum , Boss ) Professoren ( PersNr , Name , Rang , Raum , GebDatum ) Assistenten ( PersNr , Name , GebDatum , Boss ) select a .* from Assistenten a where exists ( select p .* from Professoren p where a . Boss = p . PersNr and p . GebDatum > a . GebDatum ); select a .* from Assistenten a where exists ( select p .* from Professoren p where a . Boss = p . PersNr and p . GebDatum > a . GebDatum ); Korrelierte Unteranfrage (a.GebDatum und Assistenten a)! Sebastian Skritek Seite 61 Sebastian Skritek Seite 61 Relationale Abfragesprachen 3. Datenabfragesprache 3.7. Existentiell quantifizierte Anfragen Relationale Abfragesprachen Existentiell quantifizierte Anfragen 3. Datenabfragesprache 3.7. Existentiell quantifizierte Anfragen Existentiell quantifizierte Anfragen Beispiel Beispiel Suchen Sie jene Assistenten, die für einen Professor arbeiten, der jünger ist, als sie selbst. Suchen Sie jene Assistenten, die für einen Professor arbeiten, der jünger ist, als sie selbst. Professoren ( PersNr , Name , Rang , Raum , GebDatum ) Assistenten ( PersNr , Name , GebDatum , Boss ); Professoren ( PersNr , Name , Rang , Raum , GebDatum ) Assistenten ( PersNr , Name , GebDatum , Boss ); Eine nicht korrelierte Lösung mit Join ist: select a .* from Assistenten a , Professoren p where a . Boss = p . PersNr and p . GebDatum > a . GebDatum ; Sebastian Skritek Relationale Abfragesprachen Seite 62 3. Datenabfragesprache 3.8. Allquantifizierte Anfragen Sebastian Skritek Relationale Abfragesprachen Allquantifizierte Anfragen Seite 62 3. Datenabfragesprache 3.8. Allquantifizierte Anfragen Allquantifizierte Anfragen Beispiel Beispiel Welche Studenten haben alle 4 stündigen Lehrveranstaltungen gehört? Welche Studenten haben alle 4 stündigen Lehrveranstaltungen gehört? Studenten ( MatrNr , Name , Semester ) hören ( MatrNr , VorlNr ) Vorlesungen ( VorlNr , Titel , SWS , gelesenVon ) Studenten ( MatrNr , Name , Semester ) hören ( MatrNr , VorlNr ) Vorlesungen ( VorlNr , Titel , SWS , gelesenVon ) hören ÷ πVorlNr σSWS=4 (Vorlesungen) Sebastian Skritek Seite 63 Sebastian Skritek Seite 63 Relationale Abfragesprachen 3. Datenabfragesprache 3.8. Allquantifizierte Anfragen Relationale Abfragesprachen Allquantifizierte Anfragen 3. Datenabfragesprache 3.8. Allquantifizierte Anfragen Allquantifizierte Anfragen – Nicht direkt in SQL Beispiel Beispiel Welche Studenten haben alle 4 stündigen Lehrveranstaltungen gehört? Welche Studenten haben alle 4 stündigen Lehrveranstaltungen gehört? Studenten ( MatrNr , Name , Semester ) hören ( MatrNr , VorlNr ) Vorlesungen ( VorlNr , Titel , SWS , gelesenVon ) hören ÷ πVorlNr σSWS=4 (Vorlesungen) SQL stellt keinen Allquantor zur Verfügung. Realisierung durch SQL stellt keinen Allquantor zur Verfügung. Sebastian Skritek Relationale Abfragesprachen Seite 63 3. Datenabfragesprache 3.8. Allquantifizierte Anfragen Sebastian Skritek Relationale Abfragesprachen Allquantifizierte Anfragen – Nicht direkt in SQL Seite 64 3. Datenabfragesprache 3.8. Allquantifizierte Anfragen Allquantifizierte Anfragen – Nicht direkt in SQL Beispiel Beispiel Welche Studenten haben alle 4 stündigen Lehrveranstaltungen gehört? Welche Studenten haben alle 4 stündigen Lehrveranstaltungen gehört? SQL stellt keinen Allquantor zur Verfügung. Realisierung durch SQL stellt keinen Allquantor zur Verfügung. Realisierung durch 1 Logische Äquivalenz (mittels 2 × not exists) Sebastian Skritek Seite 64 1 Logische Äquivalenz (mittels 2 × not exists) 2 Teilmengen (mittels exists und except) Sebastian Skritek Seite 64 Relationale Abfragesprachen 3. Datenabfragesprache 3.8. Allquantifizierte Anfragen Relationale Abfragesprachen Allquantifizierte Anfragen – Nicht direkt in SQL 3. Datenabfragesprache 3.8. Allquantifizierte Anfragen Allquantifizierte Anfragen – Nicht direkt in SQL Beispiel Beispiel Welche Studenten haben alle 4 stündigen Lehrveranstaltungen gehört? Welche Studenten haben alle 4 stündigen Lehrveranstaltungen gehört? SQL stellt keinen Allquantor zur Verfügung. Realisierung durch SQL stellt keinen Allquantor zur Verfügung. Realisierung durch 1 Logische Äquivalenz (mittels 2 × not exists) 1 Logische Äquivalenz (mittels 2 × not exists) 2 Teilmengen (mittels exists und except) 2 Teilmengen (mittels exists und except) 3 Abzählen (mittels count) 3 Abzählen (mittels count) 4 Division (mittels except) Sebastian Skritek Relationale Abfragesprachen Seite 64 3. Datenabfragesprache 3.8. Allquantifizierte Anfragen Sebastian Skritek Relationale Abfragesprachen Allquantifizierte Anfragen – 1. “Logische Umformung” Seite 64 3. Datenabfragesprache 3.8. Allquantifizierte Anfragen Allquantifizierte Anfragen – 1. “Logische Umformung” Umformulierung in äqivalente Anfrage mit Negation und Existenzquantor (Prädikatenlogik) Umformulierung in äqivalente Anfrage mit Negation und Existenzquantor (Prädikatenlogik) ∀xF (x) ⇔ ¬∃x(¬F (x)) Sebastian Skritek Seite 65 Sebastian Skritek Seite 65 Relationale Abfragesprachen 3. Datenabfragesprache 3.8. Allquantifizierte Anfragen Relationale Abfragesprachen Allquantifizierte Anfragen – 1. “Logische Umformung” 3. Datenabfragesprache 3.8. Allquantifizierte Anfragen Allquantifizierte Anfragen – 1. “Logische Umformung” Umformulierung in äqivalente Anfrage mit Negation und Existenzquantor (Prädikatenlogik) Umformulierung in äqivalente Anfrage mit Negation und Existenzquantor (Prädikatenlogik) ∀xF (x) ⇔ ¬∃x(¬F (x)) ∀xF (x) ⇔ ¬∃x(¬F (x)) Beispiel Beispiel Welche Studenten haben alle 4 stündigen Lehrveranstaltungen gehört? Welche Studenten haben alle 4 stündigen Lehrveranstaltungen gehört? ⇔ Suchen Sie jene Studenten für die gilt: haben alle 4 stündigen Lehrveranstaltungen gehört Sebastian Skritek Relationale Abfragesprachen ⇔ Suchen Sie jene Studenten für die gilt: haben alle 4 stündigen Lehrveranstaltungen gehört ⇔ Suchen Sie jene Studenten für die nicht gilt: haben eine 4 stündige Lehrveranstaltung nicht gehört Seite 65 3. Datenabfragesprache 3.8. Allquantifizierte Anfragen Sebastian Skritek Relationale Abfragesprachen Allquantifizierte Anfragen – 1. “Logische Umformung” Seite 65 3. Datenabfragesprache 3.8. Allquantifizierte Anfragen Allquantifizierte Anfragen – 1. “Logische Umformung” SQL Umsetzung folgt nun direkt aus: Umformulierung in äqivalente Anfrage mit Negation und Existenzquantor (Prädikatenlogik) Suchen Sie jene Studenten für die nicht gilt: ∀xF (x) ⇔ ¬∃x(¬F (x)) Beispiel Welche Studenten haben alle 4 stündigen Lehrveranstaltungen gehört? ⇔ Suchen Sie jene Studenten für die gilt: haben alle 4 stündigen Lehrveranstaltungen gehört ⇔ Suchen Sie jene Studenten für die nicht gilt: haben eine 4 stündige Lehrveranstaltung nicht gehört ⇔ Suchen Sie jene Studenten für die nicht gilt: es gibt eine 4 stündige Lehrveranstaltung, die der Student nicht gehört hat. Sebastian Skritek Seite 65 Sebastian Skritek Seite 66 Relationale Abfragesprachen 3. Datenabfragesprache 3.8. Allquantifizierte Anfragen Relationale Abfragesprachen Allquantifizierte Anfragen – 1. “Logische Umformung” 3. Datenabfragesprache 3.8. Allquantifizierte Anfragen Allquantifizierte Anfragen – 1. “Logische Umformung” SQL Umsetzung folgt nun direkt aus: SQL Umsetzung folgt nun direkt aus: Suchen Sie jene Studenten für die nicht gilt: es gibt eine 4 stündige Lehrveranstaltung, für die nicht gilt: Suchen Sie jene Studenten für die nicht gilt: es gibt eine 4 stündige Lehrveranstaltung, für die nicht gilt: der Student hat diese Lehrveranstaltung gehört. Sebastian Skritek Relationale Abfragesprachen Seite 66 3. Datenabfragesprache 3.8. Allquantifizierte Anfragen Sebastian Skritek Relationale Abfragesprachen Allquantifizierte Anfragen – 1. “Logische Umformung” Seite 66 3. Datenabfragesprache 3.8. Allquantifizierte Anfragen Allquantifizierte Anfragen – 1. “Logische Umformung” SQL Umsetzung folgt nun direkt aus: SQL Umsetzung folgt nun direkt aus: Suchen Sie jene Studenten für die nicht gilt: es gibt eine 4 stündige Lehrveranstaltung, für die nicht gilt: der Student hat diese Lehrveranstaltung gehört. Suchen Sie jene Studenten für die nicht gilt: es gibt eine 4 stündige Lehrveranstaltung, für die nicht gilt: der Student hat diese Lehrveranstaltung gehört. Beispiel Beispiel select s.* from Studenten s where not exists Sebastian Skritek select s.* from Studenten s where not exists (select * from Vorlesungen v where v.SWS = 4 and not exists Seite 66 Sebastian Skritek Seite 66 Relationale Abfragesprachen 3. Datenabfragesprache 3.8. Allquantifizierte Anfragen Relationale Abfragesprachen Allquantifizierte Anfragen – 1. “Logische Umformung” 3. Datenabfragesprache 3.8. Allquantifizierte Anfragen Allquantifizierte Anfragen – 1. “Logische Umformung” SQL Umsetzung folgt nun direkt aus: SQL Umsetzung folgt nun direkt aus: Suchen Sie jene Studenten für die nicht gilt: es gibt eine 4 stündige Lehrveranstaltung, für die nicht gilt: der Student hat diese Lehrveranstaltung gehört. Suchen Sie jene Studenten für die nicht gilt: es gibt eine 4 stündige Lehrveranstaltung, für die nicht gilt: der Student hat diese Lehrveranstaltung gehört. Beispiel select s.* from Studenten s where not exists (select * from Vorlesungen v where v.SWS = 4 and not exists ( select * from hören h where h . VorlNr = v . VorlNr and s . MatrNr = h . MatrNr )); Sebastian Skritek Relationale Abfragesprachen Seite 66 3. Datenabfragesprache 3.8. Allquantifizierte Anfragen Sebastian Skritek Relationale Abfragesprachen Allquantifizierte Anfragen – 1. “Logische Umformung” Seite 67 3. Datenabfragesprache 3.8. Allquantifizierte Anfragen Allquantifizierte Anfragen – 1. “Logische Umformung” SQL Umsetzung folgt nun direkt aus: Suchen Sie jene Studenten für die nicht gilt: es gibt eine 4 stündige Lehrveranstaltung, für die nicht gilt: der Student hat diese Lehrveranstaltung gehört. Umformung im relationalen Tupelkalkül: Beispiel Beispiel select s.* from Studenten s where not exists (select * from Vorlesungen v where v.SWS = 4 and s.MatrNr not in ( select h . MatrNr from hören h where h . VorlNr = v . VorlNr )); Sebastian Skritek Seite 67 Studenten (MatrNr, Name , Sem ) hören (MatrNr, VorlNr) Vorlesungen (VorlNr, Titel , SWS , gelesenVon ) Sebastian Skritek Seite 68 Relationale Abfragesprachen 3. Datenabfragesprache 3.8. Allquantifizierte Anfragen Relationale Abfragesprachen Allquantifizierte Anfragen – 1. “Logische Umformung” 3. Datenabfragesprache 3.8. Allquantifizierte Anfragen Allquantifizierte Anfragen – 1. “Logische Umformung” Beispiel {s Umformung im relationalen Tupelkalkül: | s ∈ Studenten ∧ ∀v ∈ Vorlesungen(v .SWS = 4 → ∃h ∈ hören(h.VorlNr = v .VorlNr ∧ h.MatrNr = t.MatrNr ))} Beispiel Studenten (MatrNr, Name , Sem ) hören (MatrNr, VorlNr) Vorlesungen (VorlNr, Titel , SWS , gelesenVon ) {s | s ∈ Studenten ∧ ∀v ∈ Vorlesungen(v .SWS = 4 → ∃h ∈ hören(h.VorlNr = v .VorlNr ∧ h.MatrNr = s.MatrNr ))} Sebastian Skritek Relationale Abfragesprachen Seite 68 3. Datenabfragesprache 3.8. Allquantifizierte Anfragen {s 3.8. Allquantifizierte Anfragen Beispiel | s ∈ Studenten ∧ ∀v ∈ Vorlesungen(v .SWS = 4 → {s ∃h ∈ hören(h.VorlNr = v .VorlNr ∧ h.MatrNr = t.MatrNr ))} | s ∈ Studenten ∧ ∀v ∈ Vorlesungen(v .SWS = 4 → ∃h ∈ hören(h.VorlNr = v .VorlNr ∧ h.MatrNr = t.MatrNr ))} ⇔ | s ∈ Studenten ∧ ¬∃v ∈ Vorlesungen¬(v .SWS = 4 → {s ∃h ∈ hören(h.VorlNr = v .VorlNr ∧ h.MatrNr = s.MatrNr ))} | s ∈ Studenten ∧ ¬∃v ∈ Vorlesungen¬(v .SWS = 4 → ∃h ∈ hören(h.VorlNr = v .VorlNr ∧ h.MatrNr = s.MatrNr ))} ⇔ {s Sebastian Skritek 3. Datenabfragesprache Allquantifizierte Anfragen – 1. “Logische Umformung” Beispiel ⇔ Seite 69 Relationale Abfragesprachen Allquantifizierte Anfragen – 1. “Logische Umformung” {s Sebastian Skritek Seite 69 | s ∈ Studenten ∧ ¬∃v ∈ Vorlesungen¬(¬(v .SWS = 4) ∨ Sebastian Skritek (∃h ∈ hören(h.VorlNr = v .VorlNr ∧ h.MatrNr = s.MatrNr )))} Seite 69 Relationale Abfragesprachen 3. Datenabfragesprache 3.8. Allquantifizierte Anfragen Relationale Abfragesprachen Allquantifizierte Anfragen – 1. “Logische Umformung” Beispiel | s ∈ Studenten ∧ ∀v ∈ Vorlesungen(v .SWS = 4 → ∃h ∈ hören(h.VorlNr = v .VorlNr ∧ h.MatrNr = s.MatrNr ))} | s ∈ Studenten ∧ ¬∃v ∈ Vorlesungen¬(¬(v .SWS = 4) ∨ (∃h ∈ hören(h.VorlNr = v .VorlNr ∧ h.MatrNr = s.MatrNr )))} ⇔ {s | s ∈ Studenten ∧ ¬∃v ∈ Vorlesungen((v .SWS = 4) ∧ (¬∃h ∈ hören(v .VorlNr = h.VorlNr ∧ s.MatrNr = h.MatrNr )))} select s.* from Studenten s where not exists (select * from Vorlesungen v where v.SWS = 4 and not exists | s ∈ Studenten ∧ ¬∃v ∈ Vorlesungen¬(v .SWS = 4 → ⇔ {s {s ∃h ∈ hören(h.VorlNr = v .VorlNr ∧ h.MatrNr = t.MatrNr ))} ⇔ {s 3.8. Allquantifizierte Anfragen Allquantifizierte Anfragen – 1. “Logische Umformung” Beispiel {s 3. Datenabfragesprache | s ∈ Studenten ∧ ¬∃v ∈ Vorlesungen((v .SWS = 4) ∧ (¬∃h ∈ hören(h.VorlNr = v .VorlNr ∧ h.MatrNr = s.MatrNr )))} Sebastian Skritek Seite 69 Relationale Abfragesprachen 3. Datenabfragesprache 3.8. Allquantifizierte Anfragen Sebastian Skritek Relationale Abfragesprachen Allquantifizierte Anfragen – 1. “Logische Umformung” Seite 70 3. Datenabfragesprache 3.8. Allquantifizierte Anfragen Allquantifizierte Anfragen – 2. “Teilmengen” Beispiel {s Suchen Sie alle Studierenden M für die gilt: Menge aller 4 stündigen LVAs ⊆ Menge der von M gehörten LVAs | s ∈ Studenten ∧ ¬∃v ∈ Vorlesungen((v .SWS = 4) ∧ (¬∃h ∈ hören(v .VorlNr = h.VorlNr ∧ s.MatrNr = h.MatrNr )))} select s.* from Studenten s where not exists (select * from Vorlesungen v where v.SWS = 4 and not exists ( select * from hören h where h . VorlNr = v . VorlNr and s . MatrNr = h . MatrNr )); Sebastian Skritek Seite 70 Sebastian Skritek Seite 71 Relationale Abfragesprachen 3. Datenabfragesprache 3.8. Allquantifizierte Anfragen Relationale Abfragesprachen Allquantifizierte Anfragen – 2. “Teilmengen” 3. Datenabfragesprache 3.8. Allquantifizierte Anfragen Allquantifizierte Anfragen – 2. “Teilmengen” Suchen Sie alle Studierenden M für die gilt: Menge aller 4 stündigen LVAs ⊆ Menge der von M gehörten LVAs Suchen Sie alle Studierenden M für die gilt: Menge aller 4 stündigen LVAs ⊆ Menge der von M gehörten LVAs “⊆” kein Operator in SQL, aber “⊆” kein Operator in SQL, aber Menge aller 4 stündigen LVAs ⊆ Menge der von M gehörten LVAs ⇔ Menge aller 4 stündigen LVAs − Menge der von M gehörten LVAs = ∅ Sebastian Skritek Relationale Abfragesprachen Seite 71 3. Datenabfragesprache 3.8. Allquantifizierte Anfragen Relationale Abfragesprachen Allquantifizierte Anfragen – 2. “Teilmengen” Seite 71 3. Datenabfragesprache 3.8. Allquantifizierte Anfragen Allquantifizierte Anfragen – 2. “Teilmengen” Suchen Sie alle Studenten M für die nicht gilt: Es gibt eine LVA in der Differenz Menge aller 4 stündigen LVAs − Menge der von M gehörten LVAs Suchen Sie alle Studierenden M für die gilt: Menge aller 4 stündigen LVAs ⊆ Menge der von M gehörten LVAs Beispiel “⊆” kein Operator in SQL, aber select s.* from Studenten s where not exists ((select VorlNr from Vorlesungen v where v.SWS = 4) except (select VorlNr from hören h where h.MatrNr = s.MatrNr)) Menge aller 4 stündigen LVAs ⊆ Menge der von M gehörten LVAs ⇔ Menge aller 4 stündigen LVAs − Menge der von M gehörten LVAs = ∅ ∅ . . . es existiert keine Vorlesung in der Mengendifferenz Sebastian Skritek Sebastian Skritek Seite 71 Sebastian Skritek Seite 72 Relationale Abfragesprachen 3. Datenabfragesprache 3.8. Allquantifizierte Anfragen Relationale Abfragesprachen Allquantifizierte Anfragen – 3. “Abzählen” 3. Datenabfragesprache 3.8. Allquantifizierte Anfragen Allquantifizierte Anfragen – 3. “Abzählen” Allquantifizierung kann immer auch durch eine count-Aggregation ausgedrückt werden Allquantifizierung kann immer auch durch eine count-Aggregation ausgedrückt werden Beispiel Beispiel Welche Studenten haben alle 4 stündigen Lehrveranstaltungen gehört? Welche Studenten haben alle 4 stündigen Lehrveranstaltungen gehört? 1 Sebastian Skritek Relationale Abfragesprachen Seite 73 3. Datenabfragesprache 3.8. Allquantifizierte Anfragen Zähle zu jedem Studenten, wieviele 4 stündigen LVAs er besucht hat Sebastian Skritek Relationale Abfragesprachen Allquantifizierte Anfragen – 3. “Abzählen” Seite 73 3. Datenabfragesprache 3.8. Allquantifizierte Anfragen Allquantifizierte Anfragen – 3. “Abzählen” Allquantifizierung kann immer auch durch eine count-Aggregation ausgedrückt werden Allquantifizierung kann immer auch durch eine count-Aggregation ausgedrückt werden Beispiel Beispiel Welche Studenten haben alle 4 stündigen Lehrveranstaltungen gehört? Welche Studenten haben alle 4 stündigen Lehrveranstaltungen gehört? 1 Zähle zu jedem Studenten, wieviele 4 stündigen LVAs er besucht hat 1 Zähle zu jedem Studenten, wieviele 4 stündigen LVAs er besucht hat 2 zähle wieviele 4 stündige LVAs es gibt. 2 zähle wieviele 4 stündige LVAs es gibt. select s . MatrNr , s . Name from Studenten s , hören h , Vorlesungen v where s . MatrNr = h . Matrnr and h . VorlNr = v . VorlNr and v . SWS = 4 group by s . MatrNr , s . Name having count (*) = Sebastian Skritek Seite 73 Sebastian Skritek Seite 73 Relationale Abfragesprachen 3. Datenabfragesprache 3.8. Allquantifizierte Anfragen Relationale Abfragesprachen Allquantifizierte Anfragen – 3. “Abzählen” 3. Datenabfragesprache 3.8. Allquantifizierte Anfragen Allquantifizierte Anfragen – 4. Relationale Algebra? Allquantifizierung kann immer auch durch eine count-Aggregation ausgedrückt werden Beispiel Welche Studenten haben alle 4 stündigen Lehrveranstaltungen gehört? 1 Zähle zu jedem Studenten, wieviele 4 stündigen LVAs er besucht hat 2 zähle wieviele 4 stündige LVAs es gibt. select s . MatrNr , s . Name from Studenten s , hören h , Vorlesungen v where s . MatrNr = h . Matrnr and h . VorlNr = v . VorlNr and v . SWS = 4 group by s . MatrNr , s . Name having count (*) = (select count (*) from Vorlesungen where SWS = 4); Sebastian Skritek Seite 73 Relationale Abfragesprachen 3. Datenabfragesprache 3.8. Allquantifizierte Anfragen Sebastian Skritek Relationale Abfragesprachen Allquantifizierte Anfragen – 4. Relationale Algebra? Seite 74 3. Datenabfragesprache 3.8. Allquantifizierte Anfragen Allquantifizierte Anfragen – 4. Relationale Algebra? Beispiel Die Division kann durch die primitiven Operatoren ausgedrückt werden Welche Studierenden haben alle 4-stündigen Vorlesungen gehört? hören hören ÷ πVorlNr σSWS=4 (Vorlesungen) MatrNr VorlNr 26120 5001 27550 5001 πVorlNr σSWS=4 (Vorlesungen) 27550 4052 VorlNr 28106 5041 5001 28106 5001 28106 4052 28106 4630 29120 5001 29120 5041 29120 5049 Sebastian Skritek ÷ 5041 4052 R ÷S = MatrNr 28106 4630 Seite 74 Sebastian Skritek Seite 75 Relationale Abfragesprachen 3. Datenabfragesprache 3.8. Allquantifizierte Anfragen Relationale Abfragesprachen Allquantifizierte Anfragen – 4. Relationale Algebra? Die Division kann durch die primitiven Operatoren ausgedrückt werden Bilde alle Paare von Studenten und 4 stündigen LVAs Sebastian Skritek Relationale Abfragesprachen Seite 75 3. Datenabfragesprache 3.8. Allquantifizierte Anfragen Allquantifizierte Anfragen – 4. Relationale Algebra? Die Division kann durch die primitiven Operatoren ausgedrückt werden 1 3. Datenabfragesprache 3.8. Allquantifizierte Anfragen 1 Bilde alle Paare von Studenten und 4 stündigen LVAs 2 Entferne davon alle Paare (Student, LVA) an LVAs die ein Student besucht hat (d.h. der Inhalt von hören) Sebastian Skritek Relationale Abfragesprachen Allquantifizierte Anfragen – 4. Relationale Algebra? Seite 75 3. Datenabfragesprache 3.8. Allquantifizierte Anfragen Allquantifizierte Anfragen – 4. Relationale Algebra? Die Division kann durch die primitiven Operatoren ausgedrückt werden Die Division kann durch die primitiven Operatoren ausgedrückt werden 1 Bilde alle Paare von Studenten und 4 stündigen LVAs 1 Bilde alle Paare von Studenten und 4 stündigen LVAs 2 Entferne davon alle Paare (Student, LVA) an LVAs die ein Student besucht hat (d.h. der Inhalt von hören) 2 Entferne davon alle Paare (Student, LVA) an LVAs die ein Student besucht hat (d.h. der Inhalt von hören) 3 Aus den übrig gebliebenen Paaren, sammle die Studenten 3 Aus den übrig gebliebenen Paaren, sammle die Studenten 4 Ziehe diese Studenten von der Menge aller Studenten ab Sebastian Skritek Seite 75 Sebastian Skritek Seite 75 Relationale Abfragesprachen 3. Datenabfragesprache 3.8. Allquantifizierte Anfragen Relationale Abfragesprachen Allquantifizierte Anfragen – 4. Relationale Algebra? 3.8. Allquantifizierte Anfragen Allquantifizierte Anfragen – 4. Relationale Algebra? Die Division kann durch die primitiven Operatoren ausgedrückt werden 1 3. Datenabfragesprache Die Division kann durch die primitiven Operatoren ausgedrückt werden Bilde alle Paare von Studenten und 4 stündigen LVAs Inhalt der DB wenn alle Studenten alle 4 stündigen LVAs absolviert hätten → suche Abweichungen 1 Bilde alle Paare von Studenten und 4 stündigen LVAs Inhalt der DB wenn alle Studenten alle 4 stündigen LVAs absolviert hätten → suche Abweichungen 2 Entferne davon alle Paare (Student, LVA) an LVAs die ein Student besucht hat (d.h. der Inhalt von hören) 2 Entferne davon alle Paare (Student, LVA) an LVAs die ein Student besucht hat (d.h. der Inhalt von hören) Diese Paare aus Studenten und 4 stündigen LVAs “fehlen” in der DB 3 Aus den übrig gebliebenen Paaren, sammle die Studenten 3 Aus den übrig gebliebenen Paaren, sammle die Studenten 4 Ziehe diese Studenten von der Menge aller Studenten ab 4 Ziehe diese Studenten von der Menge aller Studenten ab Sebastian Skritek Relationale Abfragesprachen Seite 75 3. Datenabfragesprache 3.8. Allquantifizierte Anfragen Relationale Abfragesprachen Allquantifizierte Anfragen – 4. Relationale Algebra? Seite 75 3. Datenabfragesprache 3.8. Allquantifizierte Anfragen Allquantifizierte Anfragen – 4. Relationale Algebra? Die Division kann durch die primitiven Operatoren ausgedrückt werden 1 Sebastian Skritek Die Division kann durch die primitiven Operatoren ausgedrückt werden Bilde alle Paare von Studenten und 4 stündigen LVAs Inhalt der DB wenn alle Studenten alle 4 stündigen LVAs absolviert hätten → suche Abweichungen 1 Bilde alle Paare von Studenten und 4 stündigen LVAs Inhalt der DB wenn alle Studenten alle 4 stündigen LVAs absolviert hätten → suche Abweichungen 2 Entferne davon alle Paare (Student, LVA) an LVAs die ein Student besucht hat (d.h. der Inhalt von hören) Diese Paare aus Studenten und 4 stündigen LVAs “fehlen” in der DB 2 Entferne davon alle Paare (Student, LVA) an LVAs die ein Student besucht hat (d.h. der Inhalt von hören) Diese Paare aus Studenten und 4 stündigen LVAs “fehlen” in der DB 3 Aus den übrig gebliebenen Paaren, sammle die Studenten Studenten die mindestens eine 4 stündige LVA nicht besucht haben 3 Aus den übrig gebliebenen Paaren, sammle die Studenten Studenten die mindestens eine 4 stündige LVA nicht besucht haben 4 Ziehe diese Studenten von der Menge aller Studenten ab 4 Ziehe diese Studenten von der Menge aller Studenten ab Studenten die alle 4 stündigen LVAs besucht haben Sebastian Skritek Seite 75 Sebastian Skritek Seite 75 Relationale Abfragesprachen 3. Datenabfragesprache 3.8. Allquantifizierte Anfragen Relationale Abfragesprachen Allquantifizierte Anfragen – 4. Relationale Algebra? Bilde alle Paare von Studenten und 4 stündigen LVAs Inhalt der DB wenn alle Studenten alle 4 stündigen LVAs absolviert hätten → suche Abweichungen 2 Entferne davon alle Paare (Student, LVA) an LVAs die ein Student besucht hat (d.h. der Inhalt von hören) Diese Paare aus Studenten und 4 stündigen LVAs “fehlen” in der DB 3 Aus den übrig gebliebenen Paaren, sammle die Studenten Studenten die mindestens eine 4 stündige LVA nicht besucht haben 4 Ziehe diese Studenten von der Menge aller Studenten ab Studenten die alle 4 stündigen LVAs besucht haben 1 Bilde alle Paare von Studenten und 4 stündigen LVAs 2 Entferne davon alle Paare (Student, LVA) an LVAs die ein Student besucht hat (d.h. der Inhalt von hören) 3 Aus den übrig gebliebenen Paaren, sammle die Studenten 4 Ziehe diese Studenten von der Menge aller Studenten ab Beispiel R ÷ S = πR−S (R) − πR−S ((πR−S (R) × S) − R) Sebastian Skritek Relationale Abfragesprachen ; Seite 75 3. Datenabfragesprache 3.8. Allquantifizierte Anfragen Allquantifizierte Anfragen – 4. Relationale Algebra? Die Division kann durch die primitiven Operatoren ausgedrückt werden 1 3. Datenabfragesprache 3.8. Allquantifizierte Anfragen Sebastian Skritek Relationale Abfragesprachen Allquantifizierte Anfragen – 4. Relationale Algebra? Seite 76 3. Datenabfragesprache 3.8. Allquantifizierte Anfragen Allquantifizierte Anfragen – 4. Relationale Algebra? 1 Bilde alle Paare von Studenten und 4 stündigen LVAs 1 Bilde alle Paare von Studenten und 4 stündigen LVAs 2 Entferne davon alle Paare (Student, LVA) an LVAs die ein Student besucht hat (d.h. der Inhalt von hören) 2 Entferne davon alle Paare (Student, LVA) an LVAs die ein Student besucht hat (d.h. der Inhalt von hören) 3 Aus den übrig gebliebenen Paaren, sammle die Studenten 3 Aus den übrig gebliebenen Paaren, sammle die Studenten 4 Ziehe diese Studenten von der Menge aller Studenten ab 4 Ziehe diese Studenten von der Menge aller Studenten ab Beispiel Beispiel (select s.MatrNr, v.VorlNr from Studenten s, Vorlesungen v where v.SWS = 4) (select s.MatrNr, v.VorlNr from Studenten s, Vorlesungen v where v.SWS = 4) except (select * from hören) ; ; Sebastian Skritek Seite 76 Sebastian Skritek Seite 76 Relationale Abfragesprachen 3. Datenabfragesprache 3.8. Allquantifizierte Anfragen Relationale Abfragesprachen Allquantifizierte Anfragen – 4. Relationale Algebra? 3. Datenabfragesprache 3.8. Allquantifizierte Anfragen Allquantifizierte Anfragen – 4. Relationale Algebra? 1 Bilde alle Paare von Studenten und 4 stündigen LVAs 1 Bilde alle Paare von Studenten und 4 stündigen LVAs 2 Entferne davon alle Paare (Student, LVA) an LVAs die ein Student besucht hat (d.h. der Inhalt von hören) 2 Entferne davon alle Paare (Student, LVA) an LVAs die ein Student besucht hat (d.h. der Inhalt von hören) 3 Aus den übrig gebliebenen Paaren, sammle die Studenten 3 Aus den übrig gebliebenen Paaren, sammle die Studenten 4 Ziehe diese Studenten von der Menge aller Studenten ab 4 Ziehe diese Studenten von der Menge aller Studenten ab Beispiel Beispiel (select sja.MatrNr from Studenten sja) except (select snein.MatrNr from ((select s.MatrNr, v.VorlNr from Studenten s, Vorlesungen v where v.SWS = 4) except (select * from hören)) snein); (select snein.MatrNr from ((select s.MatrNr, v.VorlNr from Studenten s, Vorlesungen v where v.SWS = 4) except (select * from hören)) snein); Sebastian Skritek Relationale Abfragesprachen Seite 76 3. Datenabfragesprache 3.9. Nullwerte Sebastian Skritek Relationale Abfragesprachen Nullwerte Seite 76 3. Datenabfragesprache 3.9. Nullwerte Nullwerte Beispiel Studenten MatrNr Name Semester 24002 Xenokrates 18 25403 Jonas 12 26120 Fichte 10 26830 Aristoxenos 8 27550 Schopenhauer 6 28106 Carnap 3 Finde die Anzahl der Studenten. Sebastian Skritek Seite 77 Sebastian Skritek Seite 77 Relationale Abfragesprachen 3. Datenabfragesprache 3.9. Nullwerte Relationale Abfragesprachen 3. Datenabfragesprache Nullwerte Nullwerte Beispiel Beispiel Finde die Anzahl der Studenten: Finde die Anzahl der Studenten: 3.9. Nullwerte select count (*) from Studenten ; Sebastian Skritek Relationale Abfragesprachen Seite 78 3. Datenabfragesprache 3.9. Nullwerte Sebastian Skritek Relationale Abfragesprachen Seite 78 3. Datenabfragesprache 3.9. Nullwerte Nullwerte Nullwerte Beispiel Beispiel Finde die Anzahl der Studenten: Finde die Anzahl der Studenten: select count (*) from Studenten ; select count (*) from Studenten ; select count ( MatrNr ) from Studenten ; select count ( MatrNr ) from Studenten ; select count ( Semester ) from Studenten ; Sebastian Skritek Seite 78 Sebastian Skritek Seite 78 Relationale Abfragesprachen 3. Datenabfragesprache 3.9. Nullwerte Relationale Abfragesprachen 3. Datenabfragesprache 3.9. Nullwerte Nullwerte Nullwerte Beispiel Beispiel Finde die Anzahl der Studenten: Finde die Anzahl der Studenten: select count (*) from Studenten ; select count (*) from Studenten ; (6) select count ( MatrNr ) from Studenten ; select count ( MatrNr ) from Studenten ; (6) select count ( Semester ) from Studenten ; select count ( Semester ) from Studenten ; (6) select count (*) from Studenten where Semester < 13 or Semester >= 13; select count (*) from Studenten where Semester < 13 or Semester >= 13; (6) Sebastian Skritek Relationale Abfragesprachen Seite 78 3. Datenabfragesprache 3.9. Nullwerte Sebastian Skritek Relationale Abfragesprachen Nullwerte Seite 78 3. Datenabfragesprache 3.9. Nullwerte Nullwerte Nullwerte entstehen Nullwerte entstehen wenn kein Wert in der Datenbank vorhanden ist, wenn kein Wert in der Datenbank vorhanden ist, im Zuge der Anfrageauswertung (Bsp. äußere Joins) im Zuge der Anfrageauswertung (Bsp. äußere Joins) Beispiel Studenten MatrNr Name Semester 24002 Xenokrates 25403 Jonas 12 26120 Fichte NULL 26830 Aristoxenos 8 27550 Schopenhauer 6 28106 Carnap 3 18 Finde die Anzahl der Studenten. Sebastian Skritek Seite 79 Sebastian Skritek Seite 79 Relationale Abfragesprachen 3. Datenabfragesprache 3.9. Nullwerte Relationale Abfragesprachen 3. Datenabfragesprache 3.9. Nullwerte Nullwerte Nullwerte Beispiel Beispiel Finde die Anzahl der Studenten: Finde die Anzahl der Studenten: select count (*) from Studenten ; select count (*) from Studenten ; select count ( MatrNr ) from Studenten ; select count ( MatrNr ) from Studenten ; select count ( Semester ) from Studenten ; select count ( Semester ) from Studenten ; select count (*) from Studenten where Semester < 13 or Semester >= 13; select count (*) from Studenten where Semester < 13 or Semester >= 13; Sebastian Skritek Relationale Abfragesprachen Seite 80 3. Datenabfragesprache 3.9. Nullwerte (6) Sebastian Skritek Relationale Abfragesprachen Seite 80 3. Datenabfragesprache Nullwerte Nullwerte Beispiel Beispiel Finde die Anzahl der Studenten: Finde die Anzahl der Studenten: 3.9. Nullwerte select count (*) from Studenten ; (6) select count (*) from Studenten ; (6) select count ( MatrNr ) from Studenten ; (6) select count ( MatrNr ) from Studenten ; (6) select count ( Semester ) from Studenten ; select count ( Semester ) from Studenten ; (5) select count (*) from Studenten where Semester < 13 or Semester >= 13; select count (*) from Studenten where Semester < 13 or Semester >= 13; Sebastian Skritek Seite 80 Sebastian Skritek Seite 80 Relationale Abfragesprachen 3. Datenabfragesprache 3.9. Nullwerte Relationale Abfragesprachen Nullwerte 3.9. Nullwerte Einschub: count revisited Verhalten von count(): Beispiel Finde die Anzahl der Studenten: select count (*) from Studenten ; (6) select count ( MatrNr ) from Studenten ; (6) select count ( Semester ) from Studenten ; (5) select count (*) from Studenten where Semester < 13 or Semester >= 13; (5) Sebastian Skritek Relationale Abfragesprachen 3. Datenabfragesprache count(*): Zählt alle Tupel (inkl. Duplikate) Seite 80 3. Datenabfragesprache 3.9. Nullwerte Sebastian Skritek Relationale Abfragesprachen Einschub: count revisited Seite 81 3. Datenabfragesprache 3.9. Nullwerte Einschub: count revisited Verhalten von count(): Verhalten von count(): count(*): Zählt alle Tupel (inkl. Duplikate) count(*): Zählt alle Tupel (inkl. Duplikate) count(attribute): Zählt die Anzahl der von NULL verschiedenen Werte in der angegebenen Spalte (inkl. Duplikate) count(attribute): Zählt die Anzahl der von NULL verschiedenen Werte in der angegebenen Spalte (inkl. Duplikate) count(distinct attribute): Zählt die Anzahl der verschiedenen von NULL verschiedenen Werte in der angegebenen Spalte (d.h: ohne Duplikate) Sebastian Skritek Seite 81 Sebastian Skritek Seite 81 Relationale Abfragesprachen 3. Datenabfragesprache 3.9. Nullwerte Relationale Abfragesprachen Nullwerte 3. Datenabfragesprache 3.9. Nullwerte Nullwerte: Behandlung in Ausdrücken Arithmetische Ausdrücke: Nullwerten werden propagiert: ist ein Operand null so ist das Ergebnis null. Beispiel Beispiel Gibt es Tupel, bei denen der Wert für Semester unbekannt ist, so gilt: null + 1 = null; null * 0 = null; . . . select count (*) from Student where Semester < 13 or Semester >= 13; 6= select count (*) from Studenten ; Sebastian Skritek Relationale Abfragesprachen Seite 82 3. Datenabfragesprache 3.9. Nullwerte Sebastian Skritek Relationale Abfragesprachen Nullwerte: Behandlung in Ausdrücken Seite 83 3. Datenabfragesprache 3.9. Nullwerte Nullwerte – Auswertung logischer Ausdrücke Logische Ausdrücke: werden nach den folgenden Tabellen berechnet: Arithmetische Ausdrücke: Nullwerten werden propagiert: ist ein Operand null so ist das Ergebnis null. not Beispiel null + 1 = null; null * 0 = null; . . . true false unknown unknown false true Vergleichsoperatoren: SQL hat dreiwertige Logik: true, false, unknown. Das Resultat ist unknown, wenn mindestens eines der Argumente null ist. Beispiel (Semester > 13) liefert unknown, wenn das Semester unbekannt ist, d.h. den Wert null annimmt. Achtung! z.B. auch (Semester = null) Sebastian Skritek Seite 83 Sebastian Skritek Seite 84 Relationale Abfragesprachen 3. Datenabfragesprache 3.9. Nullwerte Relationale Abfragesprachen Nullwerte – Auswertung logischer Ausdrücke 3. Datenabfragesprache Nullwerte – Auswertung logischer Ausdrücke Logische Ausdrücke: werden nach den folgenden Tabellen berechnet: Logische Ausdrücke: werden nach den folgenden Tabellen berechnet: not not true false true false unknown unknown unknown unknown false true false true and true unknown false and true unknown false true true unknown false true true unknown false unknown unknown unknown false unknown unknown unknown false false false false false false false false false Sebastian Skritek Relationale Abfragesprachen 3.9. Nullwerte Seite 84 3. Datenabfragesprache 3.9. Nullwerte true unknown false true true true true unknown true unknown unknown false true unknown false Sebastian Skritek Relationale Abfragesprachen Nullwerte – Auswertung or Seite 84 3. Datenabfragesprache 3.9. Nullwerte Nullwerte – Auswertung where-Bedingung: es werden nur Tupel eitergereicht, für die die Bedingung zu true auswertet. Tupel, für die die Bedingung zu unknown auswertet, werden nicht ins Ergebnis aufgenommen. where-Bedingung: es werden nur Tupel eitergereicht, für die die Bedingung zu true auswertet. Tupel, für die die Bedingung zu unknown auswertet, werden nicht ins Ergebnis aufgenommen. Gruppierung: wird null als ein eigenständiger Wert aufgefasst und in eine eigene Gruppe eingeordnet. Sebastian Skritek Seite 85 Sebastian Skritek Seite 85 Relationale Abfragesprachen 3. Datenabfragesprache 3.9. Nullwerte Relationale Abfragesprachen Nullwerte – Auswertung between like Gruppierung: wird null als ein eigenständiger Wert aufgefasst und in eine eigene Gruppe eingeordnet. case Joins Nullwerte werden abgefragt mittels: is null bzw. is not null. • • • • Beispiel select * from Student where Semester is null ; Sebastian Skritek Seite 85 3. Datenabfragesprache 3.10. Spezielle Sprachkonstrukte Spezielle Sprachkonstrukte where-Bedingung: es werden nur Tupel eitergereicht, für die die Bedingung zu true auswertet. Tupel, für die die Bedingung zu unknown auswertet, werden nicht ins Ergebnis aufgenommen. Relationale Abfragesprachen 3. Datenabfragesprache 3.10. Spezielle Sprachkonstrukte Sebastian Skritek Relationale Abfragesprachen between cross join natural join join left, right, full outer join Seite 86 3. Datenabfragesprache 3.10. Spezielle Sprachkonstrukte like Vergleich von Zeichenketten: Platzhalter ’%’ und ’ ’ %: beliebig viele (auch gar kein) Zeichen : genau ein Zeichen Beispiele Suchen Sie jene Studenten, die zwischen dem ersten und dem vierten Semester inskribiert sind: select * from Studenten where Semester > = 1 and Semester < = 4; select * from Studenten where Semester between 1 and 4; select * from Studenten where Semester in (1 ,2 ,3 ,4); Sebastian Skritek Seite 87 Sebastian Skritek Seite 88 Relationale Abfragesprachen 3. Datenabfragesprache 3.10. Spezielle Sprachkonstrukte Relationale Abfragesprachen like 3. Datenabfragesprache 3.10. Spezielle Sprachkonstrukte like Vergleich von Zeichenketten: Platzhalter ’%’ und ’ ’ Vergleich von Zeichenketten: Platzhalter ’%’ und ’ ’ %: beliebig viele (auch gar kein) Zeichen : genau ein Zeichen %: beliebig viele (auch gar kein) Zeichen : genau ein Zeichen Beispiele Beispiele Suchen Sie die Matrikelnummer von Theophrastos, wobei Sie nicht wissen, ob er sich mit ’h’ schreibt: Suchen Sie die Matrikelnummer von Theophrastos, wobei Sie nicht wissen, ob er sich mit ’h’ schreibt: select * from Studenten where Name like ’T % eophrastos ’; select * from Studenten where Name like ’T % eophrastos ’; Suchen Sie die Matrikelnummern jener Studenten, die mindestens eine LVA über Ethik gehört haben: select distinct MatrNr from Vorlesungen v , hören h where h . VorlNr = v . VorlNr and v . Titel like ’% thik % ’; Sebastian Skritek Relationale Abfragesprachen Seite 88 3. Datenabfragesprache 3.10. Spezielle Sprachkonstrukte Sebastian Skritek Relationale Abfragesprachen case Seite 88 3. Datenabfragesprache 3.10. Spezielle Sprachkonstrukte case Beispiel Beispiel Wandeln Sie die Prüfungsnoten in Werte der Studienabteilung um: Wandeln Sie die Prüfungsnoten in Werte der Studienabteilung um: select MatrNr , ( case when when when when else from prüfen ; select MatrNr , ( case when when when when else from prüfen ; Note Note Note Note ’ N5 ’ < 1.5 < 2.5 < 3.5 < 4.0 end ) then then then then ’ S1 ’ ’ U2 ’ ’ B3 ’ ’ G4 ’ Note Note Note Note ’ N5 ’ < 1.5 < 2.5 < 3.5 < 4.0 end ) then then then then ’ S1 ’ ’ U2 ’ ’ B3 ’ ’ G4 ’ Die erste qualifizierende when-Klausel wird ausgeführt Sebastian Skritek Seite 89 Sebastian Skritek Seite 89 Relationale Abfragesprachen 3. Datenabfragesprache 3.10. Spezielle Sprachkonstrukte Relationale Abfragesprachen Joins 3. Datenabfragesprache 3.10. Spezielle Sprachkonstrukte Joins SQL unterstützt folgende Join-Schlüsselworte: cross join Kreuzprodukt natural join natürlicher Join [inner] join Theta-Join (oder inner join) (left|right|full) outer join äußerer Join SQL unterstützt folgende Join-Schlüsselworte: cross join Kreuzprodukt natural join natürlicher Join [inner] join Theta-Join (oder inner join) (left|right|full) outer join äußerer Join cross join: R1 × R2 select * from Professoren , Vorlesungen ; select * from Professoren cross join Vorlesungen ; Sebastian Skritek Relationale Abfragesprachen Seite 90 3. Datenabfragesprache 3.10. Spezielle Sprachkonstrukte Sebastian Skritek Relationale Abfragesprachen natural join: Seite 90 3. Datenabfragesprache 3.10. Spezielle Sprachkonstrukte natural join: R1 R2 R1 Die Werte jener Spalten, deren Attributnamen dieselben sind, werden gleichgesetzt. R2 Die Werte jener Spalten, deren Attributnamen dieselben sind, werden gleichgesetzt. Beispiel Geben Sie Name und Matrikelnummer der Studierenden und den Titel der von ihnen gehörten Vorlesungen aus. Studenten (MatrNr, Name , Sem ) hören (MatrNr, VorlNr) Vorlesungen (VorlNr, Titel , SWS , gelesenVon ) Sebastian Skritek Seite 91 Sebastian Skritek Seite 91 Relationale Abfragesprachen 3. Datenabfragesprache 3.10. Spezielle Sprachkonstrukte Relationale Abfragesprachen natural join: 3. Datenabfragesprache 3.10. Spezielle Sprachkonstrukte natural join: Beispiel Beispiel Geben Sie Name und Matrikelnummer der Studierenden und den Titel der von ihnen gehörten Vorlesungen aus. Geben Sie Name und Matrikelnummer der Studierenden und den Titel der von ihnen gehörten Vorlesungen aus. Studenten (MatrNr, Name , Sem ) hören (MatrNr, VorlNr) Vorlesungen (VorlNr, Titel , SWS , gelesenVon ) Studenten (MatrNr, Name , Sem ) hören (MatrNr, VorlNr) Vorlesungen (VorlNr, Titel , SWS , gelesenVon ) select Studenten . MatrNr , Name , Titel from Studenten , hören , Vorlesungen where Studenten . MatrNr = hören . MatrNr and hören . VorlNr = Vorlesungen . VorlNr ; Sebastian Skritek Relationale Abfragesprachen Seite 92 3. Datenabfragesprache 3.10. Spezielle Sprachkonstrukte Sebastian Skritek Relationale Abfragesprachen natural join: Seite 92 3. Datenabfragesprache 3.10. Spezielle Sprachkonstrukte [inner] join: R1 Beispiel θ R2 Geben Sie Name und Matrikelnummer der Studierenden und den Titel der von ihnen gehörten Vorlesungen aus. Studenten (MatrNr, Name , Sem ) hören (MatrNr, VorlNr) Vorlesungen (VorlNr, Titel , SWS , gelesenVon ) select Studenten . MatrNr , Name , Titel from Studenten , hören , Vorlesungen where Studenten . MatrNr = hören . MatrNr and hören . VorlNr = Vorlesungen . VorlNr ; select MatrNr , Name , Titel from Studenten natural join hören natural join Vorlesungen ; Sebastian Skritek Seite 92 Sebastian Skritek Seite 93 Relationale Abfragesprachen 3. Datenabfragesprache 3.10. Spezielle Sprachkonstrukte Relationale Abfragesprachen [inner] join: 3. Datenabfragesprache 3.10. Spezielle Sprachkonstrukte [inner] join: R1 θ R2 R1 θ R2 Beispiel Beispiel Welche Professoren lesen die LVA Mäeutik? Welche Professoren lesen die LVA Mäeutik? Professoren (PersNr, Name , Rang , Raum ) Vorlesungen ( VorlNr , Titel , SWS , gelesenVon) Professoren (PersNr, Name , Rang , Raum ) Vorlesungen ( VorlNr , Titel , SWS , gelesenVon) select Name , Titel from Professoren , Vorlesungen where PersNr = gelesenVon and Titel = ’ Mäeutik ’; select Name , Titel from Professoren , Vorlesungen where PersNr = gelesenVon and Titel = ’ Mäeutik ’; select Name , Titel from Professoren join Vorlesungen on PersNr = gelesenVon where Titel = ’ Mäeutik ’; Sebastian Skritek Relationale Abfragesprachen Seite 93 3. Datenabfragesprache 3.10. Spezielle Sprachkonstrukte Sebastian Skritek Relationale Abfragesprachen (left|right|full) outer join: Seite 93 3. Datenabfragesprache 3.10. Spezielle Sprachkonstrukte (left|right|full) outer join: R1 (| |)R2 R1 (| |)R2 Beispiel Geben Sie eine Liste aller Studierenden aus und ihre Noten zu den abgeprüften Vorlesungen. Sebastian Skritek Seite 94 Sebastian Skritek Seite 94 Relationale Abfragesprachen 3. Datenabfragesprache 3.10. Spezielle Sprachkonstrukte Relationale Abfragesprachen (left|right|full) outer join: 3. Datenabfragesprache 3.10. Spezielle Sprachkonstrukte (left|right|full) outer join: R1 (| |)R2 R1 (| |)R2 Beispiel Beispiel Geben Sie eine Liste aller Studierenden aus und ihre Noten zu den abgeprüften Vorlesungen. Geben Sie eine Liste aller Studierenden aus und ihre Noten zu den abgeprüften Vorlesungen. select s . MatrNr , s . Name , p . VorlNr , p . Note from Studenten s left outer join prüfen p on s . MatrNr = p . MatrNr ; select s . MatrNr , s . Name , p . VorlNr , p . Note from Studenten s left outer join prüfen p on s . MatrNr = p . MatrNr ; select s . MatrNr , s . Name , p . VorlNr , p . Note from prüfen p right outer join Studenten s on s . MatrNr = p . MatrNr ; Sebastian Skritek Relationale Abfragesprachen Seite 94 3. Datenabfragesprache 3.10. Spezielle Sprachkonstrukte Sebastian Skritek Relationale Abfragesprachen Seite 94 3. Datenabfragesprache Studenten pr üfen VorlNr Studenten pr üfen MatrNr Name MatrNr Name 24002 Xenokrates 25403 Jonas 24002 Xenokrates 25403 26120 Fichte Jonas 26120 Fichte 26830 Aristoxenos 27550 Schopenhauer 4630 2 26830 Aristoxenos 27550 28106 Carnap 5001 1 28106 29120 29555 Theophrastos 29120 Theophrastos Feuerbach 29555 Feuerbach 5041 3.10. Spezielle Sprachkonstrukte Note 2 VorlNr Note 5041 2 Schopenhauer 4630 2 Carnap 5001 1 Ergebnis ohne Verwendung des outer Joins: Studenten Sebastian Skritek Seite 95 Sebastian Skritek pr üfen MatrNr Name VorlNr Note 25403 Jonas 5041 2 27550 Schopenhauer 4630 2 28106 Carnap 5001 1 Seite 95 Relationale Abfragesprachen 3. Datenabfragesprache 3.10. Spezielle Sprachkonstrukte Relationale Abfragesprachen 3. Datenabfragesprache 3.10. Spezielle Sprachkonstrukte coalesce() coalesce() Beispiel Beispiel Geben Sie eine Liste aller Studierenden aus und ihre Noten zu den abgeprüften Vorlesungen. Für Studierende die keine Vorlesung besucht haben sollen VorlNr und Note den Wert 0 annehmen. Geben Sie eine Liste aller Studierenden aus und ihre Noten zu den abgeprüften Vorlesungen. Für Studierende die keine Vorlesung besucht haben sollen VorlNr und Note den Wert 0 annehmen. select s . MatrNr , s . Name , coalesce ( p . VorlNr ,0) , coalesce ( p . Note ,0) from Studenten s left outer join prüfen p on s . MatrNr = p . MatrNr ; Achtung: Typen müssen kompatibel sein Sebastian Skritek Relationale Abfragesprachen Seite 96 3. Datenabfragesprache 3.10. Spezielle Sprachkonstrukte Sebastian Skritek Relationale Abfragesprachen Seite 96 3. Datenabfragesprache 3.10. Spezielle Sprachkonstrukte concat() concat() Beispiel Beispiel Studenten ( MatrNr , Vorname , Nachname , Semester ); Studenten ( MatrNr , Vorname , Nachname , Semester ); Geben Sie den Namen aller Studierenden aus Sebastian Skritek Seite 97 Sebastian Skritek Seite 97 Relationale Abfragesprachen 3. Datenabfragesprache 3.10. Spezielle Sprachkonstrukte Relationale Abfragesprachen 3. Datenabfragesprache 3.10. Spezielle Sprachkonstrukte concat() concat() Beispiel Beispiel Studenten ( MatrNr , Vorname , Nachname , Semester ); Studenten ( MatrNr , Vorname , Nachname , Semester ); Geben Sie den Namen aller Studierenden aus Geben Sie den Namen aller Studierenden aus select Vorname || Nachname from Studenten ; select Vorname || Nachname from Studenten ; oder oder select concat ( Vorname , Nachname ) from Studenten ; (oft auch “+” anstatt “||”) Sebastian Skritek Seite 97 Relationale Abfragesprachen 3. Datenabfragesprache 3.11. Sichten (Views) Relationale Abfragesprachen Sichten (Views) Seite 97 3. Datenabfragesprache 3.11. Sichten (Views) Sichten (Views) . . . sind gespeicherte Anfragen, die als virtuelle Tabelle zur Verfügung stehen. . . . waren ursprünglich nur für den Lesezugriff gedacht, sind aber unter bestimmten Einschränkungen auch update-fähig. . . . werden bei jedem Zugriff dynamisch neu erstellt. . . . sind nicht Teil des physischen Schemas Sebastian Skritek Sebastian Skritek . . . sind gespeicherte Anfragen, die als virtuelle Tabelle zur Verfügung stehen. . . . waren ursprünglich nur für den Lesezugriff gedacht, sind aber unter bestimmten Einschränkungen auch update-fähig. . . . werden bei jedem Zugriff dynamisch neu erstellt. . . . sind nicht Teil des physischen Schemas Verwendung: Konzept zur Anpassung an verschiedene Benutzer Vereinfachung von Anfragen Realisierung der Generalisierung Seite 98 Sebastian Skritek Seite 98 Relationale Abfragesprachen 3. Datenabfragesprache 3.11. Sichten (Views) Relationale Abfragesprachen Sichten (Views) 3.11. Sichten (Views) Anpassung an unterschiedliche Benutzergruppen . . . sind gespeicherte Anfragen, die als virtuelle Tabelle zur Verfügung stehen. . . . waren ursprünglich nur für den Lesezugriff gedacht, sind aber unter bestimmten Einschränkungen auch update-fähig. . . . werden bei jedem Zugriff dynamisch neu erstellt. . . . sind nicht Teil des physischen Schemas Verwendung: Konzept zur Anpassung an verschiedene Benutzer Vereinfachung von Anfragen Realisierung der Generalisierung DBMS proprietär: materialized views (ORACLE): präkompilierte nicht mehr virtuelle Anfrage indexed views (SQL Server): zusätzlich gespeicherter Index verwendet zur Beschleunigung von sehr häufig durchgeführten Anfragen. Sebastian Skritek Relationale Abfragesprachen 3. Datenabfragesprache Beispiel Aus Datenschutzgründen soll im Allgemeinen nur die Prüfungsliste, nicht aber die Note lesbar sein: create view prüfenSicht as select MatrNr , VorlNr , PersNr from prüfen ; Seite 98 3. Datenabfragesprache 3.11. Sichten (Views) Sebastian Skritek Relationale Abfragesprachen Vereinfachung von Anfragen Seite 99 3. Datenabfragesprache 3.11. Sichten (Views) Vereinfachung von Anfragen Beispiel Beispiel Vermeidung der ständigen Verwendung des Joins Studenten hören Vorlesungen Professoren Vermeidung der ständigen Verwendung des Joins Studenten hören Vorlesungen Professoren create view StudProf ( Sname , Semester , Titel , Pname ) as select s . Name , s . Semester , v . Titel , p . Name from Studenten s , hören h , Vorlesungen v , Professoren p where s . MatrNr = h . MatrNr and h . VorlNr = v . VorlNr and v . gelesenVon = p . PersNr ; create view StudProf ( Sname , Semester , Titel , Pname ) as select s . Name , s . Semester , v . Titel , p . Name from Studenten s , hören h , Vorlesungen v , Professoren p where s . MatrNr = h . MatrNr and h . VorlNr = v . VorlNr and v . gelesenVon = p . PersNr ; Suchen Sie Name, Semester aller Studenten von Sokrates select distinct Name , Semester from StudProf where Pname = ’ Sokrates ’; Sebastian Skritek Seite 100 Sebastian Skritek Seite 100 Relationale Abfragesprachen 3. Datenabfragesprache 3.11. Sichten (Views) Relationale Abfragesprachen Realisierung der Generalisierung 3. Datenabfragesprache 3.11. Sichten (Views) Realisierung der Generalisierung Sichten realisieren Inklusion und Vererbung: Sichten realisieren Inklusion und Vererbung: Tupel des Untertyps sollen auch automatisch zum Obertyp gehören Tupel des Untertyps sollen auch automatisch zum Obertyp gehören Attribute des Obertyps: sollen automatisch vererbt werden. Attribute des Obertyps: sollen automatisch vererbt werden. ⇒ entweder Untertypen oder Obertypen als Sicht definieren Entscheidung aufgrund der Häufigkeit der Zugriffe Sebastian Skritek Relationale Abfragesprachen Seite 101 3. Datenabfragesprache 3.11. Sichten (Views) Sebastian Skritek Relationale Abfragesprachen Seite 101 3. Datenabfragesprache 3.11. Sichten (Views) Realisierung der Generalisierung Realisierung der Generalisierung Beispiel (Untertypen als Sicht) Beispiel (Untertypen als Sicht) create table Angestellte ( PersNr integer not null , Name varchar (30) not null ); create table ProfDaten ( PersNr integer not null , Rang character (2) , Raum integer ); create table AssiDaten ( PersNr integer not null , Fachgebiet varchar (30) , Boss integer ); create table Angestellte ( PersNr integer not null , Name varchar (30) not null ); create table ProfDaten ( PersNr integer not null , Rang character (2) , Raum integer ); create table AssiDaten ( PersNr integer not null , Fachgebiet varchar (30) , Boss integer ); create view Professoren as select * from Angestellte natural join ProfDaten ; create view Assistenten as select * from Angestellte natural join AssiDaten ; Sebastian Skritek Seite 102 Sebastian Skritek Seite 102 Relationale Abfragesprachen 3. Datenabfragesprache 3.11. Sichten (Views) Relationale Abfragesprachen 3. Datenabfragesprache 3.11. Sichten (Views) Realisierung der Generalisierung Realisierung der Generalisierung Beispiel (Obertypen als Sicht) Beispiel (Obertypen als Sicht) create table Professoren ( PersNr integer not null , Name varchar (30) not null , Rang character (2) , Raum integer ); create table Assistenten ( PersNr integer not null , Name varchar (30) not null , Fachgebiet varchar (30) , Boss integer ); create table AndereAnges ( PersNr integer not null , Name varchar (30) not null ); create table Professoren ( PersNr integer not null , Name varchar (30) not null , Rang character (2) , Raum integer ); create table Assistenten ( PersNr integer not null , Name varchar (30) not null , Fachgebiet varchar (30) , Boss integer ); create table AndereAnges ( PersNr integer not null , Name varchar (30) not null ); create view Angestellte as ( select PersNr , Name from Professoren ) union ( select PersNr , Name from Assistenten ) union ( select * from AndereAnges ); Sebastian Skritek Relationale Abfragesprachen Seite 103 3. Datenabfragesprache 3.11. Sichten (Views) Sebastian Skritek Relationale Abfragesprachen Updates auf Sichten Seite 103 3. Datenabfragesprache 3.11. Sichten (Views) Updates auf Sichten Problematisch: insert, update, delete auf eine Sicht Problematisch: insert, update, delete auf eine Sicht Beispiele (nicht updatefähige Sichten) Beispiele (nicht updatefähige Sichten) create view WieHartAlsPrüfer ( PersNr , Durchschnitt ) as select PersNr , avg ( Note ) from prüfen group by PersNr ; create view WieHartAlsPrüfer ( PersNr , Durchschnitt ) as select PersNr , avg ( Note ) from prüfen group by PersNr ; create view VorlesungenSicht as select Titel , SWS , Name from Vorlesungen , Professoren where gelesenVon = PersNr ; Sebastian Skritek Seite 104 Sebastian Skritek Seite 104 Relationale Abfragesprachen 3. Datenabfragesprache 3.11. Sichten (Views) Relationale Abfragesprachen Updates auf Sichten 4. Datenmanipulationssprache Datenmanipulationssprache – Tupel Einfügen Einfügen von Tupeln in eine angelegte Tabelle Einschränkungen der update-fähigen Sichten in SQL auf: Professoren ( PersNr : integer , Name : varchar (30) , Rang : character (2) , Raum : integer ) nur eine Basisrelation Schlüssel muss vorhanden sein keine Aggregatfunktionen, Gruppierung und Duplikateliminierung alle Sichten theoretisch änderbare Sichten in SQL änderbare Sichten Sebastian Skritek Seite 105 Relationale Abfragesprachen 4. Datenmanipulationssprache Sebastian Skritek Seite 106 Relationale Abfragesprachen Datenmanipulationssprache – Tupel Einfügen 4. Datenmanipulationssprache Datenmanipulationssprache – Tupel Einfügen Einfügen von Tupeln in eine angelegte Tabelle Einfügen von Tupeln in eine angelegte Tabelle Professoren ( PersNr : integer , Name : varchar (30) , Rang : character (2) , Raum : integer ) Professoren ( PersNr : integer , Name : varchar (30) , Rang : character (2) , Raum : integer ) Beispiel Beispiel Einfügen der Professorin Curie: Einfügen der Professorin Curie: insert into Professoren values (2136 , ’ Curie ’ , ’ C4 ’ , 36); insert into Professoren values (2136 , ’ Curie ’ , ’ C4 ’ , 36); Einfügen mehrerer Professoren: insert into Professoren values (2125 , ’ Sokrates ’ , ’ C4 ’ , 226) , (2126 , ’ Russel ’ , ’ C4 ’ , 232); Sebastian Skritek Seite 106 Sebastian Skritek Seite 106 Relationale Abfragesprachen 4. Datenmanipulationssprache Relationale Abfragesprachen 4. Datenmanipulationssprache Datenmanipulationssprache – Tupel Einfügen Datenmanipulationssprache – Tupel Einfügen Das Ergebnis einer Anfrage in eine Tabelle eintragen: Das Ergebnis einer Anfrage in eine Tabelle eintragen: Beispiel Beispiel Eintragen aller Studenten zur Vorlesung ‘Logik’: Eintragen aller Studenten zur Vorlesung ‘Logik’: hören ( MatrNr , VorlNr ) Studenten ( MatrNr , Name , Sem ) Vorlesungen ( VorlNr , Titel , SWS , PersNr ) hören ( MatrNr , VorlNr ) Studenten ( MatrNr , Name , Sem ) Vorlesungen ( VorlNr , Titel , SWS , PersNr ) insert into hören Sebastian Skritek Relationale Abfragesprachen insert into hören select MatrNr , VorlNr from Studenten , Vorlesungen where Titel = ’ Logik ’; Seite 107 4. Datenmanipulationssprache Sebastian Skritek Relationale Abfragesprachen Datenmanipulationssprache – Tupel Löschen Seite 107 4. Datenmanipulationssprache Datenmanipulationssprache – Tupel Löschen Auflisten der zu löschenden Tupeln: Auflisten der zu löschenden Tupeln: Beispiel Beispiel Löschen des Herrn Kant aus der Professorentabelle: Löschen des Herrn Kant aus der Professorentabelle: delete from Professoren values (2137 , ’ Kant ’ , ’ C4 ’ , 7); delete from Professoren values (2137 , ’ Kant ’ , ’ C4 ’ , 7); Lösche alle Tupel die eine Bedingung erfüllen: Lösche alle Tupel die eine Bedingung erfüllen: Beispiel Beispiel Löschen des Herrn Kant aus der Professorentabelle: Löschen des Herrn Kant aus der Professorentabelle: delete from Professoren where PersNr =2137; delete from Professoren where PersNr =2137; delete from Professoren where PersNr < 2137; Sebastian Skritek Seite 108 Sebastian Skritek Seite 108 Relationale Abfragesprachen 4. Datenmanipulationssprache Relationale Abfragesprachen Datenmanipulationssprache – Tupel Löschen 4. Datenmanipulationssprache Datenmanipulationssprache – Tupel Löschen Beispiel Beispiel Lösche alle Studenten, die die Vorlesung ‘Logik’ besuchen Lösche alle Studenten, die die Vorlesung ‘Logik’ besuchen hören ( MatrNr , VorlNr ) Studenten ( MatrNr , Name , Sem ) Vorlesungen ( VorlNr , Titel , SWS , PersNr ) hören ( MatrNr , VorlNr ) Studenten ( MatrNr , Name , Sem ) Vorlesungen ( VorlNr , Titel , SWS , PersNr ) delete from Studenten where MatrNr in ( select MatrNr from hören , Vorlesungen where hören . VorlNr = Vorlesungen . VorlNr and Titel = ’ Logik ’ ); Sebastian Skritek Relationale Abfragesprachen Seite 109 4. Datenmanipulationssprache Sebastian Skritek Relationale Abfragesprachen Datenmanipulationssprache – Tupel Verändern Seite 109 4. Datenmanipulationssprache Datenmanipulationssprache – Tupel Verändern Verändern von Tupeln Beispiel Erhöhen der Semesteranzahl aller Studierender um 1: update Studenten set Semester = Semester + 1; Beispiel Alle C3 Professoren mit einer Personalnummer über 2500 erhalten den Rang C2 update Professoren set Rang = ’ C2 ’ where Rang = ’ C3 ’ and PersNr > 2500; Sebastian Skritek Seite 110 Sebastian Skritek Seite 110 Relationale Abfragesprachen 4. Datenmanipulationssprache Relationale Abfragesprachen Datenmanipulationssprache – Tupel Verändern 4. Datenmanipulationssprache Datenmanipulationssprache – Tupel Verändern Verändern von Tupeln Beispiel Professoren ( PersNr : integer , Name : varchar (30) , Rang : character (2) , Raum : integer , Lehrbelastung: integer ) Vorlesungen ( VorlNr , Titel , SWS , PersNr ) Trage für jeden Professor seine Lehrbelastung (=Summe SWS) ein Sebastian Skritek Relationale Abfragesprachen Seite 111 4. Datenmanipulationssprache Datenmanipulationssprache – Tupel Verändern Verändern von Tupeln Beispiel Professoren ( PersNr : integer , Name : varchar (30) , Rang : character (2) , Raum : integer , Lehrbelastung: integer ) Vorlesungen ( VorlNr , Titel , SWS , PersNr ) Trage für jeden Professor seine Lehrbelastung (=Summe SWS) ein update Professoren set Lehrbelastung = ( select sum ( SWS ) from Vorlesungen v where v . PersNr = Professoren . PersNr ) (Anmerkung: Lehrbelastung sollte so nicht gespeichert werden) Sebastian Skritek Seite 111 Sebastian Skritek Seite 111