Vorlesung #3 SQL (Teil 1)
Fahrplan Wiederholung/Zusammenfassung Relationales Modell Relationale Algebra Relationenkalkül Geschichte der Sprache SQL SQL DDL (CREATE TABLE...) SQL DML (INSERT, UPDATE, DELETE) SQL Abfragen Aggregation und Gruppierung Null-Werte, 3-wertige Logik Bojan Milijaš, 22.10.2010 Vorlesung #3 - SQL (Teil 1) 2
Geschichte von SQL Anfang 70er Jahre System R von IBM mit der Sprache SEQUEL Structured English Query Language, später aus patentrechtlichen Gründen in SQL unbenannt Parallel entwickelte man QUEL als Anfragesprache für das INGRES-System SQL setzte sich durch als Industrie-Standard (wegen Ignorranz der INGRES-Entwickler) 1986: SQL-86 1. SQL Norm von ANSI Comitee 1992: SQL-92 bzw. SQL-2 1999: SQL-99 bzw. SQL-3 (objektrelationale Erweiterungen) Bojan Milijaš, 22.10.2010 Vorlesung #3 - SQL (Teil 1) 3
Datentypen in SQL Atomare Datentypen als Attribut-Domänen Zahlen numeric(p,s) number(p,s) integer float Zeichenketten character(n) char(n) char varying (n) varchar(n), varchar2(n) Datumstyp date Weitere: BLOB (Binary Large Objects), RAW für große Binärdatein, CLOB (Character LOB), benutzerdefinierte Typen als objektrelationale Erweiterung... Bojan Milijaš, 22.10.2010 Vorlesung #3 - SQL (Teil 1) 4
Einfache Datendefinition SQL DDL (Data Definition Language) CREATE TABLE Professoren (PersNr INTEGER, Name CHARACTER VARYING(30), Rang CHARACTER(2)); CREATE TABLE professoren (persnr NUMBER(*,0), name VARCHAR2(30), rang CHAR(2)); Bojan Milijaš, 22.10.2010 Vorlesung #3 - SQL (Teil 1) 5
Schemaveränderungen SQL DDL (Data Definition Language) Hinzufügen eines Attributs bzw. einer Spalte ALTER TABLE Professoren ADD Raum INTEGER; Löschen eines Attributs bzw. einer Spalte ALTER TABLE Professoren DROP COLUMN Raum; Bojan Milijaš, 22.10.2010 Vorlesung #3 - SQL (Teil 1) 6
Datenmanipulation (1) SQL DML (Data Manipultaion Language) Einfügen von Tupeln insert into hören select MatrNr, VorlNr from Studenten, Vorlesungen where Titel= `Logik ; insert into Studenten (MatrNr, Name) values (28121, `Archimedes ); Bojan Milijaš, 22.10.2010 Vorlesung #3 - SQL (Teil 1) 7
Datenmanipulation (2) SQL DML (Data Manipultaion Language) Löschen von Tupeln delete Studenten where Semester > 13; Verändern von Tupeln update Studenten set Semester= Semester + 1; Bojan Milijaš, 22.10.2010 Vorlesung #3 - SQL (Teil 1) 8
Einfache SQL Anfragen select PersNr, Name from Professoren where Rang= C4 ; PersNr Name 2125 Sokrates 2126 Russel 2136 Curie 2137 Kant Bojan Milijaš, 22.10.2010 Vorlesung #3 - SQL (Teil 1) 9
Einfache SQL Anfragen (2) Sortierung select PersNr, Name, Rang from Professoren PersNr 2136 2137 Name Curie Kant Rang C4 C4 order by Rang desc, Name asc; 2126 2125 Russel Sokrates C4 C4 desc descending asc ascending 2134 2127 2133 Augustinus Kopernikus Popper C3 C3 C3 Bojan Milijaš, 22.10.2010 Vorlesung #3 - SQL (Teil 1) 10
Einfache SQL Anfragen (3) Duplikateliminierung select distinct Rang from Professoren; Rang C3 C4 Bojan Milijaš, 22.10.2010 Vorlesung #3 - SQL (Teil 1) 11
Anfragen über mehrere Relationen Welcher Professor liest "Mäeutik"? select Name, Titel from Professoren, Vorlesungen where PersNr = gelesenvon and Titel = `Mäeutik ; σ Name, Titel( PersNr = gelesenvon Titel ' Mäeutik' (Professoren Vorlesungen)) = Bojan Milijaš, 22.10.2010 Vorlesung #3 - SQL (Teil 1) 12
Anfragen über mehrere Relationen (2) Professoren Vorlesungen PersNr Name Rang Raum VorlNr Titel SWS gelesenvon 2125 2126 Sokrates Russel C4 C4 226 232 5001 5041 Grundzüge Ethik 4 4 2137 2125 2137 Kant C4 7 5049 Mäeutik 2 2125 4630 Die 3 Kritiken 4 2137 Verknüpfung Χ Bojan Milijaš, 22.10.2010 Vorlesung #3 - SQL (Teil 1) 13
Bojan Milijaš, 22.10.2010 Vorlesung #3 - SQL (Teil 1) 14
3 Wege Join Welche Studenten hören welche Vorlesungen? select Name, Titel from Studenten, hören, Vorlesungen where Studenten.MatrNr = hören.matrnr and hören.vorlnr = Vorlesungen.VorlNr; Alternativ: select s.name, v.titel from Studenten s, hören h, Vorlesungen v where s. MatrNr = h. MatrNr and h.vorlnr = v.vorlnr Bojan Milijaš, 22.10.2010 Vorlesung #3 - SQL (Teil 1) 15
Bojan Milijaš, 22.10.2010 Vorlesung #3 - SQL (Teil 1) 16
Aggregatfunktionen min, max, avg, sum, count SELECT min(semester) FROM Studenten; SELECT max(semester) FROM Studenten; SELECT avg(semester) FROM Studenten; SELECT sum(semester) FROM Studenten; SELECT count(matrnr), -- count(*) count(distinct Semester) FROM Studenten; Bojan Milijaš, 22.10.2010 Vorlesung #3 - SQL (Teil 1) 17
... mit Gruppierung min, max, avg, sum, count mitgroup BY select gelesenvon, sum (SWS) from Vorlesungen group by gelesenvon; mit HAVING select gelesenvon, Name, sum (SWS) from Vorlesungen, Professoren where gelesenvon = PersNr and Rang = C4 group by gelesenvon, Name having avg (SWS) >= 3; Bojan Milijaš, 22.10.2010 Vorlesung #3 - SQL (Teil 1) 18
Besonderheiten bei Aggregatoperationen SQL erzeugt pro Gruppe ein Ergebnistupel Deshalb müssen alle in der select-klausel aufgeführten Attribute - außer den aggregierten auch in der group by- Klausel aufgeführt werden Nur so kann SQL sicherstellen, dass sich das Attribut nicht innerhalb der Gruppe ändert SELECT A1, A2, An, count(*) FROM... WHERE.. GROUP BY A1, A2, An Bojan Milijaš, 22.10.2010 Vorlesung #3 - SQL (Teil 1) 19
Bojan Milijaš, 22.10.2010 Vorlesung #3 - SQL (Teil 1) 20
Bojan Milijaš, 22.10.2010 Vorlesung #3 - SQL (Teil 1) 21
Bojan Milijaš, 22.10.2010 Vorlesung #3 - SQL (Teil 1) 22
Ergebnis der Abfrage gelesenvon 2125 2137 Name Sokrates Kant sum (SWS) 10 8 Bojan Milijaš, 22.10.2010 Vorlesung #3 - SQL (Teil 1) 23
Nullwerte unbekannter Wert wird vielleicht später nachgereicht Nullwerte können auch im Zuge der Anfrageauswertung entstehen (Bsp. äußere Joins) manchmal sehr überraschende Anfrageergebnisse, wenn Nullwerte vorkommen UPDATE studenten SET semester = '' WHERE matrnr = 24002; select count (*) from Studenten where Semester < 13 or Semester >= 13 Tupel (Zeilen) mit Null-Werten werden einfach nicht mitgezählt!!! Bojan Milijaš, 22.10.2010 Vorlesung #3 - SQL (Teil 1) 24
Nullwerte (2) NULL + 1 = NULL, NULL * 1 = NULL Beispiele (Oracle) SELECT NULL + 2 FROM Dual; SELECT NULL * 2 FROM Dual; Dual ist so etwas wie Dummy -Tabelle in Oracle Es gilt die sogenannte 3-wertige Logik in SQL Bojan Milijaš, 22.10.2010 Vorlesung #3 - SQL (Teil 1) 25
3-wertige Logik (NULL Logik) not and TRUE NULL FALSE TRUE FALSE TRUE TRUE NULL FALSE NULL NULL NULL NULL NULL FALSE FALSE TRUE FALSE FALSE FALSE FALSE or TRUE NULL FALSE TRUE TRUE TRUE TRUE NULL TRUE NULL NULL FALSE TRUE NULL FALSE Bojan Milijaš, 22.10.2010 Vorlesung #3 - SQL (Teil 1) 26
Regeln für NULL Werte In arithmetischen Ausdrücken werden NULL Werte propagiert (NULL + 3 = NULL) Es gilt die 3-wertige Logik. Vergleichsoperatoren (=, >,<=) liefern immer NULL zurück, wenn mindestens ein Argument NULL ist Logische Ausdrücke werden entsprechend den vorgestellten 3-wertige-Logik Tabellen ausgewertet Tupeln mit NULL als Ergebnis in einer WHERE Klausel werden nicht weitergereicht, d.h NULL Werte werden in WHERE Klauseln ausgelassen Bei Gruppierung ist NULL ein eigenständiger Wert Bojan Milijaš, 22.10.2010 Vorlesung #3 - SQL (Teil 1) 27
Behandlung von NULL Werten (Oracle und SQL-92) In Oracle gibt es eine null value Funktion nvl (if NULL then): SELECT nvl(null,5) + 2 AS Result FROM Dual; Result ------ 7 Man kann NULL Werte mit IS NULL oder IS NOT NULL testen (SQL-92) Bojan Milijaš, 22.10.2010 Vorlesung #3 - SQL (Teil 1) 28
Ausblick Vorlesung #4 SQL, Fortsetzung Geschachtelte Anfragen Korrelierte Anfragen Mengenoperationen Quantifizierte Anfragen (, ) Spezielle Sprachkonstrukte Joins in SQL-92, SQL-99 Rekursion Sichten (Views) Bojan Milijaš, 22.10.2010 Vorlesung #3 - SQL (Teil 1) 29
Vorlesung #3 Ende