5 SQL – Structured Query Language

Werbung
5
5.2 SQL-DDL: Definition eines Datenbankschemas ..............
8
24.05.2017
5.3 SQL-DML: Abfragen in SQL (Query Language) .............. 15
5.4 SQL-DML: Mutationen in SQL (Insert, Update, Delete) … 65
SQL - Structured Query Language
5.1 Allgemeines zu SQL .........................................................
 AIFB
5 SQL – Structured Query Language
4
5.1 Allgemeines zu SQL
(1|3)
Entwicklungsziele:
möglichst einfach für den Endbenutzer;
Benennung:
SQL: „structured query language"
24.05.2017
möglichst deskriptiv, nicht prozedural
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
SQL - Structured Query Language
Entwicklung: (im IBM-Labor)
 AIFB
ursprünglich: SEQUEL – „structured english query language"
IBM: SQL/DS (1981), DB2 (1983)
5
5.1 Allgemeines zu SQL
(2|3)
Standardisierung
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.
 AIFB
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 - Structured Query Language
SQL-89 (1989): Lücken (z.B.:
Fremdschlüssel) von SQL-86 z.T. geschlossen;
24.05.2017
SQL-86 (1986): erster Standardisierungsversuch
6
5.1 Allgemeines zu SQL
(3|3)
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.
 AIFB
Terminologie:
SQL - Structured Query Language
SQL kann sowohl interaktiv,
als auch eingebettet in einer konventionellen
Programmiersprache (z.B. C, FORTRAN, …) verwendet werden.
24.05.2017
Schnittstellen:
7
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
 AIFB
Allgemeines zu SQL ........................................................
SQL - Structured Query Language
5.1
24.05.2017
5 SQL – Structured Query Language
8
5.2 Definition eines Datenbankschemas (SQL-DDL)
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.
 AIFB
Übersicht: SQL-DDL (vereinfacht)
24.05.2017
: Menge von Basistabellen
: Views
SQL - Structured Query Language
Datenbank
Benutzersichten
9
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)]
 AIFB
SQL kennt nicht den benannten Relationstyp
SQL - Structured Query Language
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“).
24.05.2017
5.2.1 Definition von Basistabellen
10
5.2.2 Datentypen und benutzerdefinierte Domänen
(1/2)
SQL bietet folgende (Basis-)Datentypen: (Auswahl)
CHARACTER
CHARACTER (n)
CHARACTER VARYING (n)
Kurzform
CHAR
CHAR (n)
∗)
VARCHAR (n)
DECIMAL [(p,[,s])]
NUMERIC [(p,[,s])]
INTEGER
SMALLINT
DOUBLE PRECISION
FLOAT (n)
REAL
 AIFB
BIT
BIT (n)
BIT VARYING (n)
24.05.2017
Datentyp
DEC(p,s)
INT
SQL - Structured Query Language
Beschreibung
Zeichen(ketten):
Ein einzelnes Zeichen
Kette fester Länge
Kette variabler Länge
Bit-Datentyp:
Ein Bit
Bitfolge fester Länge
Bitfolge variabler Länge
Exakte Zahlen:
mit Nachkommastellen
dto.
Ganzzahl
kleine Ganzzahl
Gleitkommazahlen:
hohe Genauigkeit
benutzerdefinierte Gen.
geringere Genauigkeit
*) n=integer, p, s ebenso.
11
5.2.2 Datentypen und benutzerdefinierte Domänen
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);
24.05.2017
Kurzform
 AIFB
Datentyp
SQL - Structured Query Language
Beschreibung
Zeit, Datum, Zeitintervall:
Datum (y,m,d)
Zeitpunkt (h,min,sec)
Zeitpunkt (y,m,d,h, min, sec)
Zeitintervall
(2/2)
12
5.2.3 Ein Beispiel für ein Datenbankschema
CREATE SCHEMA Projektverwaltung;
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)).
 AIFB
