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 in großen kommerziellen DB-Systemen eine Selbstverständlichkeit sind Dr. Heidrun Bethge Datenbanken
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) Einschränkungen Programmiersprachen: Für MySQL-Anwendungen gibt es viele APIs (Application Programming Interfaces) bzw. Bibliotheken. Programmierung in C, C++, Java, Perl, PHP, Python, Tcl möglich. ODBC: Durch ODBC-Schnittstelle kann MySQL darüber hinaus über die gängigen Windows-Programmiersprachen angesprochen werden. Dr. Heidrun Bethge Datenbanken
Eigenschaften von MySQL II Plattformunabhängig: MySQL läuft 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. Unterstützung durch weltweite, große MySQL-Entwicklergemeinde. Dr. Heidrun Bethge Datenbanken
Einschränkungen 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 (eingeschränkt ab 5.1) Transaktionen (eingeschränkt ab 4.0). keine freien DataWarehouse-Funktionen keine freien Recovery-Mechanismen Dr. Heidrun Bethge Datenbanken
Windows oder Unix/Linux? MySQL wurde ursprünglich für Unix/Linux verwendet und erst später auf Windows portiert. Auf im Internet öffentlich zugänglichen Servern läuft MySQL fast nur unter Linux. -> intensiverer Praxiseinsatz -> intensiver auf diesen Systemen getestet effizienterer Einsatz unter Unix/Linux, da MySQL für deren Prozess- und Thread-Modelle optimiert ist für Entwicklungsumgebung egal: hier funktioniert Windows genauso gut Dr. Heidrun Bethge Datenbanken
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 Dr. Heidrun Bethge Datenbanken
MySQL-Monitor mysql Nicht zu verwechseln mit dem MySQL-Datenbank-Server, der evtl. als Dienst läuft. Start über mysql/bin/mysql.exe evtl auch aufrufen mit Parametern: mysql –h localhost -u username –p hier sind Administrations- und Wartungsaufgaben interaktiv durchführbar; Kommandointerpreter jeder Befehl wird durch Semikolon beendet, Befehle können über mehrere Zeilen gehen Mit Pfeiltasten lassen sich Befehle wiederholen Dr. Heidrun Bethge Datenbanken
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; Dr. Heidrun Bethge Datenbanken
Dr. Heidrun Bethge Datenbanken
Entwicklungsgeschichte SQL SQL (früherer Name: SEQUEL) ist zunächst 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 verfügbar: IBM, Oracle, DEC, ... Dr. Heidrun Bethge Datenbanken
Standardisierungen SQL Seit Anfang/Mitte der 80er Jahre Standardisierungsaktivitäten am ANSI für 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 großen DBMS weitgehend kompatibel. Dr. Heidrun Bethge Datenbanken
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, Löschen von Daten DCL Data Control Language Anlegen von Benutzern, Vergabe von Zugriffsrechten TCL Transaction Control Language Steuerung von Transaktionen Dr. Heidrun Bethge Datenbanken
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 Einfügen von Leerzeichen, Leerzeilen, Tabs möglich. Dr. Heidrun Bethge Datenbanken
CREATE TABLE CREATE TABLE tabellenname ( feldname1 feldtyp feldoptionen, feldname2 feldtyp feldoptionen ... [, index1, index2] ); Dr. Heidrun Bethge Datenbanken
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: TnNr int(11) NOT NULL, tnalter int(11) default NULL, PRIMARY KEY (TnNr) Dr. Heidrun Bethge Datenbanken
CREATE TABLE: Feldoptionen NOT NULL DEFAULT defaultwert PRIMARY KEY (gleichzeitig NOT NULL erforderlich) AUTO_INCREMENT (nicht ANSI, z.B. in MySQL) Dr. Heidrun Bethge Datenbanken
References in MySQL z.B. für InnoDB-Tabellen implementiert nicht jedoch im Standard-Tabellenformat MyISAM dient der Überwachung referentieller Integrität 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) Dr. Heidrun Bethge Datenbanken
Namensgebung möglichst klare Feld- und Tabellennamen einheitliches Schema für die Benennung von Feldern und Tabellen z.B. einheitlich: Singular title oder Plural titles Feldnamen evtl. Rückschluss auf Tabelle und/oder Datentyp Dr. Heidrun Bethge Datenbanken
MySQL-Datentypen Integer Tinyint 8-Bit-Integer -128 - +127 Smallint 16-Bit-Integer Mediumint 24-Bit-Integer Int, Integer 32-Bit-Integer Bigint 64-Bit-Integer Attribut UNSIGNED: nur positive Zahlen. Ansonsten +- AUTO_INCREMENT (kein ANSI-SQL). Attribut PRIMARY KEY oder UNIQUE müssen gleichzeitig gesetzt sein Es gibt auch Int(x) (x-stellig), dient jedoch nur der Formatierung,keine Stelleneinschränkung Dr. Heidrun Bethge Datenbanken
MySQL Datentypen Fließkomma FLOAT 8 Stellen, 4 Byte REAL/DOUBLE 16 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 für DECIMAL Dr. Heidrun Bethge Datenbanken
MySQL Datentypen Datum/Zeit DATE 3 Byte '2012-05-10' Bereich 1000-01-01 bis 9999-12-31 TIME 3 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. Dr. Heidrun Bethge Datenbanken
MySQL Datentypen Zeichenketten CHAR(n) max. 255 Zeichen, n Byte VARCHAR(n) variable Länge, max. n Zeichen (<256). Speicherbedarf: Tatsächliche Länge+1Byte CHAR und VARCHAR: Leerzeichen am Beginn & Ende werden gelöscht TINYTEXT variable Länge, max. 255 Zeichen, (n+1 Byte) TEXT max. 216-1 Zeichen (n+2 Byte) MEDIUMTEXT max. 224-1 Zeichen (n+3 Byte) LONGTEXT max. 232-1 Zeichen (n+4 Byte) xxxTEXT-Datentypen sind kein ANSI Dr. Heidrun Bethge Datenbanken
MySQL Datentypen für Binärdaten nicht ANSI! BLOB: Binary Large Object TINYBLOB Binärdaten mit var. Länge, max. 255 Byte BLOB (216-1 Byte), MEDIUMBLOB (224-1 Byte), LONGBLOB (232-1 Byte) Vorteil: auch Binärdateien unterliegen DB-Zugriffsschutz eventuell nur Links in der Datenbank abspeichern, Binärdaten in externen Dateien speichern -> schnellerer Datenbankzugriff Dr. Heidrun Bethge Datenbanken
MySQL Datentypen für Aufzählungen 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 möglich (1-8 Byte) CREATE TABLE testset (fontattr SET (`bold‘, `italic‘, `underlined‘)) INSERT testset VALUES (`bold,italic‘) Dr. Heidrun Bethge Datenbanken
Indizes Beschleunigen Zugriff auf DB verlangsamen Änderungen in DB und benötigen Speicherplatz Maximal 16 Indizes pro Tabelle auch für mehrere Felder gleichzeitig Index sinnlos, wenn Feld sehr viele gleiche Einträge hat -> Normalisierung! UNIQUE macht Index effizienter, eineindeutig PRIMARY Primärschlüssel Beschränkung der Indexlänge bei CHAR und VARCHAR möglich, bei xxxTEXT und BLOB erforderlich. Dr. Heidrun Bethge Datenbanken
Indizes II MySQL kann Indizes in folgenden Fällen nicht nutzen: Ungleichoperationen (WHERE column != ...) Funktionen (WHERE DAY(datum)=...) Primär- und Fremdschlüssel haben untersch. Typ LIKE `%abc` Dr. Heidrun Bethge Datenbanken
CREATE INDEX Folgende Ausdrücke sind gleichwertig für 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) Dr. Heidrun Bethge Datenbanken
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 möglich Dr. Heidrun Bethge Datenbanken
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 Dr. Heidrun Bethge Datenbanken
INSERT Dr. Heidrun Bethge Datenbanken
Beispiel INSERT Füge einen neuen Teilnehmer (TnNr 200) für Kurs G08 und AngNr 1 in die Gebühren-Relation ein. Die Teilnahmegebühr sei noch nicht bekannt. INSERT INTO gebuehren VALUES (1,‘G08‘, 200,NULL) alternativ: INSERT INTO gebuehren (angnr, kursnr, tnnr) VALUES (1,‘G08‘, 200,NULL) Füge ein neues Kursangebot (AngNr 3) für G08 für den 15.3.2014 in Ulm ein. INSERT INTO angebot VALUES (3,‘G08‘,‘15.03.2014‘,‘Ulm‘) Dr. Heidrun Bethge Datenbanken
SELECT Dr. Heidrun Bethge Datenbanken
SELECT * Gib die Teilnehmer-Relation komplett aus. SELECT * FROM Teilnehmer; Dr. Heidrun Bethge Datenbanken
SELECT FROM Gib aus der Teilnehmer-Relation die Attribute Name, TnNr, Ort aus, und zwar in dieser Reihenfolge. SELECT Name, TnNr, Ort FROM Teilnehmer; Dr. Heidrun Bethge Datenbanken
SELECT DISTINCT Gib alle Orte aus, aus denen Teilnehmer kommen. SELECT ort SELECT DISTINCT ort FROM teilnehmer; FROM teilnehmer; ohne Duplikateliminierung mit Duplikateliminierung Dr. Heidrun Bethge Datenbanken
SELECT FROM WHERE SELECT TnNr, Name, Ort SELECT * FROM Teilnehmer WHERE Ort = 'Ulm'; SELECT * FROM Teilnehmer WHERE Ort = 'Ulm'; SELECT * FROM Teilnehmer WHERE TnNr >= 100 Dr. Heidrun Bethge Datenbanken
AND, OR Vergleichs-Ausdrücke können mit AND und OR verknüpft werden: ... TnNr > 100 AND TnNR < 200 ... Ort = 'Ulm' OR Ort = 'Neu-Ulm' ... (Ort = 'Ulm' OR Ort = 'Neu-Ulm') AND TnNr > 100 Dr. Heidrun Bethge Datenbanken
Vergleichsoperatoren ... TnNr BETWEEN 100 AND 200 ist äquivalent zu: ... TnNr >= 100 AND TnNR <= 200 ... TnNr NOT BETWEEN 100 AND 200 ... TnNr IN (100, 200, 130, 400) ... TnNr NOT IN (100, 200, 130, 400) Dr. Heidrun Bethge Datenbanken
LIKE Beispiel Dr. Heidrun Bethge Datenbanken
LIKE Verwendung LIKE ist ein spezieller Vergleichsoperator für CHAR-Attribute. Der Attributwert wird als Ganzes von links nach rechts zeichenweise mit dem angegebenen Muster verglichen. Maskierungszeichen („wild cards“): "%" : an der durch "%" markierten Stelle können beliebig viele (auch keine!) zu ignorierende Zeichen stehen. "_" : an der durch "_" (Unterstrich) markierten Stelle wird genau ein Zeichen ignoriert. Dr. Heidrun Bethge Datenbanken
Berechnete Felder „Gib aus, bei welcher Kursliteratur ein Unterbestand (Bestand kleiner als Bedarf) vorhanden ist und wie hoch die Beschaffungskosten hierfür sind.“ SELECT KursNr, Bedarf-Bestand, (Bedarf-Bestand)*Preis FROM KursLit WHERE Bedarf > Bestand; Problem: wenig aussagekräftige Spaltennamen Dr. Heidrun Bethge Datenbanken
Felder benennen Abhilfe: Umbenennen der Attribute SELECT KursNr, Bedarf-Bestand AS Minusbestand, (Bedarf-Bestand)*Preis AS Beschaffungskosten FROM KursLit WHERE Bedarf > Bestand; Dr. Heidrun Bethge Datenbanken
einige String-Funktionen LCASE(string) string in Kleinbuchstaben UCASE(string) string in Großbuchstaben LENGTH(string) LOCATE(suchstr, string) LEFT(string, anz), RIGHT(string, anz) SUBSTRING(string, start [,länge]) LTRIM(string), RTRIM(string) Entfernen von Blanks (vorne/hinten) TRIM(string) Entfernen von Blanks vorne+hinten CHAR(num.Wert) CHAR(123)->’123’ (String) Dr. Heidrun Bethge Datenbanken
Datums-Funktionen „Gib die Angebotsrelation, sortiert nach Datum, mit separaten Spalten für 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; Dr. Heidrun Bethge Datenbanken
ORDER BY „Gib alle Kurs-Angebote für 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. Dr. Heidrun Bethge Datenbanken
Operatoren und Konventionen NOT ! OR || AND && =, <>,!= , <=, <, >=, > +, -, *, / ‘Zeichenkette‘ bzw. “Zeichenkette“ Zahlen: -2002 -123.456 Dr. Heidrun Bethge Datenbanken
Aggregatfunktionen COUNT(Ausdruck): Anzahl Felder <> NULL COUNT(*): Anzahl Felder AVG(Ausdruck): Mittelwert MIN(Ausdruck): Minimum MAX(Ausdruck): Maximum SUM(Ausdruck): Summe STD(Ausdruck): Standardabweichung Dr. Heidrun Bethge Datenbanken
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 enthält, so wird nur max. ein Resultat-Tupel erzeugt. Dr. Heidrun Bethge Datenbanken
Verbund – alte Form Dr. Heidrun Bethge Datenbanken
Beispiel Verbund „Gib aus, welche Kursangebote (Ausgabe: KursNr, AngNr) von welchen Kursleitern (Ausgabe: Name) durchgeführt werden.“ Bisherige Form: SELECT f.KursNr, f.AngNr, lt.Name FROM Fuehrt_durch f, Kursleiter lt WHERE f.PersNr = lt.PersNr; Dr. Heidrun Bethge Datenbanken
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 "=" ausgedrückt werden sollen. Dr. Heidrun Bethge Datenbanken
JOIN Beispiel Gib aus, welche Kursangebote (Ausgabe: KursNr, AngNr) von welchen Kursleitern (Ausgabe: Name) durchgeführt werden. SELECT KursNr, AngNr, Name FROM Fuehrt_durch INNER JOIN Kursleiter ON Kursleiter.PersNr = Fuehrt_durch.PersNr Kürzere Schreibweise mit Alias-Namen für die Tabellen: SELECT f.KursNr, f.AngNr, lt.Name FROM Fuehrt_durch f INNER JOIN Kursleiter lt ON f.PersNr = lt.PersNr Dr. Heidrun Bethge Datenbanken
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 Dr. Heidrun Bethge Datenbanken
OUTER JOIN SELECT select-list FROM table1 LEFT [OUTER] JOIN table2 ON ... FROM table1 RIGHT [OUTER] JOIN table2 ON ... nicht in MySQL: FROM table1 FULL [OUTER] JOIN table2 ON ... Dr. Heidrun Bethge Datenbanken
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 Bethge Datenbanken
Vorgehensweise bei Join 1. Auszugebende Werte/Attribute bestimmen 2. Potentiell relevante Entities bestimmen 3. "Join-Pfad" + Join-Attribute bestimmen 4. Optional: "Abwahl" der nicht benötigten Entities „Gib aus, welche Kursangebote (Ausgabe: KursNr, Titel, AngNr, Datum, Ort) von welchen Kursleitern (Ausgabe: PersNr) durchgeführt 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 Dr. Heidrun Bethge Datenbanken
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: FROM Kurs k, Angebot a, Fuehrt_durch f WHERE k.KursNr = a.KursNr AND a.AngNr = f.AngNr AND a.KursNr = f.KursNr; Dr. Heidrun Bethge Datenbanken
Aufgaben Join I Gib aus, welche Teilnehmer (Ausgabe: TnNr) an Kurs 'G08' oder 'G10' (Ausgabe: KursNr, AngNr, Ort) teilnehmen. Gib alle Kursangebote (Ausgabe: alles) zusammen mit den vorliegenden Anmeldungen (TnNr) aus. Dr. Heidrun Bethge Datenbanken
Aufgaben Join II Gib alle Kursangebote (Ausgabe: alles) zusammen mit den vorliegenden Anmeldungen (TnNr) aus. Wie Aufgabe 2, aber zusätzlich zur Teilnehmernummer soll jeweils auch noch der Teilnehmername ausgegeben werden. Gib alle Kursangebote aus, für die sich kein Teilnehmer angemeldet hat. Hinweis: WHERE ... IS [NOT] NULL Dr. Heidrun Bethge Datenbanken
Aufgaben Aggregatfunktionen Gib das höchste, das niedrigste und das durchschnittliche Kursleiter-Gehalt sowie die Summe aller Gehälter aus. Gib die Anzahl der verschiedenen Orte aus, aus denen die Kursteilnehmer kommen. Dr. Heidrun Bethge Datenbanken
Gruppierung - Problem Lösung: Gruppierung 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 Lösung: Gruppierung SELECT Ort, COUNT(Ort) Anzahl FROM Teilnehmer GROUP BY Ort; Dr. Heidrun Bethge Datenbanken
Group by – Having Syntax Dr. Heidrun Bethge Datenbanken
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 ausgeführt, (Reihenfolge jetzt also: FROM - WHERE -GROUP BY- HAVING - ORDER BY - SELECT) Dr. Heidrun Bethge Datenbanken
Having Gruppierungsnebenbedingungen werden mittels HAVING-Klausel ausgedrückt (HAVING kann nur in Verbindung mit GROUP BY auftreten). Unterschied zwischen WHERE und HAVING: WHERE eliminiert Zeilen HAVING eliminiert Gruppen Dr. Heidrun Bethge Datenbanken
Übung Group by - Having Gib für alle Kursangebote die Anzahl der Anmeldungen aus (Ausgabe: Angebote-Attribute, Anzahl Teilnehmer). Wie vorheriges, aber nur solche Kurse ausgeben, für die mehr als 2 Anmeldungen vorliegen. Gib alle Kurstypen (KursNr) - mit Ausnahme der Grundlagenkurse ('G08', 'G10') - aus, für die mehr als 4 Anmeldungen vorliegen. Dr. Heidrun Bethge Datenbanken
Unterabfragen Dr. Heidrun Bethge Datenbanken
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 Dr. Heidrun Bethge Datenbanken
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. Dr. Heidrun Bethge Datenbanken
scalar subquery Unterabfragen, welche nur einen Wert zurückliefern, 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); Dr. Heidrun Bethge Datenbanken
table subquery = Unterabfrage, welche eine Tabelle zurückliefert. Mit folgenden Bedingungen werden diese Unterabfragen eingeleitet (§ ist Vergleichsoperator (=;<>;<;<=;>;>=)): [NOT] IN prüft, ob ein Wert in der Ergebnismenge der Unterabfrage enthalten ist. [NOT] EXISTS prüft, ob die Unterabfrage mindestens eine Zeile erbringt, die der Bedingung genügt. Liefert True/False zurück. § ANY § SOME prüft, ob die Bedingung für irgendeine Zeile der Unterabfrage zutrifft § ALL prüft, ob die Bedingung für alle Zeilen der Unterabfrage zutrifft. Dr. Heidrun Bethge Datenbanken
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); Dr. Heidrun Bethge Datenbanken
Unterabfrage mit EXISTS Suche alle Artikelkategorien (Getränke, Süsswaren...) 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 lösbar Dr. Heidrun Bethge Datenbanken
nicht-korrelierte und korrelierte Unterabfragen I Dr. Heidrun Bethge Datenbanken
nicht-korrelierte und korrelierte Unterabfragen II In Unterabfragen kann auf Tabellen von äußeren Abfrage-Ausdrücken Bezug genommen werden: korrelierte Unterabfragen. Nachteil: Für jeden Datensatz der aufrufenden Abfrage muss die Unterabfrage einzelnd ausgeführt werden. Bei semantisch äquivalenten Anfrageformulierungen mit und ohne Korrelation können sich stark unterschiedliche Antwortzeiten ergeben. Dies ist auch abhängig von Anfragebearbeitungs-Strategie bzw. Güte der Anfrage-Optimierung des verwendeten DBMS Dr. Heidrun Bethge Datenbanken
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). Dr. Heidrun Bethge Datenbanken
Syntax Unterabfrage mit ANY / ALL / IN Dr. Heidrun Bethge Datenbanken
weiteres zu Unterabfragen = ANY ist äquivalent zu IN, <> ALL ist äquivalent zu NOT IN. Unterabfragen können geschachtelt sein, d.h. sie können wiederum Unterabfragen enthalten. Häufig können Unterabfragen auch ersetzt werden durch join-Abfragen ohne Unterabfragen. Dies geht dann nicht, wenn die Unterabfrage eine Mengenfunktion beinhaltet. Dr. Heidrun Bethge Datenbanken
Unterabfrage vs. Join Gib alle Kursangebote aus (Ausgabe: KursNr, AngNr), für 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’ FROM Nimmt_teil nt WHERE EXISTS (SELECT * FROM Teilnehmer AS t WHERE t.Ort = ’Ulm’ AND t.TnNr = nt.TnNr) Dr. Heidrun Bethge Datenbanken
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 WHERE nt.TnNr IN Dr. Heidrun Bethge Datenbanken
Paarweise Vergleiche SELECT name, ort FROM teilnehmer WHERE (tnalter, ort) = ( SELECT tnalter, ort WHERE name='Schulze') AND name <>'Schulze'; Keine paarweisen Vergleiche auf SQL-Server möglich. Dr. Heidrun Bethge Datenbanken
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); SELECT tabelle1.* FROM tabelle1 LEFT JOIN tabelle2 ON tabelle1.id=tabelle2.id WHERE tabelle2.id IS NULL; Dr. Heidrun Bethge Datenbanken
Aufgaben Unterabfragen Gib die Personalnummer des Kursleiters mit dem niedrigsten Gehalt aus. Wie lautet der Titel des Kurses mit der günstigsten Kursliteratur? Bestimme alle Kursangebote (Kurstitel und Angebotsnummer), zu denen es noch keine Teilnehmer gibt. Verwenden Sie eine korrelierte und eine nicht-korrelierte Unterabfrage. Gib alle Kursleiter aus, die mindestens zwei Kurse leiten. Ausgabe: Personaldaten, Angebotsdaten, sortiert nach PersNr. Dr. Heidrun Bethge Datenbanken
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 häufig durch Inline-Views umgehen. Auswertungen auf gruppierten Daten mit Aggregaten hiermit möglich. Dr. Heidrun Bethge Datenbanken
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: benötigt Alias für Inline-View. SELECT ort, max(a.Anzahl) möglich. Oracle: benötigt keinen Alias, Ausgabe von ort nicht möglich. Dr. Heidrun Bethge Datenbanken
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 Bethge Datenbanken
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 Bethge Datenbanken
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 Bethge Datenbanken
SET-Operatoren 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 Dr. Heidrun Bethge Datenbanken
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. INTERSECT Gib alle Angebotsorte aus, wo kein Teilnehmer wohnt. MINUS Dr. Heidrun Bethge Datenbanken
Regeln für SET-Operatoren Die erste SELECT-Anweisung gibt vor: Anzahl Felder Feldnamen Feldreihenfolge Felddatentypen Die folgende(n) SELECT-Anweisung(en) müssen übereinstimmen in ORDER BY wird einmal für alle Datensätze gemeinsam am Ende der Anweisung verwendet Dr. Heidrun Bethge Datenbanken
Beispiel UNION SELECT 'T' typ, name, ort FROM teilnehmer WHERE name like 'M%' UNION SELECT 'K' typ, name, NULL FROM kursleiter ORDER BY name; Dr. Heidrun Bethge Datenbanken
UNION anstelle FULL OUTER JOIN Nicht jedes DBMS hat die FULL OUTER JOIN-Funktionalität! 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 RIGHT JOIN produkt p ON l.lieferantid=p.lieferantid Wie kann dieses Beispiel gelöst werden ohne LEFT/RIGHT JOIN? Dr. Heidrun Bethge Datenbanken
Aufgaben SET-Operatoren Lösen Sie folgende Aufgaben in Oracle auf dem Uni-Schema mittels SET-Operatoren. Lassen sich die Aufgaben auch ohne SET-Operator und ohne Unterabfrage lösen? Warum (nicht)? Alle Studenten-Namen, die bei Sokrates Vorlesungen hören, aber keine Vorlesungen bei Popper hören. Alle Vorlesungen mit 4 Semesterwochenstunden (sws), in der noch kein Student eine Prüfung abgelegt hat. Alle Vorlesungen mit 4 Semesterwochenstunden (sws), in der mindestens ein Student eine Prüfung abgelegt hat. Alle Professoren, die keine Vorlesung halten, aber einen Assistenten haben. Dr. Heidrun Bethge Datenbanken