SQL – Structured Query Language LV Datenorientierte Systemanalyse, WS 2014/15 Dr. Walter Ebner, <[email protected]> Institut für Informationswirtschaft Wirtschaftsuniversität Wien SQL – Structured Query Language SQL-DDL: Definition eines Datenbankschemas SQL-Query Language : Abfragen in SQL SQL-DML: Mutationen in SQL (Insert, Update, Delete) Datenorientierte Systemanalyse – SQL Allgemeines zu SQL 5 Allgemeines zu SQL Entwicklungsziele: möglichst einfach für den Endbenutzer; möglichst deskriptiv, nicht prozedural Benennung: 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 relationalen DBS) Erste kommerzielle Implementierungen: Oracle: 1980 Datenorientierte Systemanalyse – SQL SQL: „structured query language" IBM: SQL/DS (1981), DB2 (1983) 6 Allgemeines zu SQL Standardisierung SQL-86 (1986): erster Standardisierungsversuch SQL-89 (1989): Lücken (z.B.: Fremdschlüssel) von SQL-86 z.T geschlossen; SQL-99 (1999): Weiterentwicklung mit objekt-orientierten Ansätzen; Trigger; Gliederung in Core-SQL (Sprachkern) und verschiedenen Packages, die aus Features bestehen. SQL-03 (2003): „Bug fixes“ und Konsolidierung von SQL-99, aber auch ein neuer Teil (SQL/XML) und neue Sprachelemente (MERGE-Anweisung, BIGINT-Typ, MULTISET-Typen, …). Weitere Standards 2006 (XML), 2008 (Instead of Trigger) und 2011 (derzeit aktuelle Version: SQL:2011 ISO/IEC 9075:2011) Sprachumfang: SQL deckt die Aspekte der DDL und der DML (Mutationen) und Query Language (Abfragen) ab. Datenorientierte Systemanalyse – SQL SQL-92 (1992): Umfassender Standard; drei Standardisierungslevels (entry, intermediate, full level); 7 Allgemeines zu SQL Schnittstellen: Terminologie: Table (Tabelle) – Relation Row (Zeile) – Tupel Column (Spalte) – 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. Datenorientierte Systemanalyse – SQL SQL kann sowohl interaktiv, als auch eingebettet in einer konventionellen Programmiersprache (z.B. C, FORTRAN, …) verwendet werden. 8 SQL – Structured Query Language Allgemeines zu SQL SQL-DDL: Definition eines Datenbankschemas Datentypen und benutzerdefinierte Domänen Ein Beispiel für ein Datenbankschema Definition von Sichten SQL-Query Language: Abfragen in SQL SQL-DML: Mutationen in SQL Datenorientierte Systemanalyse – SQL Definition von Basistabellen 9 Definition eines Datenbankschemas (SQL-DDL) Datenbank Benutzersichten : Menge von Basistabellen : Views Übersicht: SQL-DDL (vereinfacht) Bedeutung CREATE ALTER TABLE TABLE DROP CREATE DROP CREATE DROP TABLE VIEW VIEW DOMAIN DOMAIN 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. Datenorientierte Systemanalyse – SQL Anweisungen 10 Definition von Basistabellen 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“). 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)] Datenorientierte Systemanalyse – SQL SQL kennt nicht den benannten Relationstyp 11 Datentypen und benutzerdefinierte Domänen SQL bietet folgende (Basis-)Datentypen: (Auswahl) Datentyp Kurzform CHARACTER CHARACTER (n) CHARACTER VARYING (n) CHAR CHAR (n) ) VARCHAR (n) DECIMAL [(p,[,s])] NUMERIC [(p,[,s])] INTEGER SMALLINT DEC(p,s) DOUBLE PRECISION FLOAT (n) REAL DOUBLE INT BLOB CLOB (Oracle, DB2), TEXT (MySQL, PostgreSQL) XML Datenorientierte Systemanalyse – SQL Beschreibung Zeichen(ketten): Ein einzelnes Zeichen Kette fester Länge Kette variabler Länge Exakte Zahlen: mit Nachkommastellen dto. Ganzzahl kleine Ganzzahl Gleitkommazahlen: hohe Genauigkeit benutzerdefinierte Gen. geringere Genauigkeit Große-Datentypen:** Binary Large Object Character Large Object (sehr lange Zeichenketten) XML Dokumente *) n=integer, p, s ebenso. **) produktabhängig meinstens max. 2 GB 12 Datentypen und benutzerdefinierte Domänen Datentyp Kurzform DATE TIME TIMESTAMP INTERVAL f INTERVAL sf to ef f, sf, ef {YEAR, MONTH, DAY, HOUR, MINUTE, SECOND} („sf>ef“) 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); Datenorientierte Systemanalyse – SQL Beschreibung Zeit, Datum, Zeitintervall: Datum (y,m,d) Zeitpunkt (h,min,sec) Zeitpunkt (y,m,d,h, min, sec) Zeitintervall 13 Ein Beispiel für ein Datenbankschema CREATE TABLE (ANGNR NAME WOHNORT ABTNR angestellte INTEGER PRIMARY KEY, VARCHAR (30), VARCHAR (30), INTEGER); CREATE TABLE (PNR PNAME PFILIALE PLEITER projekt INTEGER PRIMARY KEY, VARCHAR (15), VARCHAR (30), INTEGER REFERENCES angestellte(ANGNR)); CREATE TABLE angpro (PNR INTEGER REFERENCES projekt (PNR), ANGNR INTEGER REFERENCES angestellte (ANGNR), PROZARBZEIT ProzentAngabe, PRIMARY KEY (PNR, ANGNR)). Datenorientierte Systemanalyse – SQL CREATE DOMAIN ProzentAngabe AS REAL CONSTRAINT ProzAngabeConstraint CHECK ( VALUE >= 0.0 AND VALUE <= 100.0); 14 Definition von Sichten Beispiel: CREATE VIEW angestellteAusKarlsruhe AS SELECT ANGNR, NAME, WOHNORT, ABTNR FROM angestellte WHERE WOHNORT = ‘Karlsruhe‘; Datenorientierte Systemanalyse – SQL CREATE VIEW table-name [(column-name [,column-name] …)] AS query expression 15 SQL – Structured Query Language Allgemeines zu SQL SQL-DDL: Definition eines Datenbankschemas SQL-Query Language: Abfragen in SQL Die Syntax der SELECT-Abfrage Abfragen mit Bedingungen Spezielle Abfragen an eine Relation Aggregatfunktionen (COUNT, SUM, …) Bildung von Gruppen (GROUP) Verknüpfung von Relationen (Join) mehrere Tabellen Join-Operationen ab SQL-92 Verknüpfung von Relationen mit Subqueries Abfragen mit Existenz-Quantor Mengenoperationen SQL-DML: Mutationen in SQL (Insert, Update, Delete) Datenorientierte Systemanalyse – SQL eine Tabelle 16 Abfragen in SQL (Query Language) angestellte ANGNR 3115 3207 2814 3190 2314 1324 1435 2412 2244 1237 3425 2454 projekt PNAME 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 ABTNR 35 30 32 30 35 35 32 32 31 31 30 31 PNR 761235 770008 770114 770231 (#=k) PFILIALE Karlsruhe Karlsruhe Heidelberg Mannheim PLEITER 3115 3115 1324 2814 Datenorientierte Systemanalyse – SQL Tabellen zu den folgenden Beispielen: 17 angpro PNR 761235 761235 761235 761235 761235 770008 770008 770008 770008 770114 770114 770114 770114 770114 770114 770231 770231 770231 770231 770231 (#=m) ANGNR 3207 3115 3190 1435 3425 2244 1237 2814 2454 2814 1435 1237 2454 3425 2412 3190 2314 2244 3115 1324 PROZARBZEIT 100 50 50 40 50 20 40 70 40 30 60 60 60 50 100 50 100 80 50 100 Datenorientierte Systemanalyse – SQL Abfragen in SQL (Query Language) 18 Die Syntax der SELECT-Abfrage … … … 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. Datenorientierte Systemanalyse – SQL Die SELECT-Abfrage Grundform: SELECT FROM WHERE 19 Abfragen mit Bedingungen () WHERE <search condition> Die search condition ist ein logischer Ausdruck, der - Vergleichsoperationen: =, <, >, <> oder !=, >=, <=, BETWEEN, LIKE, IN - Boolesche Operatoren: AND, OR, NOT (d.h. Bezugnahme auf eine Zeile, wie -Operation) Datenorientierte Systemanalyse – SQL folgendes enthalten kann: 20 Abfragen mit Bedingungen () 1. „Name und Abteilungsnummer aller Angestellten mit Wohnort Karlsruhe“ NAME, ABTNR Ergebnis: angestellte WOHNORT=‘Karlsruhe’; angestellte ANGNR 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 ABTNR 35 30 35 32 ABTNR 35 30 32 30 35 35 32 32 31 31 30 31 Datenorientierte Systemanalyse – SQL SELECT FROM WHERE 21 Abfragen mit Bedingungen () 2. „Name und Abteilungsnummer aller Angestellten, die in Karlsruhe wohnen oder in Abteilung 30 arbeiten“ NAME ABTNR Ergebnis: NAME, ABTNR SELECT Meyer 35 Müller 30 FROM angestellte Maus 30 WHERE Groß 35 WOHNORT=‘Karlsruhe’ Müller 32 OR ABTNR=30; Meier 30 angestellte ANGNR 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 ABTNR 35 30 32 30 35 35 32 32 31 31 30 31 Datenorientierte Systemanalyse – SQL Zusammengesetzte Suchbedingung 22 Abfragen mit Bedingungen () Abfragen mit Bereichsgrenzen 3. „Alle Angestellten (Nummer und Name) mit Nummer zwischen 1435 und 2314 (jeweils einschließlich)“ SELECT FROM WHERE angestellte ANGNR 3115 3207 2814 3190 2314 1324 1435 2412 2244 1237 3425 2454 ANGNR, NAME Ergebnis: angestellte ANGNR 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 ANGNR 2314 1435 2244 NAME Groß Mayerlein Schulz ABTNR 35 30 32 30 35 35 32 32 31 31 30 31 Datenorientierte Systemanalyse – SQL „ x BETWEEN a AND b“ entspricht „x >= a AND x <= b“ 23 Abfragen mit Bedingungen () Abfragen mit Wertaufzählung 4. „Alle Angestellten-Nummern der Abteilungen 30 und 35 aus Karlsruhe und Mannheim“ ANGNR Ergebnis: SELECT ANGNR angestellte ABTNR IN (30, 35) AND WOHNORT IN (’Karlsruhe’, ’Mannheim’); angestellte ANGNR NAME WOHNORT 3115 Meyer Karlsruhe 3207 Müller Mannheim 2814 Klein Mannheim 3190 Maus Karlsruhe 2314 Groß Karlsruhe 1324 Schmitt Heidelberg 1435 Mayerlein Bruchsal 2412 Müller Karlsruhe 2244 Schulz / NOT INBruchsal Negation: NOT BETWEEN 1237 Krämer Ludwigshafen 3425 Meier Pforzheim 2454 Schuster Worms 3115 3207 3190 2314 ABTNR 35 30 32 30 35 35 32 32 31 31 30 31 Datenorientierte Systemanalyse – SQL FROM WHERE 24 Abfragen mit Bedingungen () Abfrage mit Teilstring-Suche (Wildcards) Das Zeichen "%" im Suchstring steht für eine beliebige Folge von Characters, "passt" also auf jeden String. SELECT FROM WHERE projekt PNAME P-1 P-2 P-3 P-4 Ergebnis: PNR, PFILIALE projekt PFILIALE LIKE ‘%ei%’; PNR 761235 770008 770114 770231 PFILIALE Karlsruhe Karlsruhe Heidelberg Mannheim PNR 770114 770231 PFILIALE Heidelberg Mannheim PLEITER 3115 3115 1324 2814 Bemerkungen: - "like", nicht "=", nach "=" steht ein Wert, z.B. "=‘Heidelberg’" - Groß/Kleinschreibung beachten - Anderes Beispiel: Telefonnummer in Telefonliste Datenorientierte Systemanalyse – SQL 5. „Nummer und PFILIALE aller Projekte, deren P-Filialen in Städten liegen, deren Namen ein „ei“ enthalten.“ 25 Abfragen mit Bedingungen () SELECT FROM WHERE angestellte ANGNR 3115 3207 2814 3190 2314 1324 1435 2412 2244 1237 3425 2454 ANGNR, 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 ANGNR 3115 3425 NAME Meyer Meier ABTNR 35 30 32 30 35 35 32 32 31 31 30 31 Datenorientierte Systemanalyse – SQL 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.“ 26 Abfragen mit Bedingungen () Kombination von „_“ und „%“ 7. „Alle Angestellten-Namen, deren Anfang wie ‘Maier’ klingt.“ angestellte ANGNR 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 ABTNR 35 30 32 30 35 35 32 32 31 31 30 31 Datenorientierte Systemanalyse – SQL SELECT FROM WHERE 27 Abfragen mit Bedingungen () Retrieval mit Sortierung auf / absteigend ([ASC] / DESC) nach Wert einer Spalte oder mehrerer Spalten (zusammengesetztes Sortierkriterium, ASC - DESC beliebig mischbar) SELECT FROM WHERE ORDER BY ANGNR 3115 3207 2814 3190 2314 1324 1435 2412 2244 1237 3425 2454 ANGNR, NAME, angestellte ABTNR=30 NAME; -- NAME ASC nicht nötig da default NAME WOHNORT ABTNR 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: ANGNR 3207 3190 3425 Ergebnis: NAME Müller Maus Meier ANGNR 3190 3425 3207 WOHNORT Mannheim Karlsruhe Pforzheim ABTNR 30 30 30 NAME Maus Meier Müller Datenorientierte Systemanalyse – SQL 8. „Nummer und Name aller Angestellten, die zur Abteilung 30 gehören, aufsteigend sortiert nach dem Namen.“ 28 Spezielle Abfragen an eine Relation Auswahl von allen Zeilen 9. „Name aller Projekte“ PNAME projekt; Ergebnis: projekt PNAME P-1 P-2 P-3 P-4 PNR 761235 770008 770114 770231 PFILIALE Karlsruhe Karlsruhe Heidelberg Mannheim PLEITER 3115 3115 1324 2814 Datenorientierte Systemanalyse – SQL SELECT FROM 29 Spezielle Abfragen an eine Relation Auswahl von allen Spalten SELECT FROM WHERE projekt PFILIALE=‘Karlsruhe‘; Ergebnis: projekt PNAME P-1 P-2 P-3 P-4 PNR 761235 770008 770114 770231 PFILIALE Karlsruhe Karlsruhe Heidelberg Mannheim PLEITER 3115 3115 1324 2814 Datenorientierte Systemanalyse – SQL 10. „alle Projekte in Karlsruhe“ 30 Spezielle Abfragen an eine Relation Keine Auswahl von Spalten und von Zeilen (Gesamte Relation ausgeben) 11. „Alle Daten der Relation angestellte“ angestellte; Ergebnis: vollständige Kopie von angestellte angestellte ANGNR 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 ABTNR 35 30 32 30 35 35 32 32 31 31 30 31 Datenorientierte Systemanalyse – SQL SELECT FROM 31 Spezielle Abfragen an eine Relation Elimination von Duplikaten: 12. „Die Orte aller P-Filialen ohne Duplikate“ DISTINCT PFILIALE projekt; Ergebnis: eine einzelne Spalte ohne Duplikation. PFILIALE Karlsruhe Heidelberg Mannheim projekt PNAME P-1 P-2 P-3 P-4 PNR 761235 770008 770114 770231 PFILIALE Karlsruhe Karlsruhe Heidelberg Mannheim PLEITER 3115 3115 1324 2814 Datenorientierte Systemanalyse – SQL SELECT FROM 32 Spezielle Abfragen an eine Relation Rechnen mit Attributwerten 13. „(Zusammengehörige) Projekt- und Angestelltennummern mit relativer Arbeitszeit“ PNR, ANGNR, PROZARBZEIT 0.01 angpro; Ergebnis: angpro PNR 761235 761235 761235 761235 761235 770008 ... ANGNR 3207 3115 3190 1435 3425 2244 ... PROZARBZEIT 0.01 PROZARBZEIT 1.00 100 0.50 50 0.50 50 0.40 40 50 0.50 20 0.20 ... Datenorientierte Systemanalyse – SQL SELECT FROM 33 Spezielle Abfragen an eine Relation Integration von Konstanten in die Antwort 14. „(Zusammengehörige) Projekt- und Angestelltennummern mit relativer Arbeitszeit; vor der Arbeitszeit soll stehen: Anteil =.“ PNR, ANGNR,‘Anteil=‘, PROZARBZEIT/100.0 angpro; Ergebnis: angpro PNR PNR 761235 761235 761235 761235 761235 761235 761235 761235 761235 761235 770008 770008 ... ... ANGNR ANGNR 3207 3207 3115 3115 3190 3190 1435 1435 3425 3425 2244 2244 ... ... Anteil = Anteil = Anteil = Anteil = Anteil = Anteil = Anteil = ... PROZARBZEIT/100 PROZARBZEIT PROZARBZEIT 100 1.00 100 500.50 50 500.50 50 40 0.40 40 50 0.50 50 20 20 ...0.20 ... Datenorientierte Systemanalyse – SQL SELECT FROM 34 Aggregatfunktionen (COUNT, SUM, ...) 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 ANGNR NAME WOHNORT ABTNR 3115 Meyer Karlsruhe 35 3207 Müller Mannheim 30 2814 Klein Mannheim 32 3190 Maus Karlsruhe 30 2314 Groß Karlsruhe 35 1324 Schmitt Heidelberg 35 11 1435 Mayerlein Bruchsal 32 2412 Müller Karlsruhe 32 2244 Schulz Bruchsal 31 1237 Krämer Ludwigshafen 31 3425 Meier Pforzheim 30 2454 Schuster Worms 31 Datenorientierte Systemanalyse – SQL Funktion COUNT SUM AVG MAX MIN 35 Aggregatfunktionen (COUNT, SUM, ...) 16. Funktion, auf Spalte bezogen „Höchster vorkommender Arbeitszeitanteil“ angpro PNR 761235 761235 761235 761235 761235 770008 770008 770008 770008 770114 770114 770114 770114 770114 770114 770231 770231 770231 770231 770231 MAX(PROZARBZEIT) AS PROZARBEIT_MAX angpro; ANGNR 3207 3115 3190 1435 3425 2244 1237 2814 2454 2814 1435 1237 2454 3425 2412 3190 2314 2244 3115 1324 PROZARBZEIT 100 50 50 40 50 20 40 70 40 30 60 60 60 50 100 50 100 80 50 100 Qualifikation mit Aliasnamen Bemerkung: Das Schlüsselwort AS bei der Einführung von Aliasnamen ist optional. Ergebnis: PROZARBZEIT_MAX 100 Datenorientierte Systemanalyse – SQL SELECT FROM 36 Aggregatfunktionen (COUNT, SUM, ...) 17. Funktion, auf Spalte bezogen, mit zusätzlicher Selektion angpro PNR 761235 761235 761235 761235 761235 770008 770008 770008 770008 770114 770114 770114 770114 770114 770114 770231 770231 770231 770231 770231 Arbeitszeitanteil am Projekt Nr. 761235“ MAX(PROZARBZEIT) AS PROZARBEIT_MAX_761235 angpro PNR = 761235; ANGNR 3207 3115 3190 1435 3425 2244 1237 2814 2454 2814 1435 1237 2454 3425 2412 3190 2314 2244 3115 1324 PROZARBZEIT 100 50 50 40 50 20 40 70 40 30 60 60 60 50 100 50 100 80 50 100 Ergebnis: PROZARBZEIT_MAX_761235 100 Datenorientierte Systemanalyse – SQL „Höchster SELECT FROM WHERE 37 Aggregatfunktionen (COUNT, SUM, ...) 18. Funktion, auf Spalte bezogen, mit zusätzlicher Selektion „Gesamtarbeitsanteil von Projekt Nr. 770008“ angpro PNR 761235 761235 761235 761235 761235 770008 770008 770008 770008 770114 770114 770114 770114 770114 770114 770231 770231 770231 770231 770231 SUM (PROZARBZEIT) AS PROZARBEIT_SUM_770008 angpro PNR = 770008; ANGNR 3207 3115 3190 1435 3425 2244 1237 2814 2454 2814 1435 1237 2454 3425 2412 3190 2314 2244 3115 1324 PROZARBZEIT 100 50 50 40 50 20 40 70 40 30 60 60 60 50 100 50 100 80 50 100 Ergebnis: PROZARBZEIT_SUM_770008 170 170 Datenorientierte Systemanalyse – SQL SELECT FROM WHERE 38 Bildung von Gruppen (GROUP BY) SELECT PNR, SUM(PROZARBZEIT) AS PROZARBEIT_PROJEKT PNR ANGNR PROZARBZEIT angpro FROM 770008 1237 40 761235 3207 100 GROUP BY PNR; 770114 1237 60 761235 3115 50 Gruppe 761235 Ergebnis: PNR 761235 770008 770114 770231 PROZARBZEITPROJE KT 290 170 360 380 Gruppe 770008 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 Datenorientierte Systemanalyse – SQL 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. SUM 380 39 Bildung von Gruppen (GROUP BY) Auswahl von Gruppen mit HAVING-Bedingung: (WHERE für Auswahl einzelner Zeilen) 20. „Gib die Projekte an, in denen der maximale Arbeitszeitanteil 100% erreicht.“ PNR angpro GROUP BY PNR HAVING MAX(PROZARBZEIT) =100; Gruppe 761235 Gruppe 770008 Ergebnis: PNR 761235 770114 770231 Gruppe 770114 Gruppe 770231 PNR 761235 761235 761235 761235 761235 770008 770008 770008 770008 770114 770114 770114 770114 770114 770114 770231 770231 770231 770231 770231 ANGNR 3207 3115 3190 1435 3425 2244 1237 2814 2454 2814 1435 1237 2454 3425 2412 3190 2314 2244 3115 1324 PROZARBZEIT 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 Datenorientierte Systemanalyse – SQL SELECT FROM 40 Bildung von Gruppen (GROUP BY) Ergebnis: PNR 761235 770114 770231 Gruppe 761235 Gruppe 770008 Gruppe 770114 Gruppe 770231 PNR 761235 761235 761235 761235 761235 770008 770008 770008 770008 770114 770114 770114 770114 770114 770114 770231 770231 770231 770231 770231 ANGNR 3207 3115 3190 1435 3425 2244 1237 2814 2454 2814 1435 1237 2454 3425 2412 3190 2314 2244 3115 1324 PROZARBZEIT 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 Datenorientierte Systemanalyse – SQL 21. „Gib alle Projekte an, an denen mind. 5 Angestellte beteiligt sind.“ PNR SELECT FROM angpro GROUP BY PNR HAVING COUNT (DISTINCT ANGNR)>=5; 41 Mehrere Tabellen Verknüpfung von Relationen (Join) Ergebnis: siehe Anhang 1 Join mit Joinbedingung 23. „Alle Projekt-Nummern mit den Namen derjenigen Angestellten, die zu 50% mitarbeiten.“ SELECT FROM WHERE PNR, NAME angestellte, angpro angestellte.ANGNR=angpro.ANGNR AND PROZARBZEIT=50; Ergebnis: siehe Anhang 2 Datenorientierte Systemanalyse – SQL Abfragen mit Join („Natural Join“) 22. „Alle Projekte (PNR) mit den Informationen der zugehörigen Angestellten.“ SELECT PNR, angestellte.ANGNR, NAME, WOHNORT, ABTNR, PROZARBZEIT Qualifikation mit qualifiziertem Namen angestellte, angpro FROM WHERE angestellte.ANGNR=angpro.ANGNR; 42 Verknüpfung von Relationen (Join) Ergebnis: siehe Anhang 3 Join mit 3 Relationen 25. „Gib für jeden Angestellten seinen Namen, sowie die Projekt-Filialen der Projekte an, an denen er mitarbeitet.“ SELECT FROM WHERE NAME, PFILIALE angestellte, angpro, projekt angestellte.ANGNR=angpro.ANGNR AND angpro.PNR=projekt.PNR; Datenorientierte Systemanalyse – SQL 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 muss nicht an Projekt mitarbeiten) SELECT PNR, NAME angestellte, projekt FROM WHERE ANGNR <> PLEITER; Ergebnis: siehe Anhang 4 43 Verknüpfung von Relationen (Join) SELECT FROM WHERE ANGNR 3115 3207 2814 a.ANGNR ANR, b.ANGNR BNR Qualifikation mit Aliasnamen angestellte a, angestellte b a.WOHNORT=b.WOHNORT AND a.ANGNR < b.ANGNR; NAME Meyer Müller Klein a ANGNR NAME 3115 Meyer 3115 Meyer Meyer 3115 Müller 3207 Müller 3207 Müller 3207 Klein 2814 Klein 2814 Klein 2814 WOHNORT Karlsruhe Mannheim Mannheim ABTNR 35 30 32 WOHNORT ABTNR Karlsruhe 35 Karlsruhe 35 Karlsruhe 35 Mannheim 30 Mannheim 30 Mannheim 30 Mannheim 32 Mannheim 32 Mannheim 32 (kartesisches Produkt) b ANGNR 3115 3207 2814 3115 3207 2814 3115 3207 2814 NAME Meyer Müller Klein Meyer Müller Klein Meyer Müller Klein ANGNR 3115 3207 2814 NAME Meyer Müller Klein WOHNORT ABTNR Karlsruhe 35 Mannheim 30 Mannheim 32 Karlsruhe 35 Mannheim 30 Mannheim 32 Karlsruhe 35 Mannheim 30 Mannheim 32 WOHNORT Karlsruhe Mannheim Mannheim ABTNR 35 30 32 Ergebnis: ANR 2814 BNR 3207 Datenorientierte Systemanalyse – SQL 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) 44 Join-Operationen ab SQL-92 Ab SQL-92 gibt es explizite Join-Operationen. Es können Basis-Tabellen bzw. Views oder durch einen Join-Ausdruck (im vollen Sprachumfang auch durch einen beliebigen Abfrage-Ausdruck) definierte Tabellen miteinander verbunden werden: Typischerweise wird ein Join-Ausdruck in der FROM-Klausel einer SELECT-Abfrage verwendet: SELECT … FROM table join-op table [join-spec] WHERE … Syntax einer Join-Operation: join-op := CROSS JOIN | [NATURAL] [INNER] JOIN | [NATURAL] {LEFT | RIGHT | FULL} [OUTER] JOIN | UNION JOIN Datenorientierte Systemanalyse – SQL table join-op table [join-spec] 45 Join-Operationen ab SQL-92 Kartesisches Produkt: table1 CROSS JOIN table2 berechnet das Kartesische Produkt und entspricht 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. Datenorientierte Systemanalyse – SQL SELECT * FROM table1, table2 46 Join-Operationen ab SQL-92 Join mit Joinbedingung: Ein Join mit Joinbedingung wird mit INNER JOIN (oder nur JOIN) durchgeführt, wobei die Join-Bedingung mit 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. Datenorientierte Systemanalyse – SQL join-spec := ON search condition 47 Join-Operationen ab SQL-92 Union-Join: Der Union-Join kann mit Hilfe des Schlüsselworts UNION JOIN durchgeführt werden. Damit kann man Tabellen vereinigen, die gar nicht Tabelle werden ergänzt und mit NULL-Werten ausgefüllt. Bemerkung: Die expliziten Join-Operationen können zwar auch mit früheren SQL- Versionen 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. Datenorientierte Systemanalyse – SQL vereinigungskompatibel sind. Die privaten Attribute der jeweils anderen 48 Join-Operationen ab SQL-92 Beispiel 5-3 (Umformulierung der Bsp. 22-26) SELECT PNR, angestellte.ANGNR, NAME, WOHNORT, ABTNR, PROZARBZEIT FROM angestellte, angpro WHERE angestellte.ANGNR=angpro.ANGNR; Ab SQL-92: SELECT * FROM angestellte NATURAL JOIN angpro; Datenorientierte Systemanalyse – SQL 27. (Beispiel 22, S.41, „Natural Join“) „Alle Projektmitarbeiter mit den zugehörigen Angestellteninfos.“ 49 Join-Operationen ab SQL-92 Beispiel 5-3 (Umformulierung der Bsp. 22-26) SELECT PNR, NAME FROM angestellte, angpro WHERE angestellte.ANGNR=angpro.ANGNR AND PROZARBZEIT=50; Ab SQL-92: SELECT PNR, NAME FROM angestellte NATURAL JOIN angpro WHERE PROZARBZEIT = 50; oder SELECT PNR, NAME FROM angestellte INNER JOIN angpro ON (angestellte.ANGNR=angpro.ANGNR AND PROZARBZEIT=50); Datenorientierte Systemanalyse – SQL 28. (Beispiel 23, S.41, Join mit Joinbedingung) „Alle Projekt-Nummern mit den Namen derjenigen Angestellten, die zu 50% mitarbeiten.“ 50 Join-Operationen ab SQL-92 Beispiel 5-3 (Umformulierung der Bsp. 22-26) SELECT PNR, NAME FROM angestellte, projekt WHERE ANGNR <> PLEITER; Ab SQL-92: SELECT PNR, NAME FROM angestellte JOIN projekt ON (ANGNR <> PLEITER); Datenorientierte Systemanalyse – SQL 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 muss nicht an Projekt mitarbeiten) 51 Join-Operationen ab SQL-92 Beispiel 5-3 (Umformulierung der Bsp. 22-26) SELECT NAME, PFILIALE FROM angestellte, angpro, projekt WHERE angestellte.ANGNR=angpro.ANGNR AND angpro.PNR=projekt.PNR; Ab SQL-92: SELECT NAME, PFILIALE FROM angestellte NATURAL JOIN angpro NATURAL JOIN projekt; Datenorientierte Systemanalyse – SQL 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.“ 52 Join-Operationen ab SQL-92 Beispiel 5-3 (Umformulierung der Bsp. 22-26) SELECT a.ANGNR ANR, b.ANGNR BNR FROM angestellte a, angestellte b WHERE a.WOHNORT=b.WOHNORT AND a.ANGNR<b.ANGNR; Ab SQL-92 SELECT a.ANGNR, b.ANGNR FROM (angestellte a) JOIN (angestellte b) USING (WOHNORT) WHERE a.ANGNR < b.ANGNR; Datenorientierte Systemanalyse – SQL 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) 53 Die Varianten des OUTER Joins 1. LEFT (OUTER) JOIN Ident mit einem natural join. Jedoch werden jene Zeile aus der Linken Tabelle, die beim natural Join nicht zum Zug gekommen sind zum Ergebnis hinzugefügt. Fehlende Attribute werden mit NULL aufgefüllt. 2. RIGHT (OUTER) JOIN So wie LEFT JOIN. Jedoch werden die Zeilen aus der Rechten Tabelle, die beim natural Join nicht zum Zug gekommen sind zum Ergebnis hinzugefügt. 3. FULL (OUTER) JOIN Kombination aus Left und Right Join. Zuerst wird ein natural Join gemacht. Dann werden jene Zeilen aus der rechten und der linke Tabelle, die beim Join nicht zum Zug gekommen sind zum Ergebnis hinzugefügt. Datenorientierte Systemanalyse – SQL Kommen NULL-Werte bei Fremdschlüsseln vor (bzw. auch bei m:n Beziehungen, wenn nicht alle Entities eine Beziehung haben), können die folgenden Join Varianten sinnvoll sein. 54 Dabei handelt es sich um geschachtelte Queries. 32. „Namen aller Angestellten, die mit 100 % ihrer Arbeitszeit an einem Projekt mitarbeiten.“ 1. Schritt: Bestimme aus angpro alle ANGNR, die zu PROZARBZEIT=100 gehören (Query a) SELECT ANGNR angpro FROM WHERE PROZARBZEIT=100; angpro PNR 761235 761235 761235 761235 761235 770008 770008 770008 770008 770114 770114 770114 770114 770114 770114 770231 770231 770231 770231 770231 (#=m) ANGNR 3207 3115 3190 1435 3425 2244 1237 2814 2454 2814 1435 1237 2454 3425 2412 3190 2314 2244 3115 1324 PROZARBZEIT 100 50 50 40 50 20 40 70 40 30 60 60 60 50 100 50 100 80 50 100 Ergebnis: ANGNR 3207 2412 2314 1324 Datenorientierte Systemanalyse – SQL Verknüpfung von Relationen mit Subqueries 55 Verknüpfung von Relationen mit Subqueries 2. Schritt: Wähle in angestellte alle Tupel aus, deren ANGNR in der oben gegebenen Ergebnismenge liegt: (Query b) NAME angestellte ANGNR IN (3207, 2412, 2314,1324); angestellte (#=n) ANGNR NAME WOHNORT ABTNR 3115 Meyer Karlsruhe 35 3207 Müller Mannheim 30 2814 Klein Mannheim 32 3190 Maus Karlsruhe 30 2314 Groß Karlsruhe 35 1324 Schmitt Heidelberg 35 1435 Mayerlein Bruchsal 32 2412 Müller Karlsruhe 32 2244 Schulz Bruchsal 31 1237 Krämer Ludwigshafen 31 3425 Meier Pforzheim 30 2454 Schuster Worms 31 Ergebnis: NAME Müller Groß Schmitt Müller Datenorientierte Systemanalyse – SQL SELECT FROM WHERE 56 Verknüpfung von Relationen mit Subqueries {äußere Query b} SELECT NAME FROM angestellte WHERE ANGNR IN {Subquery a} (SELECT ANGNR FROM angpro WHERE PROZARBZEIT = 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 Datenorientierte Systemanalyse – SQL Zusammenfassung zu geschachtelter Query: 57 Verknüpfung von Relationen mit Subqueries 33. Äquivalente Abfrage mit Join: Ergebnis von 32. SELECT NAME FROM angestellte WHERE ANGNR IN (SELECT ANGNR FROM angpro WHERE PROZARBZEIT = 100); Vergleich 32. mit 33.: (vereinfachte Betrachtung!) Man betrachte Anzahl der notwendigen DB-Zugriffe! bei 32.: n+m bei 33.: nm Datenorientierte Systemanalyse – SQL SELECT NAME FROM angestellte, angpro WHERE PROZARBZEIT = 100 AND angpro.ANGNR = angestellte.ANGNR; 58 Verknüpfung von Relationen mit Subqueries b) in angpro: Auswahl ANGNR, deren PNR in der obigen Ergebnismenge liegen c) in angestellte: Auswahl NAMEn, deren ANGNR in der o.E. liegen c) SELECT NAME FROM angestellte WHERE ANGNR IN b) (SELECT ANGNR FROM angpro WHERE PNR IN a) (SELECT PNR FROM projekt WHERE PFILIALE =‘Karlsruhe‘)); Ergebnis: siehe Anhang 5 Datenorientierte Systemanalyse – SQL Mehrfach geschachtelte Queries 34. „Namen aller Angestellten, die an mindestens einem Projekt in Karlsruhe mitarbeiten.“ Vorgehensweise: a) in projekt: Auswahl PNR der Projekte in Karlsruhe 59 Verknüpfung von Relationen mit Subqueries SELECT angestellte.NAME FROM angestellte, angpro, projekt WHERE angestellte.ANGNR = angpro.ANGNR AND angpro.PNR=projekt.PNR AND projekt.PFILIALE=‘Karlsruhe‘; Datenorientierte Systemanalyse – SQL 35. Äquivalente Formulierung mit 2-fach Join: 60 Mengenoperationen Verknüpfung von Abfragen mit Mengenoperationen: Ergebnismengen müssen „vereinigungskompatibel“ sein (Namen und Wertebereiche korrespondierender Spalten müssen übereinstimmen). Operationen: 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 ANGNR FROM angestellte WHERE WOHNORT = ‘Karlsruhe‘ UNION SELECT PLEITER as ANGNR FROM projekt WHERE PFILIALE = ‘Karlsruhe‘; Ergebnis: siehe Anhang 6 Datenorientierte Systemanalyse – SQL {UNION | INTERSECT | EXCEPT} [ALL] 61 Mengenoperationen 39„Nummern aller Angestellten, die an mehr als einem Projekt arbeiten und SELECT ANGNR FROM angestellte WHERE WOHNORT = ‘Karlsruhe‘ INTERSECT SELECT ANGNR FROM angpro GROUP BY ANGNR HAVING COUNT (ANGNR) > 1; Ergebnis: siehe Anhang 7 Datenorientierte Systemanalyse – SQL in Karlsruhe wohnen.“ 62 Mengenoperationen 40. „Die Nummern aller Angestellten, deren Name mit ‘M‘ anfängt, die nicht Projektleiter sind.“ EXCEPT SELECT PLEITER as ANGNR FROM projekt; Ergebnis: siehe Anhang 8 Datenorientierte Systemanalyse – SQL SELECT ANGNR FROM angestellte WHERE NAME like ‘M%‘ 63 SQL – Structured Query Language Allgemeines zu SQL SQL- Query Language : Abfragen in SQL SQL-DML: Mutationen in SQL (Insert, Update, Delete) Datenorientierte Systemanalyse – SQL SQL-DLL: Definition eines Datenbankschemas 64 Die Mutationen Beispiel: UPDATE projekt SET PLEITER = 3207, PFILIALE = ’Mannheim’ WHERE PNR = 761235; DELETE DELETE FROM table [WHERE search condition]; Beispiel: DELETE FROM angpro WHERE ANGNR = 3190; Datenorientierte Systemanalyse – SQL UPDATE UPDATE table SET column = expression [, column = expression …] [WHERE search condition]; 65 Die Mutationen INSERT INSERT INTO table [(column [, column …])] VALUES (constant [, constant …]); INSERT INTO table [(column [, column …])] query; Beispiel: INSERT INTO angestellte (ANGNR, NAME, WOHNORT, ABTNR) 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‘; Datenorientierte Systemanalyse – SQL oder 66 Datenorientierte Systemanalyse – SQL ENDE 67 Anhang 1: Beispiel für „Natural Join“ FROM WHERE ANGNR 3115 2814 1324 PNR, angestellte.ANGNR, NAME, WOHNORT, ABTNR, PROZARBZEIT angestellte, angpro a.ANGNR=ap.ANGNR; NAME Meyer Klein Schmitt WOHNORT Karlsruhe Mannheim Heidelberg ABTNR 35 32 35 kartesisches Produkt PNR 761235 770008 770114 770231 770231 ANGNR NAME WOHNORT ABTNR PNR ANGNR PROZARBZEIT 3115 Meyer Karlsruhe 35 761235 3115 50 3115 Meyer Karlsruhe 35 770008 2814 70 35 3115 Meyer Karlsruhe 770114 2814 30 35 3115 Meyer Karlsruhe 770231 3115 50 3115 Meyer Karlsruhe 35 770231 1324 100 2814 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 1324 Schmitt Heidelberg 35 761235 3115 50 1324 Schmitt Heidelberg 35 770008 2814 70 1324 Schmitt Heidelberg 35 770114 2814 30 1324 Schmitt Heidelberg 35 770231 3115 50 1324 Schmitt Heidelberg 35 770231 1324 100 ANGNR 3115 2814 2814 3115 1324 PROZARBZEIT 50 70 30 50 100 Ergebnis: PNR 761235 770231 770008 770114 770231 ANG NR 3115 3115 2814 2814 1324 NAME WOHNORT Meyer Meyer Klein Klein Schmitt Karlsruhe Karlsruhe Mannheim Mannheim Heidelberg Datenorientierte Systemanalyse – SQL SELECT ABT PROZARB NR ZEIT 35 50 35 50 32 70 32 30 35 100 68 Anhang 2: Beispiel für Join mit Joinbedingung ANGNR 3115 2814 1324 ANGNR 3115 3115 3115 3115 3115 2814 2814 2814 2814 2814 1324 1324 1324 1324 1324 PNR, NAME angestellte, angpro angestellte.ANGNR= angpro.ANGNR AND PROZARBZEIT=50; NAME Meyer Klein Schmitt NAME Meyer Meyer Meyer Meyer Meyer Klein Klein Klein Klein Klein Schmitt Schmitt Schmitt Schmitt Schmitt WOHNORT Karlsruhe Mannheim Heidelberg WOHNORT Karlsruhe Karlsruhe Karlsruhe Karlsruhe Karlsruhe Mannheim Mannheim Mannheim Mannheim Mannheim Heidelberg Heidelberg Heidelberg Heidelberg Heidelberg ABTNR 35 32 35 ABTNR 35 35 35 35 35 32 32 32 32 32 35 35 35 35 35 (kartesisches Produkt) PNR 761235 770008 770114 770231 770231 761235 770008 770114 770231 770231 761235 770008 770114 770231 770231 ANGNR 3115 2814 2814 3115 1324 3115 2814 2814 3115 1324 3115 2814 2814 3115 1324 PNR 761235 770008 770114 770231 770231 ANGNR 3115 2814 2814 3115 1324 PROZARBZEIT 50 70 30 50 100 50 70 30 50 100 50 70 30 50 100 PROZARBZEIT 50 70 30 50 100 Ergebnis: PNR 761235 770231 NAME Meyer Meyer Datenorientierte Systemanalyse – SQL SELECT FROM WHERE 69 Anhang 3: Beispiel für Abfragen mit Join PNR, NAME angestellte, projekt ANGNR <> PLEITER; WOHNORT Karlsruhe Mannheim Heidelberg ABTNR 35 32 35 PNAME P-1 P-2 P-3 P-4 PNR 761235 770008 770114 770231 ANGNR 3115 2814 1324 NAME Meyer Klein Schmitt ANGNR 3115 3115 3115 3115 2814 2814 2814 2814 1324 1324 1324 1324 NAME WOHNORT ABTNR PNAME PNR PFILIALE PLEITER 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 (kartesisches Produkt) PFILIALE Karlsruhe Karlsruhe Heidelberg Mannheim PLEITER 3115 3115 1324 2814 Ergebnis: PNR 770114 770231 761235 770008 770114 761235 770008 770231 NAME Meyer Meyer Klein Klein Klein Schmitt Schmitt Schmitt Datenorientierte Systemanalyse – SQL SELECT FROM WHERE 70 Anhang 4: Beispiel für Join mit 3 Relationen ANGNR 3115 2814 NAME Meyer Klein NAME, PFILIALE angestellte, angpro, projekt angestellte.ANGNR= angpro.ANGNR AND angpro.PNR= projekt.PNR; WOHNORT Karlsruhe Mannheim ANGNR NAME WOHNORT 3115 3115 2814 2814 Meyer Meyer Klein Klein Karlsruhe Karlsruhe Mannheim Mannheim ANGNR 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 ABTN R 35 35 32 32 ABT NR 35 35 35 35 32 32 32 32 ABTNR 35 32 (kartesisches Produkt) PNR ANGNR 761235 770008 761235 770008 3115 2814 3115 2814 PNR ANGNR 761235 761235 770008 770008 761235 761235 770008 770008 3115 3115 2814 2814 3115 3115 2814 2814 PROZAR BZEIT 50 70 50 70 PNR 761235 770008 ANGNR PROZARBZEIT 3115 50 2814 70 (kartesische Produkt) PNAM PFILIAL PLEITE PNR E E R P-1 761235 Karlsruhe 3115 P-2 770008 Karlsruhe 3115 PROZAR PNAM PLEITE PNR PFILIALE BZEIT E R 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: NAME PFILIALE Meyer Karlsruhe Klein Karlsruhe Datenorientierte Systemanalyse – SQL SELECT FROM WHERE 71 Anhang 5: Mehrfach geschachtelte Subqueries Ergebnis: NAME SELECT NAME FROM angestellte WHERE ANGNR IN (SELECT ANGNR FROM angpro WHERE PNR IN (SELECT PNR FROM projekt WHERE PFILIALE =‘Karlsruhe‘)); (#=k) PNR PFILIALE PLEITER 761235 Karlsruhe 3115 770008 Karlsruhe 3115 770114 Heidelberg 1324 770231 Mannheim 2814 angestellte ANGNR 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 (#=n) ABTNR 35 30 32 30 35 35 32 32 31 31 30 31 Müller Klein Maus Mayerlein Krämer Meier Schuster angpro PNR 761235 761235 761235 761235 761235 770008 770008 770008 770008 770114 770114 770114 770114 770114 770114 770231 770231 770231 770231 770231 ANGNR 3207 3115 3190 1435 3425 2244 1237 2814 2454 2814 1435 1237 2454 3425 2412 3190 2314 2244 3115 1324 (#=m) PROZARBZEIT 100 50 50 40 50 20 40 70 40 30 60 60 60 50 100 50 100 80 50 100 Datenorientierte Systemanalyse – SQL projekt PNAME P-1 P-2 P-3 P-4 Meyer 72 Anhang 6: Beispiel für Mengenoperationen (Union) Ergebnis: SELECT ANGNR FROM angestellte WHERE WOHNORT = ‘Karlsruhe‘ UNION SELECT PLEITER as ANGNR FROM projekt WHERE PFILIALE = ‘Karlsruhe‘; angestellte ANGNR NAME 3115 Meyer 3207 Müller 2814 Klein 3190 Maus 2314 Groß 1324 Schmitt 1435 Mayerlein 2412 Müller 2244 Schulz 1237 Krämer 3425 Meier 2454 Schuster WOHNORT Karlsruhe Mannheim Mannheim Karlsruhe Karlsruhe Heidelberg Bruchsal Karlsruhe Bruchsal Ludwigshafen Pforzheim Worms ABTNR 35 30 32 30 35 35 32 32 31 31 30 31 Zwischenergebnis: ANGNR 3115 3190 2314 2412 projekt PNAME P-1 P-2 P-3 P-4 Zwischenergebnis: ANGNR 3115 3115 PNR 761235 770008 770114 770231 PFILIALE PLEITER Karlsruhe 3115 Karlsruhe 3115 Heidelberg 1324 Mannheim 2814 Datenorientierte Systemanalyse – SQL ANGNR 3115 3190 2314 2412 3115 3115 73 Anhang 7: Beispiel für Mengenoperationen (Intersect) Ergebnis: SELECT ANGNR FROM angestellte WHERE WOHNORT = ‘Karlsruhe‘ INTERSECT SELECT ANGNR FROM angpro GROUP BY ANGNR HAVING COUNT (ANGNR) > 1; angestellte ANGNR NAME 3115 Meyer 3207 Müller 2814 Klein 3190 Maus 2314 Groß 1324 Schmitt 1435 Mayerlein 2412 Müller 2244 Schulz 1237 Krämer 3425 Meier 2454 Schuster Zwischenergebnis: Zwischenergebnis: WOHNORT Karlsruhe Mannheim Mannheim Karlsruhe Karlsruhe Heidelberg Bruchsal Karlsruhe Bruchsal Ludwigshafen Pforzheim Worms ABTNR 35 30 32 30 35 35 32 32 31 31 30 31 ANGNR 2314 2412 3115 3190 angpro PNR 761235 761235 761235 761235 761235 770008 ... ANGNR 3207 3115 3190 1435 3425 2244 ... PROZARBZEIT 100 50 50 40 50 20 ... ANGNR 1237 1435 2244 2454 2814 3115 3190 3425 Datenorientierte Systemanalyse – SQL ANGNR 3115 3190 74 Anhang 8: Beispiel für Mengenoperationen (EXCEPT) SELECT ANGNR FROM angestellte WHERE NAME like ‘M%‘ EXCEPT ANGNR 3207 3190 1435 2412 3425 SELECT PLEITER as ANGNR FROM projekt; angestellte ANGNR NAME 3115 Meyer 3207 Müller 2814 Klein 3190 Maus 2314 Groß 1324 Schmitt 1435 Mayerlein 2412 Müller 2244 Schulz 1237 Krämer 3425 Meier 2454 Schuster WOHNORT Karlsruhe Mannheim Mannheim Karlsruhe Karlsruhe Heidelberg Bruchsal Karlsruhe Bruchsal Ludwigshafen Pforzheim Worms ABTNR 35 30 32 30 35 35 32 32 31 31 30 31 projekt PNAME P-1 P-2 P-3 P-4 PNR 761235 770008 770114 770231 PFILIALE PLEITER Karlsruhe 3115 Karlsruhe 3115 Heidelberg 1324 Mannheim 2814 Datenorientierte Systemanalyse – SQL Ergebnis: 75