angestellte
PersonalNr PRIMARY KEY,
VARCHAR (30),
VARCHAR (30),
INTEGER);
SQL - Structured Query Language
CREATE TABLE
(ANG-NR
NAME
WOHNORT
ABT-NR
24.05.2017
CREATE DOMAIN PersonalNr AS INTEGER;
CREATE DOMAIN ProjektNr AS INTEGER;
CREATE DOMAIN ProzentAngabe AS ...
13
Beispiel 5-2:
CREATE VIEW angestellteAusKarlsruhe
AS SELECT ANG-NR, NAME, WOHNORT, ABT-NR
FROM
angestellte
WHERE WOHNORT = ‘Karlsruhe‘;
 AIFB
([WITH CHECK OPTION]: bei Mutationen: Prüfung ob eingefügte
oder geänderte Tupel zu View gehören.)
SQL - Structured Query Language
CREATE VIEW table-name
[(column-name [,column-name] …)]
AS query expression
[WITH CHECK OPTION];
24.05.2017
5.2.4 Definition von Sichten
14
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
 AIFB
Allgemeines zu SQL ............................................................................
SQL - Structured Query Language
5.1
24.05.2017
5 SQL – Structured Query Language
15
5.3 Abfragen in SQL (Query Language)
(1/2)
projekt
P-NAME
P-1
P-2
P-3
P-4
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
 AIFB
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
SQL - Structured Query Language
angestellte
ANG-NR
3115
3207
2814
3190
2314
1324
1435
2412
2244
1237
3425
2454
24.05.2017
Tabellen zu den folgenden Beispielen:
16
PROZ-ARBZEIT
100
50
50
40
50
20
40
70
40
30
60
60
60
50
100
50
100
80
50
100
24.05.2017
(#=m)
ANG-NR
3207
3115
3190
1435
3425
2244
1237
2814
2454
2814
1435
1237
2454
3425
2412
3190
2314
2244
3115
1324
 AIFB
ang-pro
P-NR
761235
761235
761235
761235
761235
770008
770008
770008
770008
770114
770114
770114
770114
770114
770114
770231
770231
770231
770231
770231
(2/2)
SQL - Structured Query Language
5.3 Abfragen in SQL (Query Language)
17
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
 AIFB
…
…
…
SQL - Structured Query Language
Die SELECT-Abfrage
Grundform:
SELECT
FROM
WHERE
24.05.2017
5.3.1 Die Syntax der SELECT-Abfrage
18
5.3.2 Abfragen mit Bedingungen (″σ″)
(1/9)
WHERE <search condition>
BETWEEN, LIKE, IN
- Boolesche Operatoren: AND, OR, NOT
(d.h. Bezugnahme auf eine Zeile, wie σ-Operation)
 AIFB
- Vergleichsoperationen: =, <, >, <>, >=, <=,
SQL - Structured Query Language
folgendes enthalten kann:
24.05.2017
Die search condition ist ein logischer Ausdruck, der
19
5.3.2 Abfragen mit Bedingungen (″σ″)
(2/9)
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
 AIFB
NAME, ABT-NR
Ergebnis:
angestellte
WOHNORT=‘Karlsruhe’;
SQL - Structured Query Language
SELECT
FROM
WHERE
24.05.2017
1. „Name und Abteilungsnummer aller Angestellten mit Wohnort Karlsruhe“
20
5.3.2 Abfragen mit Bedingungen (″σ″)
(3/9)
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
 AIFB
angestellte
ANG-NR
3115
3207
2814
3190
2314
1324
1435
2412
2244
1237
3425
2454
SQL - Structured Query Language
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
Müller
30
FROM
angestellte
Maus
30
WHERE
Groß
35
WOHNORT=‘Karlsruhe’
Müller
32
OR ABT-NR=30;
Meier
30
24.05.2017
Zusammengesetzte Suchbedingung
21
5.3.2 Abfragen mit Bedingungen (″σ″)
(4/9)
Abfragen mit Bereichsgrenzen
3. „Alle Angestellten (Nummer und Name) mit Nummer zwischen 1435 und
2314 (jeweils einschließlich)“
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
 AIFB
angestellte
ANG-NR
3115
3207
2814
3190
2314
1324
1435
2412
2244
1237
3425
2454
ANG-NR, NAME
SQL - Structured Query Language
SELECT
FROM
WHERE
24.05.2017
„ x BETWEEN a AND b“ entspricht „x >= a AND x <= b“
22
5.3.2 Abfragen mit Bedingungen (″σ″)
(5/9)
Abfragen mit Wertaufzählung
angestellte
ANG-NR
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
ABT-NR
35
30
32
30
35
35
32
32
31
31
30
31
 AIFB
angestellte
ABT-NR IN (30, 35) AND
WOHNORT IN (’Karlsruhe’, ’Mannheim’);
SQL - Structured Query Language
FROM
WHERE
24.05.2017
4. „Alle Angestellten-Nummern der Abteilungen 30 und 35 aus Karlsruhe und
Mannheim“
ANG-NR
Ergebnis:
SELECT
ANG-NR
23
5.3.2 Abfragen mit Bedingungen (″σ″)
(6/9)
Abfrage mit Teilstring-Suche (Wildcards)
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
 AIFB
SELECT
FROM
WHERE
SQL - Structured Query Language
5. „Nummer und P-FILIALE aller Projekte, deren P-Filialen in Städten
liegen, deren Namen ein „ei“ enthalten.“
24.05.2017
Das Zeichen "%" im Suchstring steht für eine beliebige Folge von
Characters, "passt" also auf jeden String.
24
5.3.2 Abfragen mit Bedingungen (″σ″)
(7/9)
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
 AIFB
angestellte
ANG-NR
3115
3207
2814
3190
2314
1324
1435
2412
2244
1237
3425
2454
ANG-NR, NAME
angestellte
NAME LIKE ‘Me_er’;
SQL - Structured Query Language
SELECT
FROM
WHERE
24.05.2017
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.“
25
5.3.2 Abfragen mit Bedingungen (″σ″)
(8/9)
Kombination von „_“ und „%“
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
 AIFB
angestellte
ANG-NR
3115
3207
2814
3190
2314
1324
1435
2412
2244
1237
3425
2454
NAME
angestellte
NAME LIKE ‘M_ _er%’;
SQL - Structured Query Language
SELECT
FROM
WHERE
24.05.2017
7. „Alle Angestellten-Namen, deren Anfang wie ‘Maier’ klingt.“
26
5.3.2 Abfragen mit Bedingungen (″σ″)
(9/9)
Retrieval mit Sortierung
8. „Nummer und Name aller Angestellten, die zur Abteilung 30 gehören,
aufsteigend sortiert nach Nummer und Name.“
ANG-NR
3115
3207
2814
3190
2314
1324
1435
2412
2244
1237
3425
2454
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
 AIFB
ANG-NR, NAME,
angestellte
ABT-NR=30
ANG-NR, NAME ASC;
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
SQL - Structured Query Language
SELECT
FROM
WHERE
ORDER BY
24.05.2017
auf / absteigend ([ASC] / DESC)
nach Wert einer Spalte oder mehrerer Spalten (zusammengesetztes
Sortierkriterium, ASC - DESC beliebig mischbar)
27
5.3.3 Spezielle Abfragen an eine Relation
(1/6)
Auswahl von allen Zeilen
9. „Name aller Projekte“
24.05.2017
P-NAME
projekt;
projekt
P-NAME
P-1
P-2
P-3
P-4
 AIFB
Ergebnis:
P-NR
761235
770008
770114
770231
P-FILIALE
Karlsruhe
Karlsruhe
Heidelberg
Mannheim
P-LEITER
3115
3115
1324
2814
SQL - Structured Query Language
SELECT
FROM
28
5.3.3 Spezielle Abfragen an eine Relation
(2/6)
Auswahl von allen Spalten
10. „alle Projekte in Karlsruhe“
 AIFB
24.05.2017
∗
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
SQL - Structured Query Language
SELECT
FROM
WHERE
29
5.3.3 Spezielle Abfragen an eine Relation
(3/6)
Keine Auswahl von Spalten und von Zeilen (Gesamte Relation ausgeben)
11. „Alle Daten der Relation 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
 AIFB
24.05.2017
∗
angestellte;
SQL - Structured Query Language
SELECT
FROM
30
5.3.3 Spezielle Abfragen an eine Relation
(4/6)
Elimination von Duplikaten:
12. „Die Orte aller P-Filialen ohne Duplikate“
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
 AIFB
24.05.2017
DISTINCT P-FILIALE
projekt;
SQL - Structured Query Language
SELECT
FROM
31
5.3.3 Spezielle Abfragen an eine Relation
(5/6)
Rechnen mit Attributwerten
P-NR, ANG-NR, PROZ-ARBZEIT ∗ 0.01
ang-pro;
ang-pro
P-NR
761235
761235
761235
761235
761235
770008
...
 AIFB
Ergebnis:
ANG-NR
3207
3115
3190
1435
3425
2244
...
PROZ-ARBZEIT
∗0.01
PROZ-ARBZEIT
1.00
100
50
0.50
50
0.50
40
0.40
50
0.50
20
0.20
...
SQL - Structured Query Language
SELECT
FROM
24.05.2017
13. „(Zusammengehörige) Projekt- und Angestelltennummern mit
relativer Arbeitszeit“
32
5.3.3 Spezielle Abfragen an eine Relation
(6/6)
Integration von Konstanten in die Antwort
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
...
 AIFB
P-NR, ANG-NR,‘Anteil=‘, PROZ-ARBZEIT/100
SQL - Structured Query Language
SELECT
FROM
24.05.2017
14. „(Zusammengehörige) Projekt- und Angestelltennummern
mit relativer Arbeitszeit; vor der Arbeitszeit soll stehen: Anteil =.“
33
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
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
24.05.2017
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
 AIFB
Funktion
COUNT
SUM
AVG
MAX
MIN
(1/4)
SQL - Structured Query Language
5.3.4 Aggregatfunktionen (COUNT, SUM, ...)
34
5.3.4 Aggregatfunktionen (COUNT, SUM, ...)
(2/4)
16. Funktion, auf Spalte bezogen
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 mit Aliasnamen
Bemerkung: Das Schlüsselwort
AS bei der Einführung von
Aliasnamen ist optional.
Ergebnis:
PROZ-ARBZEIT-MAX
100
 AIFB
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;
SQL - Structured Query Language
SELECT
FROM
24.05.2017
„Höchster vorkommender Arbeitszeitanteil“
35
5.3.4 Aggregatfunktionen (COUNT, SUM, ...)
(3/4)
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
 AIFB
ang-pro
P-NR
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(PROZ-ARBZEIT) AS PROZ-ARBEIT-MAX-761235
ang-pro
P-NR = 761235;
SQL - Structured Query Language
„Höchster
SELECT
FROM
WHERE
24.05.2017
17. Funktion, auf Spalte bezogen, mit zusätzlicher Selektion
36
5.3.4 Aggregatfunktionen (COUNT, SUM, ...)
(4/4)
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
 AIFB
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;
SQL - Structured Query Language
SELECT
FROM
WHERE
24.05.2017
18. Funktion, auf Spalte bezogen, mit zusätzlicher Selektion
„Gesamtarbeitsanteil von Projekt Nr. 770008“
37
SELECT
P-NR, SUM(PROZ-ARBZEIT) AS PROZ-ARBEIT-PROJEKT
P-NR
ANG-NR
PROZ-ARBZEIT
ang-pro
FROM
770008
1237
40
761235
3207
100
GROUP BY P-NR;
770114
1237
60
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
 AIFB
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.
24.05.2017
(1/3)
SQL - Structured Query Language
5.3.5 Bildung von Gruppen (GROUP BY)
38
5.3.5 Bildung von Gruppen (GROUP BY)
(2/3)
Auswahl von Gruppen mit HAVING-Bedingung:
(WHERE für Auswahl einzelner Zeilen)
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
 AIFB
P-NR
MAX
70
SQL - Structured Query Language
SELECT
FROM
24.05.2017
20. „Gib die Projekte an, in denen der maximale Arbeitszeitanteil 100%
erreicht.“
MAX
100
MAX
100
39
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
 AIFB
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;
24.05.2017
(3/3)
SQL - Structured Query Language
5.3.5 Bildung von Gruppen (GROUP BY)
40
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)
 AIFB
Abfragen mit Join („Natural Join“)
22. „Alle Projekte mit den Informationen der zugehörigen Angestellten.“
SELECT
P-NR, a.ANG-NR, NAME, WOHNORT, ABT-NR,
PROZ-ARBZEIT
angestellte a, ang-pro ap
FROM
Qualifikation mit Aliasnamen
WHERE
a.ANG-NR=ap.ANG-NR;
24.05.2017
(1/3)
SQL - Structured Query Language
5.3.6 Verknüpfung von Relationen (Join)
41
(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;
24.05.2017
5.3.6 Verknüpfung von Relationen (Join)
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)
SQL - Structured Query Language
 AIFB
Animation und Ergebnis dieses Beispiels (siehe Seite 70)
42
5.3.6 Verknüpfung von Relationen (Join)
(3/3)
a
ANG-NR
3115
3115
3115
3207
3207
3207
2814
2814
2814
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:
A-NR
2814
B-NR
3207
 AIFB
ANG-NR
3115
3207
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;
SQL - Structured Query Language
SELECT
FROM
WHERE
24.05.2017
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)
43
5.3.7 Join-Operationen ab SQL-92
(1/9)
Syntax einer Join-Operation:
join-op :=
CROSS JOIN |
[NATURAL] [INNER] JOIN |
[NATURAL] {LEFT | RIGHT | FULL} [OUTER] JOIN |
UNION JOIN
 AIFB
