5.1 Allgemeines zu SQL ......................................................... 5 5.2 SQL-DDL: Definition eines Datenbankschemas .............. 8 5.3 SQL-DML: Abfragen in SQL (Query Language) .............. 15 5.4 SQL-DML: Mutationen in SQL (Insert, Update, Delete) … 65 01.10.2007 AIFB SQL - Structured Query Language 5 SQL – Structured Query Language 1 (1|3) Entwicklungsziele: möglichst einfach für den Endbenutzer; möglichst deskriptiv, nicht prozedural Benennung: SQL: „structured query language" ursprünglich: SEQUEL – „structured english query language" Entwicklung: (im IBM-Labor) basiert auf relationaler Algebra und Tupelkalkül erste Vorschläge 1974; weiterentwickelt 1976-77 Implementierungen 1977 im System R (Prototyp eines rel. DBS) Erste kommerzielle Implementierungen: Oracle: 1980 IBM: SQL/DS (1981), DB2 (1983) 01.10.2007 AIFB SQL - Structured Query Language 5.1 Allgemeines zu SQL 2 (2|3) Standardisierung SQL-86 (1986): erster Standardisierungsversuch SQL-89 (1989): Lücken (z.B.: Fremdschlüssel) von SQL-86 z.T. geschlossen; SQL-92 (1992): Aktueller, umfassender Standard; drei Standardisierungslevels (entry, intermediate, full level); Der Entry Level wird von den meisten Datenbanken unterstützt. Der Intermediate Level im vollen Sprachumfang von keiner einzigen. SQL-99 (1999): Weiterentwicklung mit objekt-orientierten Ansätzen; in kommerziellen Produkten nur teilweise implementiert; Gliederung in Core-SQL (Sprachkern) und verschiedenen Packages, die aus Features bestehen. Sprachumfang: SQL deckt die Aspekte der DDL und der DML (Abfragen, Mutationen) ab. 01.10.2007 AIFB SQL - Structured Query Language 5.1 Allgemeines zu SQL 3 (3|3) Schnittstellen: SQL kann sowohl interaktiv, als auch eingebettet in einer konventionellen Programmiersprache (z.B. C, JAVA, …) verwendet werden. Terminologie: table – Relation row – Tupel column – Attribut relationales Modell: SQL ist eine Umsetzung des relationalen Modells, wobei es neben den eigentlichen Tabellen (set of rows) auch uneigentliche Tabellen (multi-set of rows) gibt. Bei diesen können Tupel mehrfach auftreten, was dem Mengenbegriff widerspricht. 01.10.2007 AIFB SQL - Structured Query Language 5.1 Allgemeines zu SQL 4 5.1 Allgemeines zu SQL ........................................................ 5 5.2 SQL-DDL: Definition eines Datenbankschemas ............. 8 4.2.1 Definition von Basistabellen ................................... 10 4.2.2 Datentypen und benutzerdefinierte Domänen ....... 11 4.2.3 Ein Beispiel für ein Datenbankschema .................. 13 4.2.4 Definition von Sichten ............................................ 14 5.3 SQL-DML: Abfragen in SQL (Query Language) ............. 15 5.4 SQL-DML: Mutationen in SQL ....................................... 65 01.10.2007 AIFB SQL - Structured Query Language 5 SQL – Structured Query Language 5 Datenbank Benutzersichten : Menge von Basistabellen : Views Übersicht: SQL-DDL (vereinfacht) Anweisungen Bedeutung CREATE DROP CREATE ALTER SCHEMA SCHEMA TABLE TABLE DROP CREATE DROP CREATE DROP TABLE VIEW VIEW DOMAIN DOMAIN Anlegen eines Datenbankschemas Löschen eines Schemas Definition einer Basistabelle Ändern einer Basistabelle (Hinzufügen von Attributen) Löschen einer Basistabelle Definition einer Sicht Löschen einer Sicht benutzerdefinierte „Domain“ anlegen benutzerdefinierte „Domain“ löschen Die CREATE TABLE Anweisung ist davon die wichtigste. 01.10.2007 AIFB SQL - Structured Query Language 5.2 Definition eines Datenbankschemas (SQL-DDL) 6 Definition einer Relation: CREATE TABLE table-name ({column-definition | table-constraint}[, {column-definition | table-constr.}…]); definiert einen Relationstyp und legt gleichzeitig eine entsprechende Relation (Instanz) an („Schema einer Relation“). SQL kennt nicht den benannten Relationstyp Spaltendefinition: column-definition: column-name {data-type | domain-name} [column-constraint …] column-constraint: NOT NULL | UNIQUE | PRIMARY KEY | reference-constraint reference-constraint: REFERENCES table-name [(reference-column)] Constraints über mehrere Attribute: (table-constraint) UNIQUE (column-list) PRIMARY KEY (column-list) FOREIGN KEY (referencing-columns) REFERENCES table-name [(column-list)] 01.10.2007 AIFB SQL - Structured Query Language 5.2.1 Definition von Basistabellen 7 (1/2) SQL bietet folgende (Basis-)Datentypen: (Auswahl) Beschreibung Zeichen(ketten): Ein einzelnes Zeichen Kette fester Länge Kette variabler Länge Bit-Datentyp: Ein Bit Datentyp CHARACTER CHARACTER (n) CHARACTER VARYING (n) CHAR CHAR (n) ∗) VARCHAR (n) BIT Bitfolge fester Länge Exakte Zahlen: Bitfolge variabler Länge mit Nachkommastellen dto. BIT (n) Ganzzahl kleine Ganzzahl Gleitkommazahlen: INTEGER SMALLINT BIT VARYING (n) DECIMAL [(p,[,s])] NUMERIC [(p,[,s])] hohe Genauigkeit DOUBLE PRECISION benutzerdefinierte Gen. FLOAT (n) geringere Genauigkeit REAL *) n=integer, p, s ebenso. Kurzform DEC(p,s) INT 01.10.2007 AIFB SQL - Structured Query Language 5.2.2 Datentypen und benutzerdefinierte Domänen 8 Beschreibung Zeit, Datum, Zeitintervall: Datentyp Datum (y,m,d) DATE Zeitpunkt (h,min,sec) TIME Zeitpunkt (y,m,d,h, min, sec) Zeitintervall TIMESTAMP INTERVAL f INTERVAL sf to ef f, sf, ef ∈ {YEAR, MONTH, DAY, HOUR, MINUTE, SECOND} („sf>ef“) (2/2) Kurzform In SQL können benutzerdefinierte Datentypen als Einschränkung der vorgegebenen Datentypen definiert werden. Beispiel 5-1: Prozentangaben sind Gleitkommawerte zwischen 0 und 100. CREATE DOMAIN ProzentAngabe AS REAL CONSTRAINT ProzAngabeConstraint CHECK ( VALUE >= 0.0 AND VALUE <= 100.0); 01.10.2007 AIFB SQL - Structured Query Language 5.2.2 Datentypen und benutzerdefinierte Domänen 9 CREATE SCHEMA Projektverwaltung; CREATE DOMAIN PersonalNr AS INTEGER; CREATE DOMAIN ProjektNr AS INTEGER; CREATE DOMAIN ProzentAngabe AS ... CREATE TABLE (ANG-NR NAME WOHNORT ABT-NR angestellte PersonalNr PRIMARY KEY, VARCHAR (30), VARCHAR (30), INTEGER); CREATE TABLE (P-NR P-NAME P-FILIALE P-LEITER projekt ProjektNr PRIMARY KEY, VARCHAR (15), VARCHAR (30), PersonalNr REFERENCES angestellte(ANG-NR)); CREATE TABLE ang-pro (P-NR ProjektNr REFERENCES projekt (P-NR), ANG-NR PersonalNr REFERENCES angestellte (ANG-NR), PROZ-ARBZEIT ProzentAngabe, PRIMARY KEY (P-NR, ANG-NR)). 01.10.2007 AIFB SQL - Structured Query Language 5.2.3 Ein Beispiel für ein Datenbankschema 10 CREATE VIEW table-name [(column-name [,column-name] …)] AS query expression [WITH CHECK OPTION]; ([WITH CHECK OPTION]: bei Mutationen: Prüfung ob eingefügte oder geänderte Tupel zu View gehören.) Beispiel 5-2: CREATE VIEW angestellteAusKarlsruhe AS SELECT ANG-NR, NAME, WOHNORT, ABT-NR FROM angestellte WHERE WOHNORT = ‘Karlsruhe‘; 01.10.2007 AIFB SQL - Structured Query Language 5.2.4 Definition von Sichten 11 5.1 Allgemeines zu SQL ............................................................................ 5 5.2 SQL-DDL: Definition eines Datenbankschemas ................................... 8 5.3 SQL-DML: Abfragen in SQL (Query Language) ................................... 15 5.3.1 Die Syntax der SELECT-Abfrage ....................................... 18 5.3.2 Abfragen mit Bedingungen ....................................................... 19 5.3.3 Spezielle Abfragen an eine Relation..........................................28 5.3.4 Aggregatfunktionen (COUNT, SUM, …) ................................... 34 5.3.5 Bildung von Gruppen (GROUP) ............................................... 38 5.3.6 Verknüpfung von Relationen (Join) .......................................... 41 5.3.7 Join-Operationen ab SQL-92 ................................................... 44 5.3.8 Verknüpfung von Relationen mit Subqueries ........................... 53 5.3.9 Abfragen mit Existenz-Quantor ................................................ 60 5.3.10 Mengenoperationen ................................................................. 61 SQL-DML: Mutationen in SQL (Insert, Update, Delete) ...................... 65 5.4 01.10.2007 AIFB SQL - Structured Query Language 5 SQL – Structured Query Language 12 (1/2) Tabellen zu den folgenden Beispielen: angestellte ANG-NR 3115 3207 2814 3190 2314 1324 1435 2412 2244 1237 3425 2454 projekt P-NAME P-1 P-2 P-3 P-4 NAME Meyer Müller Klein Maus Groß Schmitt Mayerlein Müller Schulz Krämer Meier Schuster (#=n) WOHNORT Karlsruhe Mannheim Mannheim Karlsruhe Karlsruhe Heidelberg Bruchsal Karlsruhe Bruchsal Ludwigshafen Pforzheim Worms ABT-NR 35 30 32 30 35 35 32 32 31 31 30 31 P-NR 761235 770008 770114 770231 (#=k) P-FILIALE Karlsruhe Karlsruhe Heidelberg Mannheim P-LEITER 3115 3115 1324 2814 01.10.2007 AIFB SQL - Structured Query Language 5.3 Abfragen in SQL (Query Language) 13 ang-pro P-NR 761235 761235 761235 761235 761235 770008 770008 770008 770008 770114 770114 770114 770114 770114 770114 770231 770231 770231 770231 770231 (#=m) ANG-NR 3207 3115 3190 1435 3425 2244 1237 2814 2454 2814 1435 1237 2454 3425 2412 3190 2314 2244 3115 1324 (2/2) PROZ-ARBZEIT 100 50 50 40 50 20 40 70 40 30 60 60 60 50 100 50 100 80 50 100 01.10.2007 AIFB SQL - Structured Query Language 5.3 Abfragen in SQL (Query Language) 14 Die SELECT-Abfrage Grundform: SELECT FROM WHERE … … … Auswahl von Spalten (π) Relation(en)/Tabelle(n) Selektionsbedingung (σ) SELECT-Abfrage ::= SELECT [DISTINCT] derived column(s) FROM table(s) [WHERE search condition] [GROUP BY column(s) [HAVING search condition]] [ORDER BY column(s)]; Mengenoperationen: SELECT-Abfrage op SELECT-Abfrage op := {EXCEPT | INTERSECT | UNION} [ALL] Ab SQL-92 können SELECT-Abfragen außerdem durch explizite JoinOperationen verknüpft werden. → Abs. 5.3.7 01.10.2007 AIFB SQL - Structured Query Language 5.3.1 Die Syntax der SELECT-Abfrage 15 WHERE <search condition> Die search condition ist ein logischer Ausdruck, der folgendes enthalten kann: - Vergleichsoperationen: =, <, >, <>, >=, <=, BETWEEN, LIKE, IN - Boolesche Operatoren: AND, OR, NOT (d.h. Bezugnahme auf eine Zeile, wie σ-Operation) 01.10.2007 AIFB SQL - Structured Query Language 5.3.2 Abfragen mit Bedingungen (″σ″)(1/9) 16 1. „Name und Abteilungsnummer aller Angestellten mit Wohnort Karlsruhe“ SELECT FROM WHERE NAME, ABT-NR Ergebnis: angestellte WOHNORT=‘Karlsruhe’; angestellte ANG-NR 3115 3207 2814 3190 2314 1324 1435 2412 2244 1237 3425 2454 NAME Meyer Müller Klein Maus Groß Schmitt Mayerlein Müller Schulz Krämer Meier Schuster WOHNORT Karlsruhe Mannheim Mannheim Karlsruhe Karlsruhe Heidelberg Bruchsal Karlsruhe Bruchsal Ludwigshafen Pforzheim Worms NAME Meyer Maus Groß Müller ABT-NR 35 30 35 32 ABT-NR 35 30 32 30 35 35 32 32 31 31 30 31 01.10.2007 AIFB SQL - Structured Query Language 5.3.2 Abfragen mit Bedingungen (″σ″)(2/9) 17 Zusammengesetzte Suchbedingung 2. „Name und Abteilungsnummer aller Angestellten, die in Karlsruhe wohnen oder in Abteilung 30 arbeiten“ NAME ABT-NR Ergebnis: SELECT NAME, ABT-NR Meyer 35 FROM WHERE angestellte WOHNORT=‘Karlsruhe’ OR ABT-NR=30; angestellte ANG-NR 3115 3207 2814 3190 2314 1324 1435 2412 2244 1237 3425 2454 NAME Meyer Müller Klein Maus Groß Schmitt Mayerlein Müller Schulz Krämer Meier Schuster Müller Maus Groß Müller Meier WOHNORT Karlsruhe Mannheim Mannheim Karlsruhe Karlsruhe Heidelberg Bruchsal Karlsruhe Bruchsal Ludwigshafen Pforzheim Worms 30 30 35 32 30 ABT-NR 35 30 32 30 35 35 32 32 31 31 30 31 01.10.2007 AIFB SQL - Structured Query Language 5.3.2 Abfragen mit Bedingungen (″σ″)(3/9) 18 Abfragen mit Bereichsgrenzen 3. „Alle Angestellten (Nummer und Name) mit Nummer zwischen 1435 und 2314 (jeweils einschließlich)“ „ x BETWEEN a AND b“ entspricht „x >= a AND x <= b“ SELECT FROM WHERE angestellte ANG-NR 3115 3207 2814 3190 2314 1324 1435 2412 2244 1237 3425 2454 ANG-NR, NAME Ergebnis: angestellte ANG-NR BETWEEN 1435 AND 2314; NAME Meyer Müller Klein Maus Groß Schmitt Mayerlein Müller Schulz Krämer Meier Schuster WOHNORT Karlsruhe Mannheim Mannheim Karlsruhe Karlsruhe Heidelberg Bruchsal Karlsruhe Bruchsal Ludwigshafen Pforzheim Worms ANG-NR 2314 1435 2244 NAME Groß Mayerlein Schulz ABT-NR 35 30 32 30 35 35 32 32 31 31 30 31 01.10.2007 AIFB SQL - Structured Query Language 5.3.2 Abfragen mit Bedingungen (″σ″)(4/9) 19 Abfragen mit Wertaufzählung 4. „Alle Angestellten-Nummern der Abteilungen 30 und 35 aus Karlsruhe und Mannheim“ ANG-NR Ergebnis: SELECT ANG-NR FROM WHERE angestellte ABT-NR IN (30, 35) AND WOHNORT IN (’Karlsruhe’, ’Mannheim’); angestellte ANG-NR NAME WOHNORT Meyer Karlsruhe 3115 Müller Mannheim 3207 Klein Mannheim 2814 Maus Karlsruhe 3190 Groß Karlsruhe 2314 Schmitt Heidelberg 1324 Mayerlein Bruchsal 1435 Müller Karlsruhe 2412 Negation: NOT BETWEEN / NOT Bruchsal Schulz 2244 Ludwigshafen IN Krämer 1237 Meier Pforzheim 3425 Schuster Worms 2454 3115 3207 3190 2314 ABT-NR 35 30 32 30 35 35 32 32 31 31 30 31 01.10.2007 AIFB SQL - Structured Query Language 5.3.2 Abfragen mit Bedingungen (″σ″)(5/9) 20 Abfrage mit Teilstring-Suche (Wildcards) Das Zeichen "%" im Suchstring steht für eine beliebige Folge von Characters, "passt" also auf jeden String. 5. „Nummer und P-FILIALE aller Projekte, deren P-Filialen in Städten liegen, deren Namen ein „ei“ enthalten.“ SELECT FROM WHERE projekt P-NAME P-1 P-2 P-3 P-4 Ergebnis: P-NR, P-FILIALE projekt P-FILIALE LIKE ‘%ei%’; P-NR 761235 770008 770114 770231 P-FILIALE Karlsruhe Karlsruhe Heidelberg Mannheim P-NR 770114 770231 P-FILIALE Heidelberg Mannheim P-LEITER 3115 3115 1324 2814 Bemerkungen: - "like", nicht "=", nach "=" steht ein Wert, z.B. "=‘Heidelberg’" - Groß/Kleinschreibung beachten - Anderes Beispiel: Telefonnummer in Telefonliste 01.10.2007 AIFB SQL - Structured Query Language 5.3.2 Abfragen mit Bedingungen (″σ″)(6/9) 21 Der Unterstrich "_" im Suchstring steht für genau 1 beliebiges Zeichen. 6. „Nummer und Name aller Angestellten, deren Namen mit ‘Me’ beginnen, mit ‘er’ aufhören und dazwischen nur einen einzelnen Buchstaben beinhalten.“ SELECT FROM WHERE angestellte ANG-NR 3115 3207 2814 3190 2314 1324 1435 2412 2244 1237 3425 2454 ANG-NR, NAME angestellte NAME LIKE ‘Me_er’; NAME Meyer Müller Klein Maus Groß Schmitt Mayerlein Müller Schulz Krämer Meier Schuster Ergebnis: WOHNORT Karlsruhe Mannheim Mannheim Karlsruhe Karlsruhe Heidelberg Bruchsal Karlsruhe Bruchsal Ludwigshafen Pforzheim Worms ANG-NR 3115 3425 NAME Meyer Meier ABT-NR 35 30 32 30 35 35 32 32 31 31 30 31 01.10.2007 AIFB SQL - Structured Query Language 5.3.2 Abfragen mit Bedingungen (″σ″)(7/9) 22 Kombination von „_“ und „%“ 7. „Alle Angestellten-Namen, deren Anfang wie ‘Maier’ klingt.“ SELECT FROM WHERE angestellte ANG-NR 3115 3207 2814 3190 2314 1324 1435 2412 2244 1237 3425 2454 NAME angestellte NAME LIKE ‘M_ _er%’; NAME Meyer Müller Klein Maus Groß Schmitt Mayerlein Müller Schulz Krämer Meier Schuster Ergebnis: WOHNORT Karlsruhe Mannheim Mannheim Karlsruhe Karlsruhe Heidelberg Bruchsal Karlsruhe Bruchsal Ludwigshafen Pforzheim Worms NAME Meyer Meyerlein Meier ABT-NR 35 30 32 30 35 35 32 32 31 31 30 31 01.10.2007 AIFB SQL - Structured Query Language 5.3.2 Abfragen mit Bedingungen (″σ″)(8/9) 23 Retrieval mit Sortierung auf / absteigend ([ASC] / DESC) nach Wert einer Spalte oder mehrerer Spalten (zusammengesetztes Sortierkriterium, ASC - DESC beliebig mischbar) 8. „Nummer und Name aller Angestellten, die zur Abteilung 30 gehören, aufsteigend sortiert nach Nummer und Name.“ SELECT FROM WHERE ORDER BY ANG-NR 3115 3207 2814 3190 2314 1324 1435 2412 2244 1237 3425 2454 ANG-NR, NAME, angestellte ABT-NR=30 ANG-NR, NAME ASC; NAME WOHNORT ABT-NR Meyer Karlsruhe 35 Müller Mannheim 30 Klein Mannheim 32 Maus Karlsruhe 30 Groß Karlsruhe 35 Schmitt Heidelberg 35 Mayerlein Bruchsal 32 Müller Karlsruhe 32 Schulz Bruchsal 31 Krämer Ludwigshafen 31 Meier Pforzheim 30 Schuster Worms 31 Unsortiert: ANG-NR 3207 3190 3425 Ergebnis: NAME Müller Maus Meier WOHNORT ABT-NR Mannheim 30 Karlsruhe 30 Pforzheim 30 ANG-NR 3190 3207 3425 NAME Maus Müller Meier 01.10.2007 AIFB SQL - Structured Query Language 5.3.2 Abfragen mit Bedingungen (″σ″)(9/9) 24 (1/6) Auswahl von allen Zeilen 9. „Name aller Projekte“ SELECT FROM P-NAME projekt; Ergebnis: projekt P-NAME P-1 P-2 P-3 P-4 P-NR 761235 770008 770114 770231 P-FILIALE Karlsruhe Karlsruhe Heidelberg Mannheim P-LEITER 3115 3115 1324 2814 01.10.2007 AIFB SQL - Structured Query Language 5.3.3 Spezielle Abfragen an eine Relation 25 (2/6) Auswahl von allen Spalten 10. „alle Projekte in Karlsruhe“ SELECT FROM WHERE ∗ projekt P-FILIALE=‘Karlsruhe‘; Ergebnis: projekt P-NAME P-1 P-2 P-3 P-4 P-NR 761235 770008 770114 770231 P-FILIALE Karlsruhe Karlsruhe Heidelberg Mannheim P-LEITER 3115 3115 1324 2814 01.10.2007 AIFB SQL - Structured Query Language 5.3.3 Spezielle Abfragen an eine Relation 26 (3/6) Keine Auswahl von Spalten und von Zeilen (Gesamte Relation ausgeben) 11. „Alle Daten der Relation angestellte“ SELECT FROM ∗ angestellte; Ergebnis: vollständige Kopie von angestellte angestellte ANG-NR 3115 3207 2814 3190 2314 1324 1435 2412 2244 1237 3425 2454 NAME Meyer Müller Klein Maus Groß Schmitt Mayerlein Müller Schulz Krämer Meier Schuster WOHNORT Karlsruhe Mannheim Mannheim Karlsruhe Karlsruhe Heidelberg Bruchsal Karlsruhe Bruchsal Ludwigshafen Pforzheim Worms ABT-NR 35 30 32 30 35 35 32 32 31 31 30 31 01.10.2007 AIFB SQL - Structured Query Language 5.3.3 Spezielle Abfragen an eine Relation 27 (4/6) Elimination von Duplikaten: 12. „Die Orte aller P-Filialen ohne Duplikate“ SELECT FROM DISTINCT P-FILIALE projekt; Ergebnis: eine einzelne Spalte ohne Duplikation. P-FILIALE Karlsruhe Heidelberg Mannheim projekt P-NAME P-1 P-2 P-3 P-4 P-NR 761235 770008 770114 770231 P-FILIALE Karlsruhe Karlsruhe Heidelberg Mannheim P-LEITER 3115 3115 1324 2814 01.10.2007 AIFB SQL - Structured Query Language 5.3.3 Spezielle Abfragen an eine Relation 28 (5/6) Rechnen mit Attributwerten 13. „(Zusammengehörige) Projekt- und Angestelltennummern mit relativer Arbeitszeit“ SELECT FROM P-NR, ANG-NR, PROZ-ARBZEIT ∗ 0.01 ang-pro; Ergebnis: ang-pro P-NR 761235 761235 761235 761235 761235 770008 ... ANG-NR 3207 3115 3190 1435 3425 2244 ... PROZ-ARBZEIT PROZ-ARBZEIT ∗0.01 1.00 100 0.50 50 0.50 50 40 0.40 0.50 50 0.20 20 ... 01.10.2007 AIFB SQL - Structured Query Language 5.3.3 Spezielle Abfragen an eine Relation 29 (6/6) Integration von Konstanten in die Antwort 14. „(Zusammengehörige) Projekt- und Angestelltennummern mit relativer Arbeitszeit; vor der Arbeitszeit soll stehen: Anteil =.“ SELECT FROM P-NR, ANG-NR,‘Anteil=‘, PROZ-ARBZEIT/100 ang-pro; Ergebnis: ang-pro P-NR P-NR 761235 761235 761235 761235 761235 761235 761235 761235 761235 761235 770008 770008 ... ... ANG-NR ANG-NR 3207 3207 3115 3115 3190 3190 1435 1435 3425 3425 2244 2244 ... ... Anteil = Anteil = Anteil = Anteil = Anteil = Anteil = Anteil = ... PROZ-ARBZEIT/100 PROZ-ARBZEIT PROZ-ARBZEIT 100 1.00 100 500.50 50 500.50 50 40 0.40 40 50 0.50 50 20 20 ...0.20 ... 01.10.2007 AIFB SQL - Structured Query Language 5.3.3 Spezielle Abfragen an eine Relation 30 Funktion COUNT SUM AVG MAX MIN Bedeutung Anzahl der Werte in Spalte (Name) bzw. Tabelle (*) Summe der Werte in Spalte Durchschnitt der Werte in Spalte Größter Wert in Spalte Kleinster Wert in Spalte 15. Funktion, auf Tabelle bezogen „Anzahl aller Angestellten“ SELECT FROM COUNT(*) angestellte; 12 Ergebnis: 12 Ohne Duplikation: SELECT COUNT(DISTINCT NAME) FROM angestellte; Ergebnis: 11 ANG-NR NAME WOHNORT ABT-NR Meyer Karlsruhe 35 3115 Müller Mannheim 30 3207 Klein Mannheim 32 2814 Maus Karlsruhe 30 3190 Groß Karlsruhe 35 2314 Schmitt Heidelberg 35 1324 11 32 1435 Mayerlein Bruchsal Müller Karlsruhe 32 2412 Schulz Bruchsal 31 2244 Krämer Ludwigshafen 31 1237 Meier Pforzheim 30 3425 Schuster Worms 31 2454 01.10.2007 AIFB SQL - Structured Query Language 5.3.4 Aggregatfunktionen (COUNT, SUM, ...) (1/4) 31 16. Funktion, auf Spalte bezogen „Höchster vorkommender Arbeitszeitanteil“ SELECT FROM ang-pro P-NR 761235 761235 761235 761235 761235 770008 770008 770008 770008 770114 770114 770114 770114 770114 770114 770231 770231 770231 770231 770231 MAX(PROZ-ARBZEIT) AS PROZ-ARBEIT-MAX ang-pro; ANG-NR 3207 3115 3190 1435 3425 2244 1237 2814 2454 2814 1435 1237 2454 3425 2412 3190 2314 2244 3115 1324 PROZ-ARBZEIT 100 50 50 40 50 20 40 70 40 30 60 60 60 50 100 50 100 80 50 100 Qualifikation Qualifikationmit mitAliasnamen Aliasnamen Bemerkung: Bemerkung:Das DasSchlüsselwort Schlüsselwort AS ASbei beider derEinführung Einführungvon von Aliasnamen ist optional. Aliasnamen ist optional. Ergebnis: PROZ-ARBZEIT-MAX 100 01.10.2007 AIFB SQL - Structured Query Language 5.3.4 Aggregatfunktionen (COUNT, SUM, ...) (2/4) 32 17. Funktion, auf Spalte bezogen, mit zusätzlicher Selektion „Höchster Arbeitszeitanteil am Projekt Nr. 761235“ MAX(PROZ-ARBZEIT) AS PROZ-ARBEIT-MAX-761235 SELECT ang-pro FROM P-NR = 761235; WHERE ang-pro P-NR 761235 761235 761235 761235 761235 770008 770008 770008 770008 770114 770114 770114 770114 770114 770114 770231 770231 770231 770231 770231 ANG-NR 3207 3115 3190 1435 3425 2244 1237 2814 2454 2814 1435 1237 2454 3425 2412 3190 2314 2244 3115 1324 PROZ-ARBZEIT 100 50 50 40 50 20 40 70 40 30 60 60 60 50 100 50 100 80 50 100 Ergebnis: PROZ-ARBZEIT-MAX-761235 100 01.10.2007 AIFB SQL - Structured Query Language 5.3.4 Aggregatfunktionen (COUNT, SUM, ...) (3/4) 33 18. Funktion, auf Spalte bezogen, mit zusätzlicher Selektion „Gesamtarbeitsanteil von Projekt Nr. 770008“ SELECT FROM WHERE ang-pro P-NR 761235 761235 761235 761235 761235 770008 770008 770008 770008 770114 770114 770114 770114 770114 770114 770231 770231 770231 770231 770231 SUM (PROZ-ARBZEIT) AS PROZ-ARBEIT-SUM-770008 ang-pro P-NR = 770008; ANG-NR 3207 3115 3190 1435 3425 2244 1237 2814 2454 2814 1435 1237 2454 3425 2412 3190 2314 2244 3115 1324 PROZ-ARBZEIT 100 50 50 40 50 20 40 70 40 30 60 60 60 50 100 50 100 80 50 100 Ergebnis: PROZ-ARBZEIT-SUM-770008 170 170 01.10.2007 AIFB SQL - Structured Query Language 5.3.4 Aggregatfunktionen (COUNT, SUM, ...) (4/4) 34 (1/3) Zusammenfassung von Zeilen • mit demselben Wert in einer oder mehreren vorgegebenen Spalten • zum Zweck der Anwendung einer Standardfunktion auf diese Gruppe o.ä. 19. „Gib den Gesamtarbeitszeitanteil jedes Projekts an. P-NR, SUM(PROZ-ARBZEIT) AS PROZ-ARBEIT-PROJEKT SELECT P-NR ANG-NR PROZ-ARBZEIT ang-pro FROM 770008 1237 40 761235 3207 100 770114 1237 60 GROUP BY P-NR; 761235 3115 50 Gruppe 761235 Ergebnis: P-NR 761235 770008 770114 770231 Gruppe 770008 PROZ-ARBZEITPROJEKT 290 170 360 380 Gruppe 770114 Gruppe 770231 770231 761235 770114 761235 761235 770231 770008 770008 770231 770008 770114 770008 770008 770114 770114 770008 770114 770114 770231 770114 761235 770114 770231 761235 770231 761235 770231 770114 770231 761235 770231 1324 3190 1435 1435 3425 2244 2244 1237 2314 2814 2412 2454 2454 2814 2454 1435 2814 1237 2814 2454 3115 3425 3115 2412 3190 3190 2314 3207 2244 3425 3115 3425 1324 100 50 60 40 40 50 80 20 20 40 100 70 100 40 40 30 60 70 60 30 60 50 50 100 50 50 100 100 80 50 50 100 SUM 290 SUM 170 SUM 360 SUM 380 01.10.2007 AIFB SQL - Structured Query Language 5.3.5 Bildung von Gruppen (GROUP BY) 35 (2/3) Auswahl von Gruppen mit HAVING-Bedingung: (WHERE für Auswahl einzelner Zeilen) 20. „Gib die Projekte an, in denen der maximale Arbeitszeitanteil 100% erreicht.“ SELECT FROM P-NR ang-pro GROUP BY P-NR HAVING MAX(PROZ-ARBZEIT) =100; Gruppe 761235 Gruppe 770008 Ergebnis: P-NR 761235 770114 770231 Gruppe 770114 Gruppe 770231 P-NR 761235 761235 761235 761235 761235 770008 770008 770008 770008 770114 770114 770114 770114 770114 770114 770231 770231 770231 770231 770231 ANG-NR 3207 3115 3190 1435 3425 2244 1237 2814 2454 2814 1435 1237 2454 3425 2412 3190 2314 2244 3115 1324 PROZ-ARBZEIT 100 50 50 40 50 20 40 70 40 30 60 60 60 50 100 50 100 80 50 100 MAX 100 MAX 70 MAX 100 MAX 100 01.10.2007 AIFB SQL - Structured Query Language 5.3.5 Bildung von Gruppen (GROUP BY) 36 (3/3) 21. „Gib alle Projekte an, an denen mind. 5 Angestellte beteiligt sind.“ P-NR SELECT FROM ang-pro GROUP BY P-NR HAVING COUNT (DISTINCT ANG-NR)>=5; Ergebnis: P-NR 761235 770114 770231 Gruppe 761235 Gruppe 770008 Gruppe 770114 Gruppe 770231 P-NR 761235 761235 761235 761235 761235 770008 770008 770008 770008 770114 770114 770114 770114 770114 770114 770231 770231 770231 770231 770231 ANG-NR 3207 3115 3190 1435 3425 2244 1237 2814 2454 2814 1435 1237 2454 3425 2412 3190 2314 2244 3115 1324 PROZ-ARBZEIT 100 50 COUNT 50 540 50 20 40 COUNT 4 70 40 30 60 60 COUNT 6 60 50 100 50 100 COUNT 80 5 50 100 01.10.2007 AIFB SQL - Structured Query Language 5.3.5 Bildung von Gruppen (GROUP BY) 37 (1/3) Abfragen mit Join („Natural Join“) 22. „Alle Projekte mit den Informationen der zugehörigen Angestellten.“ P-NR, a.ANG-NR, NAME, WOHNORT, ABT-NR, SELECT PROZ-ARBZEIT angestellte a, ang-pro ap FROM Qualifikation Qualifikationmit mitAliasnamen Aliasnamen a.ANG-NR=ap.ANG-NR; WHERE Animation und Ergebnis dieses Beispiels (siehe Seite 68) Animation vom Projekt Vikar Kartesisches Produkt „Natural Join“ Join mit Joinbedingung 23. „Alle Projekt-Nummern mit den Namen derjenigen Angestellten, die zu 50% mitarbeiten.“ SELECT FROM WHERE P-NR, NAME angestellte a, ang-pro ap a.ANG-NR=ap.ANG-NR AND PROZ-ARBZEIT=50; Animation und Ergebnis dieses Beispiels (siehe Seite 69) 01.10.2007 AIFB SQL - Structured Query Language 5.3.6 Verknüpfung von Relationen (Join) 38 (2/3) Abfragen mit Join (Spezialfall der Joinbedingung: θ-Join) 24. „Gib für jedes Projekt die Projektnummer und die Namen aller Angestellten an, die dort nicht Projektleiter sind.“ (Angestellter muß nicht an Projekt mitarbeiten) SELECT P-NR, NAME angestellte, projekt FROM WHERE ANG-NR <> P-LEITER; Animation und Ergebnis dieses Beispiels (siehe Seite 70) Join mit 3 Relationen 25. „Gib für jeden Angestellten seinen Namen, sowie die Projekt-Filialen der Projekte an, an denen er mitarbeitet.“ SELECT NAME, P-FILIALE angestellte a, ang-pro ap, projekt p FROM WHERE a.ANG-NR=ap.ANG-NR AND ap.P-NR=p.P-NR; Animation und Ergebnis dieses Beispiels (siehe Seite 71) 01.10.2007 AIFB SQL - Structured Query Language 5.3.6 Verknüpfung von Relationen (Join) 39 (3/3) Join mit derselben Relation Verwendung von Alias-Namen & Qualifikation 26. „Suche Paare von (unterschiedlichen) Angestellten(Ang-Nr), die in der selben Stadt wohnen.“ (Das Ergebnis sollte keine redundanten Angaben enthalten) SELECT FROM WHERE ANG-NR 3115 3207 2814 a ANG-NR 3115 3115 3115 3207 3207 3207 2814 2814 2814 a.ANG-NR A-NR, b.ANG-NR B-NR angestellte a, angestellte b a.WOHNORT=b.WOHNORT AND a.ANG-NR < b.ANG-NR; NAME Meyer Müller Klein NAME Meyer Meyer Meyer Müller Müller Müller Klein Klein Klein WOHNORT Karlsruhe Mannheim Mannheim ABT-NR 35 30 32 (kartesisches Produkt) b WOHNORT ABT-NR ANG-NR Karlsruhe 35 3115 Karlsruhe 35 3207 Karlsruhe 35 2814 Mannheim 30 3115 Mannheim 30 3207 Mannheim 30 2814 Mannheim 32 3115 Mannheim 32 3207 Mannheim 32 2814 NAME Meyer Müller Klein Meyer Müller Klein Meyer Müller Klein ANG-NR 3115 3207 2814 NAME Meyer Müller Klein WOHNORT ABT-NR Karlsruhe 35 Mannheim 30 Mannheim 32 Karlsruhe 35 Mannheim 30 Mannheim 32 Karlsruhe 35 Mannheim 30 Mannheim 32 WOHNORT Karlsruhe Mannheim Mannheim ABT-NR 35 30 32 Ergebnis: Ergebnis: A-NR 2814 B-NR 3207 01.10.2007 AIFB SQL - Structured Query Language 5.3.6 Verknüpfung von Relationen (Join) 40 (1/9) Ab SQL-92 gibt es explizite Join-Operationen. Es können sowohl durch SELECT-Abfragen abgeleitete Tabellen in der Form: (SELECT … FROM … WHERE …) join-op (SELECT … FROM … WHERE …) [join-spec]; als auch Basis-Tabellen bzw. Views in der Form: SELECT … FROM table join-op table [join-spec] WHERE … miteinander verbunden werden. Syntax einer Join-Operation: join-op := CROSS JOIN | [NATURAL] [INNER] JOIN | [NATURAL] {LEFT | RIGHT | FULL} [OUTER] JOIN | UNION JOIN 01.10.2007 AIFB SQL - Structured Query Language 5.3.7 Join-Operationen ab SQL-92 41 (2/9) Kartesisches Produkt: table1 CROSS JOIN table2 berechnet das Kartesische Produkt und entspricht SELECT * FROM table1, table2 Natural Join: Die Verwendung des Schlüsselworts NATURAL führt zur Berechnung des Natural Join. Wenn nicht alle gemeinsamen Attribute verschmolzen werden sollen, kann mit join-spec := USING (column-list) auf die angegebenen Attribute eingeschränkt werden. In diesem Fall darf das Schlüsselwort NATURAL nicht angegeben werden. 01.10.2007 AIFB SQL - Structured Query Language 5.3.7 Join-Operationen ab SQL-92 42 (3/9) Join mit Joinbedingung: Ein Join mit Joinbedingung wird mit INNER JOIN (oder nur JOIN) durchgeführt, wobei die Join-Bedingung mit join-spec := ON search condition angegeben wird (search condition entspricht der Bedingung, die nach WHERE in einer SELECT-Abfrage angegeben werden kann). Beim Join mit Joinbedingung kommt es zu keiner Verschmelzung gemeinsamer Attribute (wie bei der gleichnamigen Operation der relationalen Algebra). Outer-Join: Sämtliche Variationen des Outer-Join (FULL, LEFT, RIGHT) können formuliert werden. Dabei kann entweder ein – Natural-Join (NATURAL, wenn opt. USING-Klausel, muss Schlüsselwort NATURAL weggelassen werden) oder ein – Join mit Joinbedingung (ON-Klausel) durchgeführt werden. Das Schlüsselwort OUTER ist optional, sollte aber aus Gründen der Leserlichkeit benutzt werden. 01.10.2007 AIFB SQL - Structured Query Language 5.3.7 Join-Operationen ab SQL-92 43 (4/9) Union-Join: Der Union-Join kann mit Hilfe des Schlüsselworts UNION JOIN durchgeführt werden. Damit kann man Tabellen vereinigen, die gar nicht vereinigungskompatibel sind. Die privaten Attribute der jeweils anderen Tabelle werden ergänzt und mit NULL-Werten ausgefüllt. Bemerkung: Die expliziten Join-Operationen können zwar auch mit früheren SQLVersionen formuliert werden, allerdings z.T. nur sehr umständlich. Die neuen Schlüsselwörter dienen der verbesserten Lesbarkeit; insbesondere die WHERE-Klausel wird dadurch entlastet. 01.10.2007 AIFB SQL - Structured Query Language 5.3.7 Join-Operationen ab SQL-92 44 (5/9) Beispiel 5-3 (Umformulierung der Bsp. 22-26) 27. (Beispiel 22, S.41, „Natural Join“) „Alle Projektmitarbeiter mit den zugehörigen Angestellteninfos.“ SELECT P-NR, a.ANG-NR, NAME, WOHNORT, ABT-NR, PROZ-ARBZEIT FROM angestellte a, ang-pro ap WHERE a.ANG-NR=ap.ANG-NR; Ab SQL-92: SELECT * FROM angestellte NATURAL JOIN ang-pro; 01.10.2007 AIFB SQL - Structured Query Language 5.3.7 Join-Operationen ab SQL-92 45 (6/9) Beispiel 5-3 (Umformulierung der Bsp. 22-26) 28. (Beispiel 23, S.41, Join mit Joinbedingung) „Alle Projekt-Nummern mit den Namen derjenigen Angestellten, die zu 50% mitarbeiten.“ SELECT P-NR, NAME FROM angestellte a, ang-pro ap WHERE a.ANG-NR=ap.ANG-NR AND PROZ-ARBZEIT=50; Ab SQL-92: SELECT P-NR, NAME FROM angestellte NATURAL JOIN ang-pro WHERE PROZ-ARBZEIT = 50; oder SELECT P-NR, NAME FROM angestellte INNER JOIN ang-pro ON (angestellte.ANG-NR=ang-pro.ANG-NR AND PROZ-ARBZEIT=50); 01.10.2007 AIFB SQL - Structured Query Language 5.3.7 Join-Operationen ab SQL-92 46 (7/9) Beispiel 5-3 (Umformulierung der Bsp. 22-26) 29. (Beispiel 24, S.42, Spezialfall der Joinbedingung: θ-Join) „Gib für jedes Projekt die Projektnummer und die Namen aller Angestellten an, die dort nicht Projektleiter sind.“ (Angestellter muß nicht an Projekt mitarbeiten) SELECT P-NR, NAME FROM angestellte, projekt WHERE ANG-NR <> P-LEITER; Ab SQL-92: SELECT P-NR, NAME FROM angestellte JOIN projekt ON (ANG-NR <> P-LEITER); 01.10.2007 AIFB SQL - Structured Query Language 5.3.7 Join-Operationen ab SQL-92 47 (8/9) Beispiel 5-3 (Umformulierung der Bsp. 22-26) 30. (Beispiel 25, S.42, Join mit 3 Relationen) „Gib für jeden Angestellten seinen Namen, sowie die Projekt-Filialen der Projekte an, an denen er mitarbeitet.“ SELECT NAME, P-FILIALE FROM angestellte a, ang-pro ap, projekt p WHERE a.ANG-NR=ap.ANG-NR AND ap.P-NR=p.P-NR; Ab SQL-92: SELECT NAME, P-FILIALE FROM angestellte NATURAL JOIN ang-pro NATURAL JOIN projekt; 01.10.2007 AIFB SQL - Structured Query Language 5.3.7 Join-Operationen ab SQL-92 48 (9/9) Beispiel 5-3 (Umformulierung der Bsp. 22-26) 31. (Beispiel 26, S.43, Join mit derselben Relation) „Suche Paare von (unterschiedlichen) Angestellten, die in der selben Stadt wohnen.“ (Das Ergebnis sollte keine redundanten Angaben enthalten) SELECT a.ANG-NR A-NR, b.ANG-NR B-NR FROM angestellte a, angestellte b WHERE a.WOHNORT=b.WOHNORT AND a.ANG-NR<b.ANG-NR; Ab SQL-92 SELECT a.ANG-NR, b.ANG-NR FROM (angestellte a) JOIN (angestellte b) USING (WOHNORT) WHERE a.ANG-NR < b.ANG-NR; 01.10.2007 AIFB SQL - Structured Query Language 5.3.7 Join-Operationen ab SQL-92 49 (1/7) Dabei handelt es sich um geschachtelte Queries. 32. „Namen aller Angestellten, die mit 100 % ihrer Arbeitszeit an einem Projekt mitarbeiten.“ 1. Schritt: Bestimme aus ang-pro alle ANG-NR, die zu PROZ-ARBZEIT=100 gehören (Query a) ANG-NR SELECT ang-pro FROM PROZ-ARBZEIT=100; WHERE ang-pro P-NR 761235 761235 761235 761235 761235 770008 770008 770008 770008 770114 770114 770114 770114 770114 770114 770231 770231 770231 770231 770231 ANG-NR 3207 3115 3190 1435 3425 2244 1237 2814 2454 2814 1435 1237 2454 3425 2412 3190 2314 2244 3115 1324 (#=m) PROZ-ARBZEIT 100 50 50 40 50 20 40 70 40 30 60 60 60 50 100 50 100 80 50 100 Ergebnis: ANG-NR 3207 2412 2314 1324 01.10.2007 AIFB SQL - Structured Query Language 5.3.8 Verknüpfung von Relationen mit Subqueries 50 (2/7) 2. Schritt: Wähle in angestellte alle Tupel aus, deren ANG-NR in der oben gegebenen Ergebnismenge liegt: (Query b) SELECT FROM WHERE NAME angestellte ANG-NR IN (3207, 2412, 2314,1324); angestellte (#=n) ANG-NR NAME WOHNORT ABT-NR Meyer Karlsruhe 35 3115 Müller Mannheim 30 3207 Klein Mannheim 32 2814 Maus Karlsruhe 30 3190 Groß Karlsruhe 35 2314 Schmitt Heidelberg 35 1324 32 1435 Mayerlein Bruchsal Müller Karlsruhe 32 2412 Schulz Bruchsal 31 2244 Krämer Ludwigshafen 31 1237 Meier Pforzheim 30 3425 Schuster Worms 31 2454 Ergebnis: NAME Müller Groß Schmitt Müller 01.10.2007 AIFB SQL - Structured Query Language 5.3.8 Verknüpfung von Relationen mit Subqueries 51 (3/7) Zusammenfassung zu geschachtelter Query: {äußere Query b} SELECT NAME FROM angestellte WHERE ANG-NR IN {Subquery a} (SELECT ANG-NR FROM ang-pro WHERE PROZ-ARBZEIT = 100); Vorgehensweise des Systems: a) Abarbeitung Subquery (a) b) Übergabe Ergebnis an übergeordnete (äußere) Query (b) c) Abarbeitung Query b mit dem übergebenen Ergebnis 01.10.2007 AIFB SQL - Structured Query Language 5.3.8 Verknüpfung von Relationen mit Subqueries 52 (4/7) 33. Äquivalente Abfrage mit Join: SELECT NAME FROM angestellte, ang-pro WHERE PROZ-ARBZEIT = 100 AND ang-pro.ANG-NR = angestellte.ANG-NR; Ergebnis von 32. SELECT NAME FROM angestellte WHERE ANG-NR IN (SELECT ANG-NR FROM ang-pro WHERE PROZ-ARBZEIT = 100); Vergleich 32. mit 33.: (vereinfachte Betrachtung!) Man betrachte Anzahl der notwendigen DB-Zugriffe! bei 32.: n+m bei 33.: n∗m 01.10.2007 AIFB SQL - Structured Query Language 5.3.8 Verknüpfung von Relationen mit Subqueries 53 (5/7) Mehrfach geschachtelte Queries 34. „Namen aller Angestellten, die an mindestens einem Projekt in Karlsruhe mitarbeiten.“ Vorgehensweise: a) in projekt: Auswahl P-NR der Projekte in Karlsruhe b) in ang-pro: Auswahl ANG-NR, deren P-NR in der obigen Ergebnismenge liegen c) in angestellte: Auswahl NAMEn, deren ANG-NR in der o.E. liegen c) SELECT NAME FROM angestellte WHERE ANG-NR IN b) (SELECT ANG-NR FROM ang-pro WHERE P-NR IN a) (SELECT P-NR FROM projekt WHERE P-FILIALE =‘Karlsruhe‘)); Animation und Ergebnis dieses Beispiels (siehe Seite 72) 01.10.2007 AIFB SQL - Structured Query Language 5.3.8 Verknüpfung von Relationen mit Subqueries 54 (6/7) 35. Äquivalente Formulierung mit 2-fach Join: SELECT a.NAME FROM angestellte a, ang-pro ap, projekt p WHERE a.ANG-NR = ap.ANG-NR AND ap.P-NR=p.P-NR AND p.P-FILIALE=‘Karlsruhe‘; 01.10.2007 AIFB SQL - Structured Query Language 5.3.8 Verknüpfung von Relationen mit Subqueries 55 (7/7) „Correlated subquery“: Die Subquery ist durch eine „äußere Referenz“ von der umgebenden äußeren Query abhängig. : Gib alle Orte an, an denen mehr als ein Projekt angesiedelt ist.“ 36. (b) SELECT DISTINCT P-FILIALE FROM projekt a WHERE 1 < (a) (SELECT COUNT (*) FROM projekt b WHERE b.P-FILIALE = a.P-FILIALE ); Jetzt kann Subquery (a) nicht vorab ausgewertet werden, da sie durch äußere Referenz von umgebender Query (b) abhängig ist. Animation und Ergebnis dieses Beispiels (siehe Seite 73) 01.10.2007 AIFB SQL - Structured Query Language 5.3.8 Verknüpfung von Relationen mit Subqueries 56 Sei q Ergebnis(menge) einer Subquery; q leer? EXISTS q NOT EXISTS q q=∅ falsch wahr q≠∅ wahr falsch 37. „Suche Namen aller Angestellten, die keine Projektleiter sind.“ SELECT NAME FROM angestellte WHERE NOT EXISTS (SELECT P-LEITER FROM projekt WHERE P-LEITER = ANG-NR); Alternative möglich? Animation und Ergebnis dieses Beispiels (siehe Seite 74) 01.10.2007 AIFB SQL - Structured Query Language 5.3.9 Abfragen mit Existenz-Quantor 57 (1/3) Verknüpfung von Abfragen mit Mengenoperationen: Ergebnismengen müssen „vereinigungskompatibel“ sein (Namen und Wertebereiche korrespondierender Spalten müssen übereinstimmen). Operationen: {UNION | INTERSECT | EXCEPT} [ALL] Wird ALL verwendet, dann arbeiten die Operationen mit „uneigentlichen Tabellen“, sonst mit „eigentlichen Tabellen“ (keine Duplikate). 38. „Nummern aller Angestellten, die in Karlsruhe wohnen oder dort Leiter eines Projektes sind“ SELECT ANG-NR FROM angestellte WHERE WOHNORT = ‘Karlsruhe‘ UNION SELECT P-LEITER as ANG-NR FROM projekt WHERE P-FILIALE = ‘Karlsruhe‘; Animation und Ergebnis dieses Beispiels (siehe Seite 75) 01.10.2007 AIFB SQL - Structured Query Language 5.3.10 Mengenoperationen 58 (2/3) 39„Nummern aller Angestellten, die an mehr als einem Projekt arbeiten und in Karlsruhe wohnen.“ SELECT ANG-NR FROM angestellte WHERE WOHNORT = ‘Karlsruhe‘ INTERSECT SELECT ANG-NR FROM ang-pro GROUP BY ANG-NR HAVING COUNT (ANG-NR) > 1; Animation und Ergebnis dieses Beispiels (siehe Seite 76) 01.10.2007 AIFB SQL - Structured Query Language 5.3.10 Mengenoperationen 59 (3/3) 40. „Die Nummern aller Angestellten, deren Name mit ‘M‘ anfängt, die nicht Projektleiter sind.“ SELECT ANG-NR FROM angestellte WHERE NAME like ‘M%‘ EXCEPT SELECT P-LEITER as ANG-NR FROM projekt; Animation und Ergebnis dieses Beispiels (siehe Seite 77) 01.10.2007 AIFB SQL - Structured Query Language 5.3.10 Mengenoperationen 60 5.1 Allgemeines zu SQL ......................................................... 5 5.2 SQL-DLL: Definition eines Datenbankschemas ............... 8 5.3 SQL-DML: Abfragen in SQL (Query Language) .............. 15 5.4 SQL-DML: Mutationen in SQL (Insert, Update, Delete) ... 65 01.10.2007 AIFB SQL - Structured Query Language 5 SQL – Structured Query Language 61 UPDATE UPDATE table SET column = expression [, column = expression …] [WHERE search condition]; Beispiel: UPDATE projekt SET P-LEITER = 3207, P-FILIALE = ’Mannheim’ WHERE P-NR = 761235; DELETE DELETE FROM table [WHERE search condition]; Beispiel: DELETE FROM ang-pro WHERE ANG-NR = 3190; 01.10.2007 AIFB SQL - Structured Query Language 5.4 Die Mutationen (1|2) 62 INSERT INSERT INTO table [(column [, column …])] VALUES (constant [, constant …]); oder INSERT INTO table [(column [, column …])] query; Beispiel: INSERT INTO angestellte (ANG-NR, NAME, WOHNORT, ABT-NR) VALUES (1717, ’Häberle’,’Stuttgart’, 30); Annahme: Es existiert eine Tabelle ‘angestellte_in_ka‘ mit dem gleichen Aufbau wie ‘angestellte‘: INSERT INTO angestellte_in_ka SELECT * FROM angestellte WHERE WOHNORT = ‘Karlsruhe‘; 01.10.2007 AIFB SQL - Structured Query Language 5.4 Die Mutationen (2|2) 63 Beenden 01.10.2007 AIFB SQL - Structured Query Language ENDE 64 SELECT FROM WHERE P-NR, a.ANG-NR, NAME, WOHNORT, ABT-NR,PROZ-ARBZEIT angestellte a, ang-pro ap a.ANG-NR=ap.ANG-NR; ANG-NR NAME Meyer 3115 Klein 2814 Schmitt 1324 WOHNORT ABT-NR Karlsruhe 35 Mannheim 32 Heidelberg 35 kartesisches Produkt P-NR 761235 770008 770114 770231 770231 ANG-NR NAME WOHNORT ABT-NR P-NR ANG-NR PROZ-ARBZEIT 35 3115 Meyer Karlsruhe 761235 3115 50 Meyer Karlsruhe 35 3115 770008 2814 70 35 3115 Meyer Karlsruhe 770114 2814 30 35 3115 Meyer Karlsruhe 770231 3115 50 35 3115 Meyer Karlsruhe 770231 1324 100 Klein Mannheim 32 761235 3115 50 2814 Klein Mannheim 32 770008 2814 70 2814 Klein Mannheim 32 770114 2814 30 2814 Klein Mannheim 32 770231 3115 50 2814 Klein Mannheim 32 770231 1324 100 2814 35 761235 3115 50 1324 Schmitt Heidelberg Schmitt Heidelberg 35 770008 2814 70 1324 35 770114 2814 30 1324 Schmitt Heidelberg 35 770231 3115 50 1324 Schmitt Heidelberg 35 770231 1324 100 1324 Schmitt Heidelberg ANG-NR 3115 2814 2814 3115 1324 Ergebnis: Ergebnis: P-NR 761235 770231 770008 770114 770231 PROZ-ARBZEIT 50 70 30 50 100 01.10.2007 AIFB SQL - Structured Query Language Beispiel für „Natural Join“ ANGABT- PROZNAME WOHNORT NR NR ARBZEIT 3115 Meyer Karlsruhe 35 50 3115 Meyer Karlsruhe 35 50 2814 Klein Mannheim 32 70 2814 Klein Mannheim 32 30 1324 Schmitt Heidelberg 35 100 65 SELECT FROM WHERE P-NR, NAME angestellte a, ang-pro ap a.ANG-NR=ap.ANG-NR AND PROZ-ARBZEIT=50; ANG-NR NAME Meyer 3115 Klein 2814 Schmitt 1324 ANG-NR 3115 3115 3115 3115 3115 2814 2814 2814 2814 2814 1324 1324 1324 1324 1324 NAME Meyer Meyer Meyer Meyer Meyer Klein Klein Klein Klein Klein Schmitt Schmitt Schmitt Schmitt Schmitt WOHNORT Karlsruhe Mannheim Heidelberg ABT-NR 35 32 35 (kartesisches Produkt) WOHNORT ABT-NR P-NR ANG-NR Karlsruhe 35 761235 3115 Karlsruhe 35 770008 2814 Karlsruhe 35 770114 2814 Karlsruhe 35 770231 3115 Karlsruhe 35 770231 1324 Mannheim 32 761235 3115 Mannheim 32 770008 2814 Mannheim 32 770114 2814 Mannheim 32 770231 3115 Mannheim 32 770231 1324 Heidelberg 35 761235 3115 Heidelberg 35 770008 2814 Heidelberg 35 770114 2814 Heidelberg 35 770231 3115 Heidelberg 35 770231 1324 P-NR 761235 770008 770114 770231 770231 ANG-NR 3115 2814 2814 3115 1324 PROZ-ARBZEIT 50 70 30 50 100 50 70 30 50 100 50 70 30 50 100 PROZ-ARBZEIT 50 70 30 50 100 Ergebnis: Ergebnis: P-NR 761235 770231 NAME Meyer Meyer 01.10.2007 AIFB SQL - Structured Query Language Beispiel für Join mit Joinbedingung 66 SELECT FROM WHERE P-NR, NAME angestellte, projekt ANG-NR <> P-LEITER; ABT-NR 35 32 35 P-NR 761235 770008 770114 770231 NAME Meyer Klein Schmitt ANG-NR NAME WOHNORT ABT-NR P-NAME P-NR P-FILIALE P-LEITER Meyer Karlsruhe 35 p-1 761235 Karlsruhe 3115 Meyer Karlsruhe 35 p-2 770008 Karlsruhe 3115 Meyer Karlsruhe 35 p-3 770114 Heidelberg 1324 Meyer Karlsruhe 35 P-4 770231 Mannheim 2814 Klein Mannheim 32 p-1 761235 Karlsruhe 3115 Klein Mannheim 32 p-2 770008 Karlsruhe 3115 Klein Mannheim 32 p-3 770114 Heidelberg 1324 Klein Mannheim 32 P-4 770231 Mannheim 2814 Schmitt Heidelberg 35 p-1 761235 Karlsruhe 3115 Schmitt Heidelberg 35 p-2 770008 Karlsruhe 3115 Schmitt Heidelberg 35 p-3 770114 Heidelberg 1324 Schmitt Heidelberg 35 P-4 770231 Mannheim 2814 3115 3115 3115 3115 2814 2814 2814 2814 1324 1324 1324 1324 WOHNORT Karlsruhe Mannheim Heidelberg P-NAME P-1 P-2 P-3 P-4 ANG-NR 3115 2814 1324 (kartesisches Produkt) P-FILIALE P-LEITER Karlsruhe 3115 Karlsruhe 3115 Heidelberg 1324 Mannheim 2814 Ergebnis: Ergebnis: P-NR 770114 770231 761235 770008 770114 761235 770008 770231 NAME Meyer Meyer Klein Klein Klein Schmitt Schmitt Schmitt 01.10.2007 AIFB SQL - Structured Query Language Beispiel für Abfragen mit Join (Spezialfall der Joinbed.: θ -Join) 67 SELECT FROM WHERE ANG-NR 3115 2814 NAME Meyer Klein NAME, P-FILIALE angestellte a, ang-pro ap, projekt p a.ANG-NR=ap.ANG-NR AND ap.P-NR=p.P-NR; WOHNORT Karlsruhe Mannheim ANG-NR NAME WOHNORT 3115 3115 2814 2814 Meyer Meyer Klein Klein Karlsruhe Karlsruhe Mannheim Mannheim ANG-NR NAME WOHNORT 3115 3115 3115 3115 2814 2814 2814 2814 Meyer Meyer Meyer Meyer Klein Klein Klein Klein Karlsruhe Karlsruhe Karlsruhe Karlsruhe Mannheim Mannheim Mannheim Mannheim ABTNR 35 35 32 32 ABTNR 35 35 35 35 32 32 32 32 ABT-NR 35 32 (kartesisches Produkt) P-NR ANG-NR 761235 770008 761235 770008 3115 2814 3115 2814 P-NR ANG-NR 761235 761235 770008 770008 761235 761235 770008 770008 3115 3115 2814 2814 3115 3115 2814 2814 PROZARBZEIT 50 70 50 70 P-NR ANG-NR PROZ-ARBZEIT 761235 3115 50 770008 2814 70 (kartesische Produkt) PPPP-NR NAME FILIALE LEITER P-1 761235 Karlsruhe 3115 P-2 770008 Karlsruhe 3115 PROZPPPP-NR ARBZEIT NAME FILIALE LEITER 50 p-1 761235 Karlsruhe 3115 50 p-2 770008 Karlsruhe 3115 70 p-1 761235 Karlsruhe 3115 70 p-2 770008 Karlsruhe 3115 50 p-1 761235 Karlsruhe 3115 50 p-2 770008 Karlsruhe 3115 70 p-1 761235 Karlsruhe 3115 70 p-2 770008 Karlsruhe 3115 Ergebnis: Ergebnis: NAME P-FILIALE Meyer Karlsruhe Klein Karlsruhe 01.10.2007 AIFB SQL - Structured Query Language Beispiel für Join mit 3 Relationen 68 NAME SELECT NAME FROM angestellte WHERE ANG-NR IN (SELECT ANG-NR FROM ang-pro WHERE P-NR IN (SELECT P-NR FROM projekt WHERE P-FILIALE =‘Karlsruhe‘)); projekt P-NAME P-1 P-2 P-3 P-4 P-NR 761235 770008 770114 770231 angestellte ANG-NR 3115 3207 2814 3190 2314 1324 1435 2412 2244 1237 3425 2454 (#=k) P-FILIALE P-LEITER Karlsruhe 3115 Karlsruhe 3115 Heidelberg 1324 Mannheim 2814 NAME Meyer Müller Klein Maus Groß Schmitt Mayerlein Müller Schulz Krämer Meier Schuster WOHNORT Karlsruhe Mannheim Mannheim Karlsruhe Karlsruhe Heidelberg Bruchsal Karlsruhe Bruchsal Ludwigshafen Pforzheim Worms (#=n) ABT-NR 35 30 32 30 35 35 32 32 31 31 30 31 Meyer Müller Klein Maus Mayerlein Krämer Meier Schuster ang-pro P-NR 761235 761235 761235 761235 761235 770008 770008 770008 770008 770114 770114 770114 770114 770114 770114 770231 770231 770231 770231 770231 ANG-NR 3207 3115 3190 1435 3425 2244 1237 2814 2454 2814 1435 1237 2454 3425 2412 3190 2314 2244 3115 1324 (#=m) PROZ-ARBZEIT 100 50 50 40 50 20 40 70 40 30 60 60 60 50 100 50 100 80 50 100 01.10.2007 AIFB SQL - Structured Query Language Ergebnis: Ergebnis: Beispiel für Mehrfach geschachtelte Queries 69 SELECT DISTINCT P-FILIALE FROM projekt a WHERE 1 < (SELECT COUNT (*) FROM projekt b WHERE b.P-FILIALE = a.P-FILIALE); projekt a P-NAME P-1 P-2 P-3 P-4 P-NR 761235 770008 770114 770231 P-FILIALE P-LEITER Karlsruhe 3115 Karlsruhe 3115 Heidelberg 1324 Mannheim 2814 projekt b P-NAME P-NR P-1 761235 P-2 770008 P-3 770114 P-4 770231 Ergebnis: Ergebnis: P-FILIALE Kalrsruhe P-FILIALE P-LEITER Karlsruhe 3115 2 Karlsruhe 3115 Heidelberg 1324 1 Mannheim 2814 1 01.10.2007 AIFB SQL - Structured Query Language Beispiel für „Correlated subquery“ (äußere Referenz) 70 SELECT NAME FROM angestellte WHERE NOT EXISTS (SELECT P-LEITER FROM projekt WHERE P-LEITER = ANG-NR); projekt P-NAME P-1 P-2 P-3 P-4 P-NR 761235 770008 770114 770231 P-FILIALE P-LEITER Karlsruhe 3115 Karlsruhe 3115 Heidelberg 1324 Mannheim 2814 Ergebnis: Ergebnis: NAME Müller Maus Groß Mayerlein Müller Schulz Krämer Meier Schuster angestellte ANG-NR NAME Meyer 3115 Müller 3207 Klein 2814 Maus 3190 Groß 2314 Schmitt 1324 Mayerlein 1435 Müller 2412 Schulz 2244 Krämer 1237 Meier 3425 Schuster 2454 WOHNORT Karlsruhe Mannheim Mannheim Karlsruhe Karlsruhe Heidelberg Bruchsal Karlsruhe Bruchsal Ludwigshafen Pforzheim Worms ABT-NR 35 30 32 30 35 35 32 32 31 31 30 31 01.10.2007 AIFB SQL - Structured Query Language Beispiel für Abfragen mit Existenz-Quantor 71 SELECT ANG-NR FROM angestellte WHERE WOHNORT = ‘Karlsruhe‘ Ergebnis: Ergebnis: ANG-NR 3115 3190 2314 2412 3115 3115 UNION SELECT P-LEITER as ANG-NR FROM projekt WHERE P-FILIALE = ‘Karlsruhe‘; angestellte ANG-NR NAME Meyer 3115 Müller 3207 Klein 2814 Maus 3190 Groß 2314 Schmitt 1324 Mayerlein 1435 Müller 2412 Schulz 2244 Krämer 1237 Meier 3425 Schuster 2454 WOHNORT Karlsruhe Mannheim Mannheim Karlsruhe Karlsruhe Heidelberg Bruchsal Karlsruhe Bruchsal Ludwigshafen Pforzheim Worms ABT-NR 35 30 32 30 35 35 32 32 31 31 30 31 Zwischenergebnis: Zwischenergebnis: ANG-NR 3115 3190 2314 2412 projekt P-NAME P-1 P-2 P-3 P-4 Zwischenergebnis: Zwischenergebnis: ANG-NR 3115 3115 P-NR 761235 770008 770114 770231 P-FILIALE P-LEITER Karlsruhe 3115 Karlsruhe 3115 Heidelberg 1324 Mannheim 2814 01.10.2007 AIFB SQL - Structured Query Language Beispiel für Mengenoperationen (Union) 72 Ergebnis: Ergebnis: SELECT ANG-NR FROM angestellte WHERE WOHNORT = ‘Karlsruhe‘ INTERSECT ANG-NR 3115 3190 SELECT ANG-NR FROM ang-pro GROUP BY ANG-NR HAVING COUNT (ANG-NR) > 1; angestellte ANG-NR NAME Meyer 3115 Müller 3207 Klein 2814 Maus 3190 Groß 2314 Schmitt 1324 Mayerlein 1435 Müller 2412 Schulz 2244 Krämer 1237 Meier 3425 Schuster 2454 WOHNORT Karlsruhe Mannheim Mannheim Karlsruhe Karlsruhe Heidelberg Bruchsal Karlsruhe Bruchsal Ludwigshafen Pforzheim Worms ABT-NR 35 30 32 30 35 35 32 32 31 31 30 31 ZwischenZwischenergebnis: ergebnis: Zwischenergebnis: Zwischenergebnis: ANG-NR 2314 2412 3115 3190 ang-pro P-NR 761235 761235 761235 761235 761235 770008 ... ANG-NR 3207 3115 3190 1435 3425 2244 ... PROZ-ARBZEIT 100 50 50 40 50 20 ... ANG-NR 1237 1435 2244 2454 2814 3115 3190 3425 01.10.2007 AIFB SQL - Structured Query Language Beispiel für Mengenoperationen (INTERSECT) 73 SELECT ANG-NR FROM angestellte WHERE NAME like ‘M%‘ EXCEPT Ergebnis: Ergebnis: ANG-NR 3207 3190 1435 2412 3425 SELECT P-LEITER as ANG-NR FROM projekt; angestellte ANG-NR NAME Meyer 3115 Müller 3207 Klein 2814 Maus 3190 Groß 2314 Schmitt 1324 Mayerlein 1435 Müller 2412 Schulz 2244 Krämer 1237 Meier 3425 Schuster 2454 WOHNORT Karlsruhe Mannheim Mannheim Karlsruhe Karlsruhe Heidelberg Bruchsal Karlsruhe Bruchsal Ludwigshafen Pforzheim Worms ABT-NR 35 30 32 30 35 35 32 32 31 31 30 31 projekt P-NAME P-1 P-2 P-3 P-4 P-NR 761235 770008 770114 770231 P-FILIALE P-LEITER Karlsruhe 3115 Karlsruhe 3115 Heidelberg 1324 Mannheim 2814 01.10.2007 AIFB SQL - Structured Query Language Beispiel für Mengenoperationen (EXCEPT) 74