Dr. Heidrun BethgeDatenbanken1 MySQL relationales Datenbanksystem als Open-Source Internet-Datenbank...
of 93/93
Dr. Heidrun Bethge Datenbanken 1 MySQL • relationales Datenbanksystem • als Open-Source Internet- Datenbank sehr weit verbreitet, vorhandene Funktionalität ist gut&schnell • kostenfreie MySQL Community Edition • Diverse MySQL Server Lizenzmodelle • Dem kostenfreien MySQL fehlen jedoch einige Features, die
Dr. Heidrun BethgeDatenbanken1 MySQL relationales Datenbanksystem als Open-Source Internet-Datenbank sehr weit verbreitet, vorhandene Funktionalität ist
Text of Dr. Heidrun BethgeDatenbanken1 MySQL relationales Datenbanksystem als Open-Source Internet-Datenbank...
Folie 1
Dr. Heidrun BethgeDatenbanken1 MySQL relationales
Datenbanksystem als Open-Source Internet-Datenbank sehr weit
verbreitet, vorhandene Funktionalitt ist gut&schnell
kostenfreie MySQL Community Edition Diverse MySQL Server
Lizenzmodelle Dem kostenfreien MySQL fehlen jedoch einige Features,
die in groen kommerziellen DB-Systemen eine Selbstverstndlichkeit
sind
Folie 2
Dr. Heidrun BethgeDatenbanken2 Eigenschaften von MySQL I
Client-Server-Architektur: DB-Server + beliebig viele Clients, die
mit Server kommunizieren MySQL folgt dem ANSI-SQL Standard,
allerdings einige (wesentliche) Einschrnkungen Programmiersprachen:
Fr MySQL- Anwendungen gibt es viele APIs (Application Programming
Interfaces) bzw. Bibliotheken. Programmierung in C, C++, Java,
Perl, PHP, Python, Tcl mglich. ODBC: Durch ODBC-Schnittstelle kann
MySQL darber hinaus ber die gngigen Windows- Programmiersprachen
angesprochen werden.
Folie 3
Dr. Heidrun BethgeDatenbanken3 Eigenschaften von MySQL II
Plattformunabhngig: MySQL luft auf Macintosh, OS/2, Linux, Windows,
div. Unix- Varianten Geschwindigkeit: MySQL ist eine sehr schnelles
Datenbanksystem. Geschwindigkeitsvorteil jedoch auch durch fehlende
Merkmale wie z.B. Transaktionen in MyISAM-Tabellen. MySQL stellt
geringe Anforderungen an die Hardware. Untersttzung durch
weltweite, groe MySQL-Entwicklergemeinde.
Folie 4
Dr. Heidrun BethgeDatenbanken4 Einschrnkungen von MySQL
Sub-Selects/Deletes: SELECT * FROM table1 WHERE x IN (SELECT y FROM
table2) geht ab 4.1 Views (ab 5.0) Stored Procedures und Trigger
(eingeschrnkt ab 5.1) Transaktionen (eingeschrnkt ab 4.0). keine
freien DataWarehouse-Funktionen keine freien
Recovery-Mechanismen
Folie 5
Dr. Heidrun BethgeDatenbanken5 Windows oder Unix/Linux? MySQL
wurde ursprnglich fr Unix/Linux verwendet und erst spter auf
Windows portiert. Auf im Internet ffentlich zugnglichen Servern
luft MySQL fast nur unter Linux. -> intensiverer Praxiseinsatz
-> intensiver auf diesen Systemen getestet effizienterer Einsatz
unter Unix/Linux, da MySQL fr deren Prozess- und Thread- Modelle
optimiert ist fr Entwicklungsumgebung egal: hier funktioniert
Windows genauso gut
Folie 6
Dr. Heidrun BethgeDatenbanken6 Installation testen starten:
mysql/bin/mysql.exe jetzt Befehl status absetzen falls es nicht
klappt: Task-Manager. Prozess mysqld-nt.exe sollte laufen. evtl
auch aufrufen mit Parametern: mysql h 192.168.0.1 -u username
-p
Folie 7
Dr. Heidrun BethgeDatenbanken7 MySQL-Monitor mysql Nicht zu
verwechseln mit dem MySQL- Datenbank-Server, der evtl. als Dienst
luft. Start ber mysql/bin/mysql.exe evtl auch aufrufen mit
Parametern: mysql h localhost -u username p hier sind
Administrations- und Wartungsaufgaben interaktiv durchfhrbar;
Kommandointerpreter jeder Befehl wird durch Semikolon beendet,
Befehle knnen ber mehrere Zeilen gehen Mit Pfeiltasten lassen sich
Befehle wiederholen
Folie 8
Dr. Heidrun BethgeDatenbanken8 erstes Beispiel create database
test1; show databases; use test1; create table testtab ( id int not
null auto_increment, wert tinyint not null, primary key (id));
insert into testtab (wert) values (3); select * from testtab; drop
table testtab;
Folie 9
Dr. Heidrun BethgeDatenbanken9
Folie 10
Dr. Heidrun BethgeDatenbanken10 Entwicklungsgeschichte SQL SQL
(frherer Name: SEQUEL) ist zunchst Anfragesprache des relationalen
DBMS-Prototyps System R Implementierung ab 1975 im IBM
Forschungslabor in San Jose SQL wurde ab Anfang der 80er Jahre in
verschiedenen DB-Implementierungen verfgbar: IBM, Oracle,
DEC,...
Folie 11
Standardisierungen SQL Seit Anfang/Mitte der 80er Jahre
Standardisierungsaktivitten am ANSI fr eine relationale DB-Sprache
auf Basis von SQL ANSI SQL-86 (SQL1) ANSI SQL-92 (SQL2) ANSI SQL-99
(SQL3) ANSI SQL-2003 ANSI SQL/XML-2006 ANSI SQL-2008 Bis heute ist
(vermutlich) noch kein relationales DBMS Full SQL konform. SQL der
groen DBMS weitgehend kompatibel. Dr. Heidrun
BethgeDatenbanken11
Folie 12
Dr. Heidrun BethgeDatenbanken12 Sprachumfang von SQL DDL Data
Definition Language Erstellen von Tabellen, Indices, Views, DQL
Data Query Language Abfragen von Daten DML Data Manipulation
Language Anlegen, ndern, Lschen von Daten DCL Data Control Language
Anlegen von Benutzern, Vergabe von Zugriffsrechten TCL Transaction
Control Language Steuerung von Transaktionen
Folie 13
Verwendung von SQL SQL ist Anweisungssprache. SQL ist keine
Programmiersprache. Reihenfolge der SQL-Klauseln ist fix. SQL ist
nicht case-sensitiv (Ausnahme: Tabellen- und Feldnamen z.B. in
bestimmten Oracle-Tabellen). Beliebiges Einfgen von Leerzeichen,
Leerzeilen, Tabs mglich. Dr. Heidrun BethgeDatenbanken13
Dr. Heidrun BethgeDatenbanken15 CREATE TABLE Beispiel CREATE
TABLE teilnehmer ( TnNr int(11) NOT NULL PRIMARY KEY, Name
varchar(12), Ort varchar(12), tnalter int(11) default NULL ) ;
Alternativ: CREATE TABLE teilnehmer ( TnNr int(11) NOT NULL, Name
varchar(12), Ort varchar(12), tnalter int(11) default NULL, PRIMARY
KEY (TnNr) ) ;
Folie 16
Dr. Heidrun BethgeDatenbanken16 CREATE TABLE: Feldoptionen NOT
NULL DEFAULT defaultwert PRIMARY KEY (gleichzeitig NOT NULL
erforderlich) AUTO_INCREMENT (nicht ANSI, z.B. in MySQL)
Folie 17
Dr. Heidrun BethgeDatenbanken17 References in MySQL z.B. fr
InnoDB-Tabellen implementiert nicht jedoch im
Standard-Tabellenformat MyISAM dient der berwachung referentieller
Integritt CREATE TABLE parent( parentid INT NOT NULL PRIMARY KEY)
ENGINE=INNODB; CREATE TABLE child( childid INT NOT NULL PRIMARY
KEY, parentid INT, INDEX par_ind (parentid), FOREIGN KEY (parentid)
REFERENCES parent(parentid) ON DELETE SET NULL) ENGINE=INNODB;
Folie 18
Dr. Heidrun BethgeDatenbanken18 Namensgebung mglichst klare
Feld- und Tabellennamen einheitliches Schema fr die Benennung von
Feldern und Tabellen z.B. einheitlich: Singular title oder Plural
titles Feldnamen evtl. Rckschluss auf Tabelle und/oder
Datentyp
Folie 19
Dr. Heidrun BethgeDatenbanken19 MySQL-Datentypen Integer
Tinyint8-Bit-Integer-128 - +127 Smallint16-Bit-Integer
Mediumint24-Bit-Integer Int, Integer32-Bit-Integer
Bigint64-Bit-Integer Attribut UNSIGNED: nur positive Zahlen.
Ansonsten +- AUTO_INCREMENT (kein ANSI-SQL). Attribut PRIMARY KEY
oder UNIQUE mssen gleichzeitig gesetzt sein Es gibt auch Int(x)
(x-stellig), dient jedoch nur der Formatierung,keine
Stelleneinschrnkung
Folie 20
Dr. Heidrun BethgeDatenbanken20 MySQL Datentypen Fliekomma
FLOAT8 Stellen, 4 Byte REAL/DOUBLE16 Stellen, 8 Byte DOUBLE(6,3)
hat 6 Stellen vor und 3 Stellen nach dem Dezimalpunkt 123456.789
Anz. Nachkommastellen festlegen bewirkt Rundung DECIMAL(p,s)p:
gesamte Stellenanzahl, s: Nachkommazahlen. Festkommazahl.
DECIMAL(8,3) 99999.999 bis 99999.999 NUMERIC, DEC Synonyme fr
DECIMAL
Folie 21
Dr. Heidrun BethgeDatenbanken21 MySQL Datentypen Datum/Zeit
DATE3 Byte '2012-05-10' Bereich 1000-01-01 bis 9999-12-31 TIME3
Byte '23:59:59' Bereich +/- 838:59:59 DATETIME 8 Byte '2012-05-10
23:59:59' YEAR 1 Byte Jahreszahl 1900-2155 TIMESTAMP Datum und Zeit
in der Form '20120510235959' zw. 1970 und 2038. Wird bei nderung
des Datensatzes automatisch aktualisiert.
Folie 22
Dr. Heidrun BethgeDatenbanken22 MySQL Datentypen Zeichenketten
CHAR(n)max. 255 Zeichen, n Byte VARCHAR(n) variable Lnge, max. n
Zeichen (
Dr. Heidrun BethgeDatenbanken23 MySQL Datentypen fr Binrdaten
nicht ANSI! BLOB: Binary Large Object TINYBLOBBinrdaten mit var.
Lnge, max. 255 Byte BLOB (2 16 -1 Byte), MEDIUMBLOB (2 24 -1 Byte),
LONGBLOB (2 32 -1 Byte) Vorteil: auch Binrdateien unterliegen DB-
Zugriffsschutz eventuell nur Links in der Datenbank abspeichern,
Binrdaten in externen Dateien speichern -> schnellerer
Datenbankzugriff
Folie 24
Dr. Heidrun BethgeDatenbanken24 MySQL Datentypen fr Aufzhlungen
ENUM Auswahl einer von max. 65535 Zeichenketten (1-2 Byte) CREATE
TABLE testenum (color ENUM (`red, `green, `blue, `white)) INSERT
testenum VALUES (`red) SET Kombination von max. 255 Zeichenketten,
Mehrfachauswahl mglich (1-8 Byte) CREATE TABLE testset (fontattr
SET (`bold, `italic, `underlined)) INSERT testset VALUES
(`bold,italic)
Folie 25
Dr. Heidrun BethgeDatenbanken25 Indizes Beschleunigen Zugriff
auf DB verlangsamen nderungen in DB und bentigen Speicherplatz
Maximal 16 Indizes pro Tabelle auch fr mehrere Felder gleichzeitig
Index sinnlos, wenn Feld sehr viele gleiche Eintrge hat ->
Normalisierung! UNIQUE macht Index effizienter, eineindeutig
PRIMARY Primrschlssel Beschrnkung der Indexlnge bei CHAR und
VARCHAR mglich, bei xxxTEXT und BLOB erforderlich.
Folie 26
Dr. Heidrun BethgeDatenbanken26 Indizes II MySQL kann Indizes
in folgenden Fllen nicht nutzen: Ungleichoperationen (WHERE column
!=...) Funktionen (WHERE DAY(datum)=...) Primr- und Fremdschlssel
haben untersch. Typ LIKE `%abc`
Folie 27
Dr. Heidrun BethgeDatenbanken27 CREATE INDEX Folgende Ausdrcke
sind gleichwertig fr die Indexerstellung: CREATE TABLE booktitle (
titleID..., title..., publisher..., year..., PRIMARY KEY..., INDEX
idxtitle (title)) CREATE INDEX idxtitle on booktitle (title) ALTER
TABLE booktitle ADD INDEX idxtitle (title)
Folie 28
Dr. Heidrun BethgeDatenbanken28 Tabellendateien MySQL
tabelle.frm Tabellenschema (Datentypen, Indizes...) tabelle.myd
MyISAM-Tabellendaten tabelle.myi MyISAM-Indizes (alle Indizes der
Tab.) tabelle.db Berkeley-DB-Tabelle (Daten+Indizes) hier sind auch
Transaktionen mglich
Folie 29
Dr. Heidrun BethgeDatenbanken29 ALTER TABLE ALTER TABLE tblname
tbloptions ALTER TABLE ADD newcolname coltype coloptions
[FIRST|AFTER existingcolumn] ALTER TABLE tblname MODIFY colname
coltype coloptions ALTER TABLE tblname CHANGE oldcolname newcolname
coltype coloptions ALTER TABLE tblname DROP colname ALTER TABLE
tblname DROP INDEX iname ALTER TABLE tblname DROP PRIMARY KEY
Folie 30
Dr. Heidrun BethgeDatenbanken30 INSERT
Folie 31
Dr. Heidrun BethgeDatenbanken31 Beispiel INSERT Fge einen neuen
Teilnehmer (TnNr 200) fr Kurs G08 und AngNr 1 in die
Gebhren-Relation ein. Die Teilnahmegebhr sei noch nicht bekannt.
INSERT INTO gebuehren VALUES (1,G08, 200,NULL) alternativ: INSERT
INTO gebuehren (angnr, kursnr, tnnr) VALUES (1,G08, 200,NULL) Fge
ein neues Kursangebot (AngNr 3) fr G08 fr den 15.3.2014 in Ulm ein.
INSERT INTO angebot VALUES (3,G08,15.03.2014,Ulm)
Folie 32
Dr. Heidrun BethgeDatenbanken32 SELECT
Folie 33
Dr. Heidrun BethgeDatenbanken33 SELECT * Gib die
Teilnehmer-Relation komplett aus. SELECT * FROM Teilnehmer;
Folie 34
Dr. Heidrun BethgeDatenbanken34 SELECT FROM Gib aus der
Teilnehmer-Relation die Attribute Name, TnNr, Ort aus, und zwar in
dieser Reihenfolge. SELECT Name, TnNr, Ort FROM Teilnehmer;
Folie 35
Dr. Heidrun BethgeDatenbanken35 SELECT DISTINCT Gib alle Orte
aus, aus denen Teilnehmer kommen. SELECT ortSELECT DISTINCT ortFROM
teilnehmer; ohne Duplikateliminierungmit Duplikateliminierung
Folie 36
Dr. Heidrun BethgeDatenbanken36 SELECT FROM WHERE SELECT TnNr,
Name, Ort FROM Teilnehmer WHERE Ort = 'Ulm'; SELECT * FROM
Teilnehmer WHERE Ort = 'Ulm'; SELECT * FROM Teilnehmer WHERE TnNr
>= 100
Folie 37
Dr. Heidrun BethgeDatenbanken37 AND, OR Vergleichs-Ausdrcke
knnen mit AND und OR verknpft werden:... TnNr > 100 AND TnNR
< 200... Ort = 'Ulm' OR Ort = 'Neu-Ulm'... (Ort = 'Ulm' OR Ort =
'Neu-Ulm') AND TnNr > 100
Folie 38
Dr. Heidrun BethgeDatenbanken38 Vergleichsoperatoren... TnNr
BETWEEN 100 AND 200 ist quivalent zu:... TnNr >= 100 AND
TnNR
Dr. Heidrun BethgeDatenbanken41 Berechnete Felder Gib aus, bei
welcher Kursliteratur ein Unterbestand (Bestand kleiner als Bedarf)
vorhanden ist und wie hoch die Beschaffungskosten hierfr sind.
SELECT KursNr, Bedarf-Bestand, (Bedarf- Bestand)*Preis FROM KursLit
WHERE Bedarf > Bestand; Problem: wenig aussagekrftige
Spaltennamen
Folie 42
Dr. Heidrun BethgeDatenbanken42 Felder benennen Abhilfe:
Umbenennen der Attribute SELECT KursNr, Bedarf-Bestand AS
Minusbestand, (Bedarf-Bestand)*Preis AS Beschaffungskosten FROM
KursLit WHERE Bedarf > Bestand;
Folie 43
Dr. Heidrun BethgeDatenbanken43 einige String-Funktionen
LCASE(string) string in Kleinbuchstaben UCASE(string) string in
Grobuchstaben LENGTH(string) LOCATE(suchstr, string) LEFT(string,
anz), RIGHT(string, anz) SUBSTRING(string, start [,lnge])
LTRIM(string), RTRIM(string) Entfernen von Blanks (vorne/hinten)
TRIM(string) Entfernen von Blanks vorne+hinten CHAR(num.Wert)
CHAR(123)->123 (String)
Folie 44
Dr. Heidrun BethgeDatenbanken44 Datums-Funktionen Gib die
Angebotsrelation, sortiert nach Datum, mit separaten Spalten fr
Tag, Monat und Jahr aus. SELECT AngNr, KursNr, day(datum) AS Tag,
month(datum) AS Monat, year(datum) AS Jahr, Ort FROM Angebot ORDER
BY Datum;
Folie 45
Dr. Heidrun BethgeDatenbanken45 ORDER BY Gib alle Kurs-Angebote
fr die Kurse 'P13' und 'I09' sortiert nach Datum (das aktuellste
zuerst), Angebotsnummer und Ort (jeweils aufsteigend) aus. SELECT *
FROM Angebot WHERE KursNr = P13 OR KursNr = I09 ORDER BY Datum
DESC, AngNr, Ort; Die ORDER BY-Klausel kann in einem
Anfrageausdruck nur einmal und zwar ganz am Schlu auftreten.
Folie 46
Dr. Heidrun BethgeDatenbanken46 Operatoren und Konventionen
NOT! OR|| AND&& =, ,!=, =, > +, -, *, / Zeichenkette
bzw. Zeichenkette Zahlen: -2002 -123.456
Dr. Heidrun BethgeDatenbanken48 Beispiele Aggregatfunktionen
Gib die Anzahl aller Kursteilnehmer aus 'Ulm' aus. SELECT COUNT(*)
FROM Teilnehmer WHERE Ort = Ulm; Gib das durchschnittliche Gehalt
aller Kursleiter aus. SELECT AVG(Gehalt) FROM Kursleiter; Wenn eine
SELECT-Anweisung eine Aggregatfunktion enthlt, so wird nur max. ein
Resultat-Tupel erzeugt.
Folie 49
Dr. Heidrun BethgeDatenbanken49 Verbund alte Form
Folie 50
Dr. Heidrun BethgeDatenbanken50 Beispiel Verbund Gib aus,
welche Kursangebote (Ausgabe: KursNr, AngNr) von welchen
Kursleitern (Ausgabe: Name) durchgefhrt werden. Bisherige Form:
SELECT f.KursNr, f.AngNr, lt.Name FROM Fuehrt_durch f, Kursleiter
lt WHERE f.PersNr = lt.PersNr;
Folie 51
Dr. Heidrun BethgeDatenbanken51 JOIN join-condition-j1 kann nur
Attribute referenzieren, die im Scope von table1 oder table2
auftreten, nicht jedoch solche aus table3. join-condition-j2 kann
auf alle Attribute der zuvor spezifizierten Tabellen (linke Seite)
sowie die von table3 zugreifen. Diese Join-Form macht insbesondere
dann Sinn, wenn die Join-Spalten verschiedene Namen haben und/oder
andere Join-Bedingungen als "=" ausgedrckt werden sollen.
Folie 52
Dr. Heidrun BethgeDatenbanken52 JOIN Beispiel Gib aus, welche
Kursangebote (Ausgabe: KursNr, AngNr) von welchen Kursleitern
(Ausgabe: Name) durchgefhrt werden. SELECT KursNr, AngNr, Name FROM
Fuehrt_durch INNER JOIN Kursleiter ON Kursleiter.PersNr =
Fuehrt_durch.PersNr Krzere Schreibweise mit Alias-Namen fr die
Tabellen: SELECT f.KursNr, f.AngNr, lt.Name FROM Fuehrt_durch f
INNER JOIN Kursleiter lt ON f.PersNr = lt.PersNr
Folie 53
Dr. Heidrun BethgeDatenbanken53 NATURAL JOIN SELECT select-list
FROM table1 NATURAL JOIN table2 Das ID-Feld in den beiden Tabellen
muss den gleichen Namen haben und vom gleichen Typ sein
Folie 54
Dr. Heidrun BethgeDatenbanken54 OUTER JOIN SELECT select-list
FROM table1 LEFT [OUTER] JOIN table2 ON... SELECT select-list FROM
table1 RIGHT [OUTER] JOIN table2 ON... nicht in MySQL: SELECT
select-list FROM table1 FULL [OUTER] JOIN table2 ON...
Folie 55
Dr. Heidrun BethgeDatenbanken55 LEFT JOIN - Beispiel Gib alle
Kurse mit ihren Voraussetzungen aus. SELECT k.KursNr, k.Titel,
v.VorNr Voraus_KursNr FROM Kurs k LEFT JOIN Vorauss v ON k.KursNr =
v.KursNr;
Dr. Heidrun BethgeDatenbanken56 Vorgehensweise bei Join 1.
Auszugebende Werte/Attribute bestimmen 2. Potentiell relevante
Entities bestimmen 3. "Join-Pfad" + Join-Attribute bestimmen 4.
Optional: "Abwahl" der nicht bentigten Entities Gib aus, welche
Kursangebote (Ausgabe: KursNr, Titel, AngNr, Datum, Ort) von
welchen Kursleitern (Ausgabe: PersNr) durchgefhrt werden. Zu 1:
KursNr, Titel, AngNr, Datum, Ort, PersNr Zu 2: Kurs, Angebot,
Kursleiter Zu 3: Kurs -> Angebot -> Fuehrt_durch ->
Kursleiter (KursNr) (AngNr,KursNr) (PersNr) Zu 4: Kursleiter
Folie 57
Dr. Heidrun BethgeDatenbanken57 Bsp. Join SELECT k.KursNr,
k.Titel, f.AngNr, a.Datum, a.Ort, f.PersNr FROM Kurs k INNER JOIN
Angebot a ON k.KursNr = a.KursNr INNER JOIN Fuehrt_durch f ON
a.AngNr = f.AngNr AND a.KursNr = f.KursNr; alt: SELECT k.KursNr,
k.Titel, f.AngNr, a.Datum, a.Ort, f.PersNr FROM Kurs k, Angebot a,
Fuehrt_durch f WHERE k.KursNr = a.KursNr AND a.AngNr = f.AngNr AND
a.KursNr = f.KursNr;
Folie 58
Dr. Heidrun BethgeDatenbanken58 Aufgaben Join I 1.Gib aus,
welche Teilnehmer (Ausgabe: TnNr) an Kurs 'G08' oder 'G10'
(Ausgabe: KursNr, AngNr, Ort) teilnehmen. 2.Gib alle Kursangebote
(Ausgabe: alles) zusammen mit den vorliegenden Anmeldungen (TnNr)
aus.
Folie 59
Dr. Heidrun BethgeDatenbanken59 Aufgaben Join II 2.Gib alle
Kursangebote (Ausgabe: alles) zusammen mit den vorliegenden
Anmeldungen (TnNr) aus. 3.Wie Aufgabe 2, aber zustzlich zur
Teilnehmernummer soll jeweils auch noch der Teilnehmername
ausgegeben werden. 4.Gib alle Kursangebote aus, fr die sich kein
Teilnehmer angemeldet hat. Hinweis: WHERE... IS [NOT] NULL
Folie 60
Dr. Heidrun BethgeDatenbanken60 Aufgaben Aggregatfunktionen
1.Gib das hchste, das niedrigste und das durchschnittliche
Kursleiter-Gehalt sowie die Summe aller Gehlter aus. 2.Gib die
Anzahl der verschiedenen Orte aus, aus denen die Kursteilnehmer
kommen.
Folie 61
Dr. Heidrun BethgeDatenbanken61 Gruppierung - Problem Gib auf
Basis der Teilnehmer-Relation eine ortsbezogene Teilnehmerstatistik
aus. D.h. gib aus, wie viele Teilnehmer aus welchem Ort kommen
(Ausgabe: Ortsname, Teilnehmerzahl). SELECT Ort, COUNT... ? FROM
Teilnehmer Lsung: Gruppierung SELECT Ort, COUNT(Ort) Anzahl FROM
Teilnehmer GROUP BY Ort;
Folie 62
Dr. Heidrun BethgeDatenbanken62 Group by Having Syntax
Folie 63
Dr. Heidrun BethgeDatenbanken63 Group By GROUP BY bewirkt
(interne) Teilmengenbildung (Gruppierung) der Ergebnis-Relation
entsprechend dem Gruppierungsattribut bzw. den Attributen (->
Menge von Mengen). Aggregationsfunktionen werden jeweils auf
Teilmengen (falls vorhanden) angewandt. Eventuelle Joins werden vor
Anwendung der Gruppierungsfunktion ausgefhrt, (Reihenfolge jetzt
also: FROM - WHERE - GROUP BY- HAVING - ORDER BY - SELECT)
Folie 64
Dr. Heidrun BethgeDatenbanken64 Having
Gruppierungsnebenbedingungen werden mittels HAVING-Klausel
ausgedrckt (HAVING kann nur in Verbindung mit GROUP BY auftreten).
Unterschied zwischen WHERE und HAVING: WHERE eliminiert Zeilen
HAVING eliminiert Gruppen
Folie 65
Dr. Heidrun BethgeDatenbanken65 bung Group by - Having 1.Gib fr
alle Kursangebote die Anzahl der Anmeldungen aus (Ausgabe:
Angebote- Attribute, Anzahl Teilnehmer). 2.Wie vorheriges, aber nur
solche Kurse ausgeben, fr die mehr als 2 Anmeldungen vorliegen.
3.Gib alle Kurstypen (KursNr) - mit Ausnahme der Grundlagenkurse
('G08', 'G10') - aus, fr die mehr als 4 Anmeldungen vorliegen.
Folie 66
Unterabfragen Dr. Heidrun BethgeDatenbanken66
Folie 67
Dr. Heidrun BethgeDatenbanken67 Motivation Unterabfragen I
Welche Artikel haben einen Preis, der ber dem Durchschnittspreis
liegt? SELECT AVG(Einzelpreis) AS avgpreis FROM Artikel; Ergebnis
(z.B): avgpreis 134.05 SELECT Artikelname FROM Artikel WHERE
Einzelpreis>134.05; zwei Abfragen notwendig
Folie 68
Dr. Heidrun BethgeDatenbanken68 Motivation Unterabfragen II Nur
eine Abfrage mittels Unterabfrage (= Sub-Select, Subquery): SELECT
Artikelname, Einzelpreis FROM Artikel WHERE Einzelpreis > (
SELECT AVG(Einzelpreis) FROM Artikel); Hier notwendig, dass
Unterabfrage nur einen Wert liefert (scalar subquery) und dass die
Datentypen der verglichenen Felder zusammenpassen.
Folie 69
Dr. Heidrun BethgeDatenbanken69 scalar subquery Unterabfragen,
welche nur einen Wert zurckliefern, werden eingeleitet durch
Vergleichsoperatoren (=;; ;>=) weiteres Beispiel: Suche alle
Kunden heraus, die im gleichen Ort wohnen wie der Kunde Nr. 123
SELECT kundennr, ort FROM kunde WHERE ort = (SELECT ort FROM kunde
WHERE kundennr=123);
Folie 70
Dr. Heidrun BethgeDatenbanken70 table subquery = Unterabfrage,
welche eine Tabelle zurckliefert. Mit folgenden Bedingungen werden
diese Unterabfragen eingeleitet ( ist Vergleichsoperator (=;;
;>=)): [NOT] INprft, ob ein Wert in der Ergebnismenge der
Unterabfrage enthalten ist. [NOT] EXISTS prft, ob die Unterabfrage
mindestens eine Zeile erbringt, die der Bedingung gengt. Liefert
True/False zurck. ANY SOME prft, ob die Bedingung fr irgendeine
Zeile der Unterabfrage zutrifft ALLprft, ob die Bedingung fr alle
Zeilen der Unterabfrage zutrifft.
Folie 71
Dr. Heidrun BethgeDatenbanken71 Unterabfrage mit IN Suche alle
Kunden heraus, die im gleichen Ort wohnen wie die Kunden Nr. 123
oder 124. SELECT kundennr, ort FROM kunde WHERE ort IN (SELECT ort
FROM kunde WHERE kundennr=123 OR kundennr=124);
Folie 72
Dr. Heidrun BethgeDatenbanken72 Unterabfrage mit EXISTS Suche
alle Artikelkategorien (Getrnke, Ssswaren...) heraus, denen
mindestens ein Artikel zugeordnet ist: SELECT kategoriename FROM
kategorie WHERE EXISTS (SELECT * FROM artikel WHERE
artikel.kategorienr=kategorie.kategorienr) korrelierte
Unterabfrage! obiges ist auch ohne Unterabfrage lsbar
Folie 73
Dr. Heidrun BethgeDatenbanken73 nicht-korrelierte und
korrelierte Unterabfragen I
Folie 74
Dr. Heidrun BethgeDatenbanken74 nicht-korrelierte und
korrelierte Unterabfragen II In Unterabfragen kann auf Tabellen von
ueren Abfrage-Ausdrcken Bezug genommen werden: korrelierte
Unterabfragen. Nachteil: Fr jeden Datensatz der aufrufenden Abfrage
muss die Unterabfrage einzelnd ausgefhrt werden. Bei semantisch
quivalenten Anfrageformulierungen mit und ohne Korrelation knnen
sich stark unterschiedliche Antwortzeiten ergeben. Dies ist auch
abhngig von Anfragebearbeitungs- Strategie bzw. Gte der
Anfrage-Optimierung des verwendeten DBMS
Folie 75
Dr. Heidrun BethgeDatenbanken75 Syntax Unterabfrage mit EXISTS
SELECT Attributliste FROM Rel1, Rel2,..., Reln WHERE [ NOT ] EXISTS
( Tabellenausdruck ) Der Subselect-Ausdruck (EXISTS) liefert nur
TRUE (Treffer gefunden) oder FALSE (keine Treffer).
Folie 76
Dr. Heidrun BethgeDatenbanken76 Syntax Unterabfrage mit ANY /
ALL / IN
Folie 77
Dr. Heidrun BethgeDatenbanken77 weiteres zu Unterabfragen = ANY
ist quivalent zu IN, ALL ist quivalent zu NOT IN. Unterabfragen
knnen geschachtelt sein, d.h. sie knnen wiederum Unterabfragen
enthalten. Hufig knnen Unterabfragen auch ersetzt werden durch
join-Abfragen ohne Unterabfragen. Dies geht dann nicht, wenn die
Unterabfrage eine Mengenfunktion beinhaltet.
Folie 78
Dr. Heidrun BethgeDatenbanken78 Unterabfrage vs. Join Gib alle
Kursangebote aus (Ausgabe: KursNr, AngNr), fr die Teilnehmer aus
'Ulm' gebucht haben. SELECT DISTINCT nt.KursNr, nt.AngNr FROM
Nimmt_teil nt INNER JOIN Teilnehmer As t ON nt.TnNr = t.TnNr WHERE
t.Ort = Ulm SELECT DISTINCT nt.KursNr, nt.AngNr FROM Nimmt_teil nt
WHERE EXISTS (SELECT * FROM Teilnehmer AS t WHERE t.Ort = Ulm AND
t.TnNr = nt.TnNr)
Folie 79
Dr. Heidrun BethgeDatenbanken79 Bsp. Unterabfrage mit ANY / IN
SELECT DISTINCT nt.Kursnr, nt.AngNr FROM Nimmt_teil nt WHERE
nt.TnNr = ANY (SELECT TnNr FROM Teilnehmer WHERE Ort = 'Ulm')
SELECT DISTINCT nt.KursNr, nt.AngNr FROM Nimmt_teil nt WHERE
nt.TnNr IN (SELECT TnNr FROM Teilnehmer WHERE Ort = 'Ulm')
Folie 80
Paarweise Vergleiche SELECT name, ort FROM teilnehmer WHERE
(tnalter, ort) = (SELECT tnalter, ort FROM teilnehmer WHERE
name='Schulze') AND name 'Schulze'; Keine paarweisen Vergleiche auf
SQL-Server mglich. Dr. Heidrun BethgeDatenbanken80
Folie 81
Dr. Heidrun BethgeDatenbanken81 Unterabfragen umgehen SELECT *
FROM tabelle1 WHERE tabelle1.id IN (SELECT tabelle2.id FROM
tabelle2); wird ersetzt durch SELECT tabelle1.* FROM tabelle1 INNER
JOIN tabelle2 ON tabelle1.id=tabelle2.id; SELECT * FROM tabelle1
WHERE id NOT IN (SELECT id FROM tabelle2); SELECT * FROM tabelle1
WHERE NOT EXISTS (SELECT id FROM tabelle2 WHERE
tabelle1.id=tabelle2.id); wird ersetzt durch SELECT tabelle1.* FROM
tabelle1 LEFT JOIN tabelle2 ON tabelle1.id=tabelle2.id WHERE
tabelle2.id IS NULL;
Folie 82
Dr. Heidrun BethgeDatenbanken82 Aufgaben Unterabfragen 1.Gib
die Personalnummer des Kursleiters mit dem niedrigsten Gehalt aus.
2.Wie lautet der Titel des Kurses mit der gnstigsten Kursliteratur?
3.Bestimme alle Kursangebote (Kurstitel und Angebotsnummer), zu
denen es noch keine Teilnehmer gibt. Verwenden Sie eine korrelierte
und eine nicht- korrelierte Unterabfrage. 4.Gib alle Kursleiter
aus, die mindestens zwei Kurse leiten. Ausgabe: Personaldaten,
Angebotsdaten, sortiert nach PersNr.
Folie 83
INLINE-VIEW = Unterabfragen im FROM oder JOIN SELECT * FROM
(SELECT * FROM tabelle 1) t1 INNER JOIN (SELECT * FROM tabelle2) t2
ON t1.feld1=t2.feld2 Korrelierte Abfragen lassen sich hufig durch
Inline- Views umgehen. Auswertungen auf gruppierten Daten mit
Aggregaten hiermit mglich. Dr. Heidrun BethgeDatenbanken83
Folie 84
INLINE-VIEW Beispiel 1 Stadt, in der die meisten Teilnehmer
wohnen: SELECT max(a.Anzahl) FROM (SELECT ort, count(*) Anzahl FROM
teilnehmer GROUP BY ort) a MySQL: bentigt Alias fr Inline-View.
SELECT ort, max(a.Anzahl) mglich. Oracle: bentigt keinen Alias,
Ausgabe von ort nicht mglich. Dr. Heidrun BethgeDatenbanken84
Folie 85
INLINE-VIEW Beispiel 2 Alle Mitarbeiter, die mehr verdienen als
der Durchschnitt ihrer Abteilung SELECT m1.nachname,
m1.abteilungsnr FROM mitarbeiter m1 INNER JOIN (SELECT
m2.abteilungsnr, AVG(m2.gehalt) AS durchschnitt FROM mitarbeiter m2
GROUP BY m2.abteilungsnr) g ON m1.abteilungsnr=g.abteilungsnr WHERE
m1.gehalt > g.durchschnitt; Dr. Heidrun BethgeDatenbanken85
Folie 86
Unterabfragen im HAVING gleiches Vorgehen wie bei Unterabfragen
in WHERE SELECT ort, count(*) Anzahl FROM teilnehmer GROUP BY ort
HAVING ort NOT IN (SELECT ort FROM angebot); Dr. Heidrun
BethgeDatenbanken86
Folie 87
Unterabfragen in CREATE, UPDATE, DELETE CREATE TABLE
kopie_kursleiter AS SELECT * FROM kursleiter; UPDATE
kopie_kursleiter SET gehalt=gehalt+100 WHERE persnr in (SELECT
persnr FROM fuehrt_durch); DELETE FROM kopie_kursleiter WHERE
persnr NOT IN (SELECT persnr FROM fuehrt_durch); Dr. Heidrun
BethgeDatenbanken87
Folie 88
SELECT feld1, feld2 FROM tabelle1 UNION | UNION ALL | INTERSECT
| MINUS/EXCEPT SELECT feld3, feld4 FROM tabelle2 UNION:
Vereinigungsmenge ohne Duplikate UNION ALL: mit Duplikaten
INTERSECT: Schnittmenge MINUS (Oracle) / EXCEPT (SQL-Server):
Differenz INTERSECT und MINUS in MySQL nicht vorhanden
SET-Operatoren Dr. Heidrun BethgeDatenbanken88
Folie 89
Beispiele SET-Operatoren Gib alle Orte aus, wo Angebote
stattfinden oder Teilnehmer wohnen. SELECT ort FROM angebot UNION
SELECT ort FROM teilnehmer; Gib alle Angebotsorte aus, wo
gleichzeitig Teilnehmer wohnen. SELECT ort FROM angebot INTERSECT
SELECT ort FROM teilnehmer; Gib alle Angebotsorte aus, wo kein
Teilnehmer wohnt. SELECT ort FROM angebot MINUS SELECT ort FROM
teilnehmer; Dr. Heidrun BethgeDatenbanken89
Folie 90
Regeln fr SET-Operatoren Die erste SELECT-Anweisung gibt vor:
Anzahl Felder Feldnamen Feldreihenfolge Felddatentypen Die
folgende(n) SELECT-Anweisung(en) mssen bereinstimmen in Anzahl
Felder Feldreihenfolge Felddatentypen ORDER BY wird einmal fr alle
Datenstze gemeinsam am Ende der Anweisung verwendet Dr. Heidrun
BethgeDatenbanken90
Folie 91
Beispiel UNION SELECT 'T' typ, name, ort FROM teilnehmer WHERE
name like 'M%' UNION SELECT 'K' typ, name, NULL FROM kursleiter
WHERE name like 'M%' ORDER BY name; Dr. Heidrun
BethgeDatenbanken91
Folie 92
UNION anstelle FULL OUTER JOIN Nicht jedes DBMS hat die FULL
OUTER JOIN-Funktionalitt! Gib alle Lieferanten und alle von ihnen
gelieferten Produkte aus. Lieferanten ohne Produkte und Produkte
ohne Lieferanten sollen ebenfalls mit ausgegeben werden. SELECT
l.firma, p.produktname FROM lieferant l LEFT JOIN produkt p ON
l.lieferantid=p.lieferantid UNION SELECT l.firma, p.produktname
FROM lieferant l RIGHT JOIN produkt p ON
l.lieferantid=p.lieferantid Wie kann dieses Beispiel gelst werden
ohne LEFT/RIGHT JOIN? Dr. Heidrun BethgeDatenbanken92
Folie 93
Aufgaben SET-Operatoren Lsen Sie folgende Aufgaben in Oracle
auf dem Uni- Schema mittels SET-Operatoren. Lassen sich die
Aufgaben auch ohne SET-Operator und ohne Unterabfrage lsen? Warum
(nicht)? 1.Alle Studenten-Namen, die bei Sokrates Vorlesungen hren,
aber keine Vorlesungen bei Popper hren. 2.Alle Vorlesungen mit 4
Semesterwochenstunden (sws), in der noch kein Student eine Prfung
abgelegt hat. 3.Alle Vorlesungen mit 4 Semesterwochenstunden (sws),
in der mindestens ein Student eine Prfung abgelegt hat. 4.Alle
Professoren, die keine Vorlesung halten, aber einen Assistenten
haben. Dr. Heidrun BethgeDatenbanken93