SQL - Structured Query Language
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.
24.05.2017
Ab SQL-92 gibt es explizite Join-Operationen.
44
5.3.7 Join-Operationen ab SQL-92
(2/9)
Kartesisches Produkt:
table1 CROSS JOIN table2
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.
 AIFB
Natural Join:
Die Verwendung des Schlüsselworts NATURAL führt zur Berechnung des
Natural Join.
SQL - Structured Query Language
SELECT * FROM table1, table2
24.05.2017
berechnet das Kartesische Produkt und entspricht
45
5.3.7 Join-Operationen ab SQL-92
(3/9)
Join mit Joinbedingung:
Ein Join mit Joinbedingung wird mit INNER JOIN (oder nur JOIN)
durchgeführt, wobei die Join-Bedingung mit
– 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.
 AIFB
Outer-Join:
Sämtliche Variationen des Outer-Join (FULL, LEFT, RIGHT) können
formuliert werden. Dabei kann entweder ein
SQL - Structured Query Language
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).
24.05.2017
join-spec := ON search condition
46
5.3.7 Join-Operationen ab SQL-92
(4/9)
Union-Join:
Der Union-Join kann mit Hilfe des Schlüsselworts
durchgeführt werden. Damit kann man Tabellen vereinigen, die gar nicht
vereinigungskompatibel sind. Die privaten Attribute der jeweils anderen
24.05.2017
UNION JOIN
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.
SQL - Structured Query Language
 AIFB
