Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

MySQL relationales Datenbanksystem

Ähnliche Präsentationen


Präsentation zum Thema: "MySQL relationales Datenbanksystem"—  Präsentation transkript:

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 in großen kommerziellen DB-Systemen eine Selbstverständlichkeit sind Dr. Heidrun Bethge Datenbanken

2 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

3 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

4 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

5 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

6 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 u username -p Dr. Heidrun Bethge Datenbanken

7 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

8 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

9 Dr. Heidrun Bethge Datenbanken

10 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

11 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

12 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

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 Einfügen von Leerzeichen, Leerzeilen, Tabs möglich. Dr. Heidrun Bethge Datenbanken

14 CREATE TABLE CREATE TABLE tabellenname ( feldname1 feldtyp feldoptionen, feldname2 feldtyp feldoptionen ... [, index1, index2] ); Dr. Heidrun Bethge Datenbanken

15 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

16 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

17 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

18 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

19 MySQL-Datentypen Integer
Tinyint 8-Bit-Integer 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

20 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 Anz. Nachkommastellen festlegen bewirkt Rundung DECIMAL(p,s) p: gesamte Stellenanzahl, s: Nachkommazahlen. Festkommazahl. DECIMAL(8,3) – bis NUMERIC, DEC Synonyme für DECIMAL Dr. Heidrun Bethge Datenbanken

21 MySQL Datentypen Datum/Zeit
DATE 3 Byte ' ' Bereich bis TIME 3 Byte '23:59:59' Bereich +/- 838:59:59 DATETIME 8 Byte ' :59:59' YEAR 1 Byte Jahreszahl TIMESTAMP Datum und Zeit in der Form ' ' zw und Wird bei Änderung des Datensatzes automatisch aktualisiert. Dr. Heidrun Bethge Datenbanken

22 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 Zeichen (n+2 Byte) MEDIUMTEXT max Zeichen (n+3 Byte) LONGTEXT max Zeichen (n+4 Byte) xxxTEXT-Datentypen sind kein ANSI Dr. Heidrun Bethge Datenbanken

23 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

24 MySQL Datentypen für Aufzählungen
ENUM Auswahl einer von max 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

25 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

26 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

27 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

28 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

29 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

30 INSERT Dr. Heidrun Bethge Datenbanken

31 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 in Ulm ein. INSERT INTO angebot VALUES (3,‘G08‘,‘ ‘,‘Ulm‘) Dr. Heidrun Bethge Datenbanken

32 SELECT Dr. Heidrun Bethge Datenbanken

33 SELECT * Gib die Teilnehmer-Relation komplett aus. SELECT *
FROM Teilnehmer; Dr. Heidrun Bethge Datenbanken

34 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

35 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

36 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

37 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

38 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

39 LIKE Beispiel Dr. Heidrun Bethge Datenbanken

40 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

41 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

42 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

43 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

44 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

45 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

46 Operatoren und Konventionen
NOT ! OR || AND && =, <>,!= , <=, <, >=, > +, -, *, / ‘Zeichenkette‘ bzw. “Zeichenkette“ Zahlen: Dr. Heidrun Bethge Datenbanken

47 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

48 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

49 Verbund – alte Form Dr. Heidrun Bethge Datenbanken

50 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

51 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

52 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

53 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

54 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

55 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

56 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

57 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

58 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

59 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

60 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

61 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

62 Group by – Having Syntax
Dr. Heidrun Bethge Datenbanken

63 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

64 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

65 Ü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

66 Unterabfragen Dr. Heidrun Bethge Datenbanken

67 Motivation Unterabfragen I
Welche Artikel haben einen Preis, der über dem Durchschnittspreis liegt? SELECT AVG(Einzelpreis) AS avgpreis FROM Artikel; Ergebnis (z.B): avgpreis SELECT Artikelname FROM Artikel WHERE Einzelpreis>134.05; → zwei Abfragen notwendig Dr. Heidrun Bethge Datenbanken

68 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

69 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

70 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

71 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

72 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

73 nicht-korrelierte und korrelierte Unterabfragen I
Dr. Heidrun Bethge Datenbanken

74 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

75 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

76 Syntax Unterabfrage mit ANY / ALL / IN
Dr. Heidrun Bethge Datenbanken

77 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

78 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

79 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

80 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

81 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

82 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

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 häufig durch Inline-Views umgehen. Auswertungen auf gruppierten Daten mit Aggregaten hiermit möglich. Dr. Heidrun Bethge Datenbanken

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: 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

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 Bethge Datenbanken

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 Bethge Datenbanken

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 Bethge Datenbanken

88 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

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. INTERSECT Gib alle Angebotsorte aus, wo kein Teilnehmer wohnt. MINUS Dr. Heidrun Bethge Datenbanken

90 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

91 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

92 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

93 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


Herunterladen ppt "MySQL relationales Datenbanksystem"

Ähnliche Präsentationen


Google-Anzeigen