Tabelle werden ergänzt und mit NULL-Werten ausgefüllt.
47
5.3.7 Join-Operationen ab SQL-92
(5/9)
Beispiel 5-3 (Umformulierung der Bsp. 22-26)
Ab SQL-92:
SELECT *
FROM angestellte NATURAL JOIN ang-pro;
 AIFB
SQL - Structured Query Language
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;
24.05.2017
27. (Beispiel 22, S.41, „Natural Join“)
„Alle Projektmitarbeiter mit den zugehörigen Angestellteninfos.“
48
5.3.7 Join-Operationen ab SQL-92
(6/9)
Beispiel 5-3 (Umformulierung der Bsp. 22-26)
oder
SELECT P-NR, NAME
FROM angestellte INNER JOIN ang-pro
ON (angestellte.ANG-NR=ang-pro.ANG-NR AND
PROZ-ARBZEIT=50);
 AIFB
Ab SQL-92:
SELECT P-NR, NAME
FROM angestellte NATURAL JOIN ang-pro
WHERE PROZ-ARBZEIT = 50;
SQL - Structured Query Language
SELECT P-NR, NAME
FROM angestellte a, ang-pro ap
WHERE a.ANG-NR=ap.ANG-NR AND PROZ-ARBZEIT=50;
24.05.2017
28. (Beispiel 23, S.41, Join mit Joinbedingung)
„Alle Projekt-Nummern mit den Namen derjenigen Angestellten, die zu
50% mitarbeiten.“
49
5.3.7 Join-Operationen ab SQL-92
(7/9)
Ab SQL-92:
SELECT P-NR, NAME
FROM angestellte JOIN projekt
ON (ANG-NR <> P-LEITER);
 AIFB
SELECT P-NR, NAME
FROM angestellte, projekt
WHERE ANG-NR <> P-LEITER;
SQL - Structured Query Language
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)
24.05.2017
Beispiel 5-3 (Umformulierung der Bsp. 22-26)
50
5.3.7 Join-Operationen ab SQL-92
(8/9)
Ab SQL-92:
SELECT NAME, P-FILIALE
FROM angestellte NATURAL JOIN ang-pro
NATURAL JOIN projekt;
 AIFB
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;
SQL - Structured Query Language
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.“
24.05.2017
Beispiel 5-3 (Umformulierung der Bsp. 22-26)
51
5.3.7 Join-Operationen ab SQL-92
(9/9)
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;
 AIFB
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;
SQL - Structured Query Language
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)
24.05.2017
Beispiel 5-3 (Umformulierung der Bsp. 22-26)
52
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
 AIFB
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)
SELECT
ANG-NR
ang-pro
FROM
WHERE
PROZ-ARBZEIT=100;
24.05.2017
(1/7)
SQL - Structured Query Language
5.3.8 Verknüpfung von Relationen mit Subqueries
53
5.3.8 Verknüpfung von Relationen mit Subqueries
(2/7)
2. Schritt: Wähle in angestellte alle Tupel aus, deren ANG-NR in der oben
gegebenen Ergebnismenge liegt: (Query b)
Ergebnis:
NAME
Müller
Groß
Schmitt
Müller
 AIFB
angestellte
(#=n)
ANG-NR NAME WOHNORT ABT-NR
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
24.05.2017
NAME
angestellte
ANG-NR IN (3207, 2412, 2314,1324);
SQL - Structured Query Language
SELECT
FROM
WHERE
54
5.3.8 Verknüpfung von Relationen mit Subqueries
(3/7)
Vorgehensweise des Systems:
a) Abarbeitung Subquery (a)
b) Übergabe Ergebnis an übergeordnete (äußere) Query (b)
c) Abarbeitung Query b mit dem übergebenen Ergebnis
 AIFB
SQL - Structured Query Language
{äußere Query b}
SELECT NAME
FROM angestellte
WHERE ANG-NR IN
{Subquery a}
(SELECT ANG-NR
FROM ang-pro
WHERE PROZ-ARBZEIT = 100);
24.05.2017
Zusammenfassung zu geschachtelter Query:
55
5.3.8 Verknüpfung von Relationen mit Subqueries
(4/7)
Vergleich 32. mit 33.: (vereinfachte Betrachtung!)
Man betrachte Anzahl der notwendigen DB-Zugriffe!
bei 32.: n+m
bei 33.: n∗m
 AIFB
Ergebnis von 32.
SELECT NAME
FROM
angestellte
WHERE ANG-NR IN
(SELECT ANG-NR
FROM ang-pro
WHERE PROZ-ARBZEIT = 100);
SQL - Structured Query Language
SELECT NAME
FROM angestellte, ang-pro
WHERE PROZ-ARBZEIT = 100
AND ang-pro.ANG-NR = angestellte.ANG-NR;
24.05.2017
33. Äquivalente Abfrage mit Join:
56
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)
 AIFB
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
24.05.2017
(5/7)
SQL - Structured Query Language
5.3.8 Verknüpfung von Relationen mit Subqueries
57
5.3.8 Verknüpfung von Relationen mit Subqueries
(6/7)
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‘;
 AIFB
a.NAME
SQL - Structured Query Language
SELECT
24.05.2017
35. Äquivalente Formulierung mit 2-fach Join:
58
5.3.8 Verknüpfung von Relationen mit Subqueries
(7/7)
„Correlated subquery“:
Die Subquery ist durch eine „äußere Referenz“ von der umgebenden
äußeren Query abhängig.
(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)
 AIFB
SELECT DISTINCT P-FILIALE
FROM projekt a
WHERE 1 <
SQL - Structured Query Language
(b)
24.05.2017
: Gib alle Orte an, an denen mehr als ein Projekt angesiedelt ist.“
36.
59
5.3.9 Abfragen mit Existenz-Quantor
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)
 AIFB
q≠∅
wahr
falsch
SQL - Structured Query Language
EXISTS q
NOT EXISTS q
q=∅
falsch
wahr
24.05.2017
Sei q Ergebnis(menge) einer Subquery; q leer?
60
5.3.10 Mengenoperationen
(1/3)
Verknüpfung von Abfragen mit Mengenoperationen: Ergebnismengen müssen
„vereinigungskompatibel“ sein (Namen und Wertebereiche
korrespondierender Spalten müssen übereinstimmen).
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)
 AIFB
Wird ALL verwendet, dann arbeiten die Operationen mit „uneigentlichen
Tabellen“, sonst mit „eigentlichen Tabellen“ (keine Duplikate).
SQL - Structured Query Language
{UNION | INTERSECT | EXCEPT} [ALL]
24.05.2017
Operationen:
61
5.3.10 Mengenoperationen
(2/3)
39„Nummern aller Angestellten, die an mehr als einem Projekt arbeiten und
SELECT ANG-NR
FROM ang-pro
GROUP BY ANG-NR
HAVING COUNT (ANG-NR) > 1;
Animation und Ergebnis dieses Beispiels (siehe Seite 76)
 AIFB
INTERSECT
SQL - Structured Query Language
SELECT ANG-NR
FROM angestellte
WHERE WOHNORT = ‘Karlsruhe‘
24.05.2017
in Karlsruhe wohnen.“
62
5.3.10 Mengenoperationen
(3/3)
SELECT P-LEITER as ANG-NR
FROM projekt;
Animation und Ergebnis dieses Beispiels (siehe Seite 77)
 AIFB
EXCEPT
SQL - Structured Query Language
SELECT ANG-NR
FROM angestellte
WHERE NAME like ‘M%‘
24.05.2017
40. „Die Nummern aller Angestellten, deren Name mit ‘M‘ anfängt, die nicht
Projektleiter sind.“
63
5 SQL – Structured Query Language
5.3 SQL-DML: Abfragen in SQL (Query Language) .............. 15
5.4 SQL-DML: Mutationen in SQL (Insert, Update, Delete) ... 65
 AIFB
5.2 SQL-DLL: Definition eines Datenbankschemas ............... 8
24.05.2017
5
SQL - Structured Query Language
5.1 Allgemeines zu SQL .........................................................
64
5.4 Die Mutationen
(1|2)
DELETE
DELETE FROM table
[WHERE search condition];
Beispiel:
DELETE FROM ang-pro
WHERE ANG-NR = 3190;
 AIFB
SQL - Structured Query Language
Beispiel:
UPDATE projekt
SET P-LEITER = 3207, P-FILIALE = ’Mannheim’
WHERE P-NR = 761235;
24.05.2017
UPDATE
UPDATE table
SET column = expression [, column = expression …]
[WHERE search condition];
65
5.4 Die Mutationen
(2|2)
INSERT
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‘;
 AIFB
INSERT
INTO table [(column [, column …])]
query;
SQL - Structured Query Language
oder
24.05.2017
INSERT
INTO table [(column [, column …])]
VALUES (constant [, constant …]);
66
Beenden
SQL - Structured Query Language
 AIFB
24.05.2017
ENDE
67
Beispiel für „Natural Join“
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
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
ANG-NR
3115
2814
2814
3115
1324
Ergebnis:
P-NR
761235
770231
770008
770114
770231
PROZ-ARBZEIT
50
70
30
50
100
 AIFB
ANG-NR NAME
Meyer
3115
Klein
2814
Schmitt
1324
24.05.2017
P-NR, a.ANG-NR, NAME, WOHNORT, ABT-NR,PROZ-ARBZEIT
angestellte a, ang-pro ap
a.ANG-NR=ap.ANG-NR;
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
SQL - Structured Query Language
SELECT
FROM
WHERE
68
Beispiel für Join mit Joinbedingung
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:
P-NR
761235
770231
NAME
Meyer
Meyer
 AIFB
ANG-NR NAME
Meyer
3115
Klein
2814
Schmitt
1324
24.05.2017
P-NR, NAME
angestellte a, ang-pro ap
a.ANG-NR=ap.ANG-NR AND PROZ-ARBZEIT=50;
SQL - Structured Query Language
SELECT
FROM
WHERE
69
Beispiel für Abfragen mit Join (Spezialfall der Joinbed.: θ-Join)
ABT-NR
35
32
35
P-NR
761235
770008
770114
770231
NAME
Meyer
Klein
Schmitt
ANG-NR
3115
3115
3115
3115
2814
2814
2814
2814
1324
1324
1324
1324
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
(kartesisches
Produkt)
P-FILIALE P-LEITER
Karlsruhe
3115
Karlsruhe
3115
Heidelberg
1324
Mannheim
2814
Ergebnis:
P-NR
770114
770231
761235
770008
770114
761235
770008
770231
NAME
Meyer
Meyer
Klein
Klein
Klein
Schmitt
Schmitt
Schmitt
 AIFB
WOHNORT
Karlsruhe
Mannheim
Heidelberg
P-NAME
P-1
P-2
P-3
P-4
ANG-NR
3115
2814
1324
24.05.2017
P-NR, NAME
angestellte, projekt
ANG-NR <> P-LEITER;
SQL - Structured Query Language
SELECT
FROM
WHERE
70
Beispiel für Join mit 3 Relationen
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:
NAME P-FILIALE
Meyer Karlsruhe
Klein Karlsruhe
24.05.2017
NAME
Meyer
Klein
 AIFB
ANG-NR
3115
2814
NAME, P-FILIALE
angestellte a, ang-pro ap, projekt p
a.ANG-NR=ap.ANG-NR AND ap.P-NR=p.P-NR;
SQL - Structured Query Language
SELECT
FROM
WHERE
71
Beispiel für Mehrfach geschachtelte Queries Ergebnis:
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‘));
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
(#=n)
ABT-NR
35
30
32
30
35
35
32
32
31
31
30
31
Klein
Maus
Mayerlein
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
24.05.2017
Krämer
 AIFB
(#=k)
P-NR P-FILIALE P-LEITER
761235 Karlsruhe
3115
770008 Karlsruhe
3115
770114 Heidelberg
1324
770231 Mannheim
2814
Müller
SQL - Structured Query Language
projekt
P-NAME
P-1
P-2
P-3
P-4
Meyer
72
Beispiel für „Correlated subquery“ (äußere Referenz)
P-FILIALE P-LEITER
Karlsruhe
3115
Karlsruhe
3115
Heidelberg
1324
Mannheim
2814
Ergebnis:
P-FILIALE
Kalrsruhe
P-FILIALE P-LEITER
Karlsruhe
3115
2
Karlsruhe
3115
Heidelberg
1324
1
Mannheim
2814
1
 AIFB
P-NR
761235
770008
770114
770231
projekt b
P-NAME P-NR
P-1
761235
P-2
770008
P-3
770114
P-4
770231
SQL - Structured Query Language
projekt a
P-NAME
P-1
P-2
P-3
P-4
24.05.2017
SELECT DISTINCT P-FILIALE
FROM
projekt a
WHERE 1 <
(SELECT COUNT (*)
FROM
projekt b
WHERE b.P-FILIALE = a.P-FILIALE);
73
Beispiel für Abfragen mit Existenz-Quantor
P-FILIALE P-LEITER
Karlsruhe
3115
Karlsruhe
3115
Heidelberg
1324
Mannheim
2814
Ergebnis:
NAME
Müller
Maus
Groß
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
 AIFB
P-NR
761235
770008
770114
770231
angestellte
ANG-NR
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
SQL - Structured Query Language
projekt
P-NAME
P-1
P-2
P-3
P-4
24.05.2017
SELECT NAME
FROM angestellte
WHERE NOT EXISTS
(SELECT P-LEITER
FROM
projekt
WHERE P-LEITER = ANG-NR);
74
Beispiel für Mengenoperationen (Union)
Ergebnis:
angestellte
ANG-NR
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
ABT-NR
35
30
32
30
35
35
32
32
31
31
30
31
Zwischenergebnis:
ANG-NR
3115
3190
2314
2412
projekt
P-NAME
P-1
P-2
P-3
P-4
Zwischenergebnis:
ANG-NR
3115
3115
P-NR
761235
770008
770114
770231
P-FILIALE P-LEITER
Karlsruhe
3115
Karlsruhe
3115
Heidelberg
1324
Mannheim
2814
 AIFB
UNION
SELECT P-LEITER as ANG-NR
FROM projekt
WHERE P-FILIALE = ‘Karlsruhe‘;
24.05.2017
ANG-NR
3115
3190
2314
2412
3115
3115
SQL - Structured Query Language
SELECT ANG-NR
FROM angestellte
WHERE WOHNORT = ‘Karlsruhe‘
75
Beispiel für Mengenoperationen (INTERSECT)
Ergebnis:
SELECT ANG-NR
FROM angestellte
WHERE WOHNORT = ‘Karlsruhe‘
INTERSECT
Zwischenergebnis:
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
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
 AIFB
angestellte
ANG-NR
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:
SQL - Structured Query Language
SELECT ANG-NR
FROM ang-pro
GROUP BY ANG-NR
HAVING COUNT (ANG-NR) > 1;
24.05.2017
ANG-NR
3115
3190
76
Beispiel für Mengenoperationen (EXCEPT)
SELECT ANG-NR
FROM angestellte
WHERE NAME like ‘M%‘
EXCEPT
ANG-NR
3207
3190
1435
2412
3425
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
SQL - Structured Query Language
angestellte
ANG-NR
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
 AIFB
SELECT P-LEITER as ANG-NR
FROM projekt;
24.05.2017
Ergebnis:
77
Herunterladen