Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Relationale Datenbanken IV Mit SQL Datenbankeinträge heraussuchen.

Ähnliche Präsentationen


Präsentation zum Thema: "Relationale Datenbanken IV Mit SQL Datenbankeinträge heraussuchen."—  Präsentation transkript:

1 Relationale Datenbanken IV Mit SQL Datenbankeinträge heraussuchen

2 Beispiel Tabellen Reisebüro

3 Grundstruktur einer Suchabfrage SELECT WHERE FROM ORDER BY

4 Grundidee Suchabfragen führen die gegebenen Tabellen in neue Tabellen über. Die neuen Tabellen enthalten genau die gesuchte Information.

5 Beispiel SELECT Name,Preis FROM Reiseziel WHERE Preis < 3000;

6 Was kann hinter FROM stehen? Der Name einer einzelnen Tabelle Die Namen mehrerer Tabellen, durch Operatoren voneinander getrennt mit riesigem Abstand wichtigster Operator: Komma zweitwichtigster Operator: UNION (Aneinanderreihung zweier gleichartiger Tabellen) SELECT Reiseziel.Name AS Reiseziel,Land.Name AS Land FROM Reiseziel,Land WHERE Reiseziel.LandNr = Land.LandNr Beispiel: Reiseziel.Name und Land.Name zur Unterscheidung AS zur Veränderung der Spaltentitel (ohne AS wäre der Titel beider Spalten jeweils "Name" gewesen)

7 Was bedeutet "Reiseziel,Land" ? SELECT * FROM Reiseziel,Land liefert: | ZielNr | Name | Preis | LandNr | LandNr | Name | Sprache | Waehrung | Vorwahl | | 1 | New York | | 1 | 1 | USA | Englisch | USD | +1 | | 2 | Bangkok | | 2 | 1 | USA | Englisch | USD | +1 | | 3 | Sydney | | 7 | 1 | USA | Englisch | USD | +1 | | 4 | Darwin | | 7 | 1 | USA | Englisch | USD | +1 | | 5 | Peking | | 13 | 1 | USA | Englisch | USD | +1 | | 6 | Berlin | | 5 | 1 | USA | Englisch | USD | +1 | | 8 | Edinburgh | | 4 | 1 | USA | Englisch | USD | +1 | | 9 | Valetta | | 14 | 1 | USA | Englisch | USD | +1 | | 10 | Atlantis | | 6 | 1 | USA | Englisch | USD | +1 | | 11 | Loch Ness | | 4 | 1 | USA | Englisch | USD | +1 | | 12 | Tiefes Schwarzes Loch | 0.01 | 2 | 1 | USA | Englisch | USD | +1 | | 1 | New York | | 1 | 2 | Schweiz | Deutsch | CHF | 0041 | | 2 | Bangkok | | 2 | 2 | Schweiz | Deutsch | CHF | 0041 | | 3 | Sydney | | 7 | 2 | Schweiz | Deutsch | CHF | 0041 | | 4 | Darwin | | 7 | 2 | Schweiz | Deutsch | CHF | 0041 | | 5 | Peking | | 13 | 2 | Schweiz | Deutsch | CHF | 0041 | | 6 | Berlin | | 5 | 2 | Schweiz | Deutsch | CHF | 0041 | | 8 | Edinburgh | | 4 | 2 | Schweiz | Deutsch | CHF | 0041 | | 9 | Valetta | | 14 | 2 | Schweiz | Deutsch | CHF | 0041 | | 10 | Atlantis | | 6 | 2 | Schweiz | Deutsch | CHF | 0041 | | 11 | Loch Ness | | 4 | 2 | Schweiz | Deutsch | CHF | 0041 | | 12 | Tiefes Schwarzes Loch | 0.01 | 2 | 2 | Schweiz | Deutsch | CHF | 0041 | | 1 | New York | | 1 | 3 | Kanada | Englisch | CAD | +1 | | 2 | Bangkok | | 2 | 3 | Kanada | Englisch | CAD | +1 | | 3 | Sydney | | 7 | 3 | Kanada | Englisch | CAD | +1 | | 4 | Darwin | | 7 | 3 | Kanada | Englisch | CAD | +1 | | 5 | Peking | | 13 | 3 | Kanada | Englisch | CAD | +1 | | 6 | Berlin | | 5 | 3 | Kanada | Englisch | CAD | +1 | | 8 | Edinburgh | | 4 | 3 | Kanada | Englisch | CAD | +1 | | 9 | Valetta | | 14 | 3 | Kanada | Englisch | CAD | +1 | | 10 | Atlantis | | 6 | 3 | Kanada | Englisch | CAD | +1 | | 11 | Loch Ness | | 4 | 3 | Kanada | Englisch | CAD | +1 | | 12 | Tiefes Schwarzes Loch | 0.01 | 2 | 3 | Kanada | Englisch | CAD | +1 | | 1 | New York | | 1 | 4 | Schottland | Englisch | GBP | +44 | | 2 | Bangkok | | 2 | 4 | Schottland | Englisch | GBP | +44 | | 3 | Sydney | | 7 | 4 | Schottland | Englisch | GBP | +44 | | 4 | Darwin | | 7 | 4 | Schottland | Englisch | GBP | +44 | | 5 | Peking | | 13 | 4 | Schottland | Englisch | GBP | +44 | | 6 | Berlin | | 5 | 4 | Schottland | Englisch | GBP | +44 | | 8 | Edinburgh | | 4 | 4 | Schottland | Englisch | GBP | +44 | SELECT * heisst: Alle Spalten auswählen

8 Fortsetzung I | 9 | Valetta | | 14 | 4 | Schottland | Englisch | GBP | +44 | | 10 | Atlantis | | 6 | 4 | Schottland | Englisch | GBP | +44 | | 11 | Loch Ness | | 4 | 4 | Schottland | Englisch | GBP | +44 | | 12 | Tiefes Schwarzes Loch | 0.01 | 2 | 4 | Schottland | Englisch | GBP | +44 | | 1 | New York | | 1 | 5 | Deutschland | Deutsch | EUR | +49 | | 2 | Bangkok | | 2 | 5 | Deutschland | Deutsch | EUR | +49 | | 3 | Sydney | | 7 | 5 | Deutschland | Deutsch | EUR | +49 | | 4 | Darwin | | 7 | 5 | Deutschland | Deutsch | EUR | +49 | | 5 | Peking | | 13 | 5 | Deutschland | Deutsch | EUR | +49 | | 6 | Berlin | | 5 | 5 | Deutschland | Deutsch | EUR | +49 | | 8 | Edinburgh | | 4 | 5 | Deutschland | Deutsch | EUR | +49 | | 9 | Valetta | | 14 | 5 | Deutschland | Deutsch | EUR | +49 | | 10 | Atlantis | | 6 | 5 | Deutschland | Deutsch | EUR | +49 | | 11 | Loch Ness | | 4 | 5 | Deutschland | Deutsch | EUR | +49 | | 12 | Tiefes Schwarzes Loch | 0.01 | 2 | 5 | Deutschland | Deutsch | EUR | +49 | | 1 | New York | | 1 | 6 | Neuseeland | Englisch | NZD | 64 | | 2 | Bangkok | | 2 | 6 | Neuseeland | Englisch | NZD | 64 | | 3 | Sydney | | 7 | 6 | Neuseeland | Englisch | NZD | 64 | | 4 | Darwin | | 7 | 6 | Neuseeland | Englisch | NZD | 64 | | 5 | Peking | | 13 | 6 | Neuseeland | Englisch | NZD | 64 | | 6 | Berlin | | 5 | 6 | Neuseeland | Englisch | NZD | 64 | | 8 | Edinburgh | | 4 | 6 | Neuseeland | Englisch | NZD | 64 | | 9 | Valetta | | 14 | 6 | Neuseeland | Englisch | NZD | 64 | | 10 | Atlantis | | 6 | 6 | Neuseeland | Englisch | NZD | 64 | | 11 | Loch Ness | | 4 | 6 | Neuseeland | Englisch | NZD | 64 | | 12 | Tiefes Schwarzes Loch | 0.01 | 2 | 6 | Neuseeland | Englisch | NZD | 64 | | 1 | New York | | 1 | 7 | Australien | Englisch | AUD | +61 | | 2 | Bangkok | | 2 | 7 | Australien | Englisch | AUD | +61 | | 3 | Sydney | | 7 | 7 | Australien | Englisch | AUD | +61 | | 4 | Darwin | | 7 | 7 | Australien | Englisch | AUD | +61 | | 5 | Peking | | 13 | 7 | Australien | Englisch | AUD | +61 | | 6 | Berlin | | 5 | 7 | Australien | Englisch | AUD | +61 | | 8 | Edinburgh | | 4 | 7 | Australien | Englisch | AUD | +61 | | 9 | Valetta | | 14 | 7 | Australien | Englisch | AUD | +61 | | 10 | Atlantis | | 6 | 7 | Australien | Englisch | AUD | +61 | | 11 | Loch Ness | | 4 | 7 | Australien | Englisch | AUD | +61 | | 12 | Tiefes Schwarzes Loch | 0.01 | 2 | 7 | Australien | Englisch | AUD | +61 | | 1 | New York | | 1 | 8 | Österreich | Deutsch | EUR | +43 | | 2 | Bangkok | | 2 | 8 | Österreich | Deutsch | EUR | +43 | | 3 | Sydney | | 7 | 8 | Österreich | Deutsch | EUR | +43 | | 4 | Darwin | | 7 | 8 | Österreich | Deutsch | EUR | +43 | | 5 | Peking | | 13 | 8 | Österreich | Deutsch | EUR | +43 | | 6 | Berlin | | 5 | 8 | Österreich | Deutsch | EUR | +43 | | 8 | Edinburgh | | 4 | 8 | Österreich | Deutsch | EUR | +43 | | 9 | Valetta | | 14 | 8 | Österreich | Deutsch | EUR | +43 |

9 Fortsetzung II | 10 | Atlantis | | 6 | 8 | Österreich | Deutsch | EUR | +43 | | 11 | Loch Ness | | 4 | 8 | Österreich | Deutsch | EUR | +43 | | 12 | Tiefes Schwarzes Loch | 0.01 | 2 | 8 | Österreich | Deutsch | EUR | +43 | | 1 | New York | | 1 | 11 | Frankreich | Französisch | EUR | +33 | | 2 | Bangkok | | 2 | 11 | Frankreich | Französisch | EUR | +33 | | 3 | Sydney | | 7 | 11 | Frankreich | Französisch | EUR | +33 | | 4 | Darwin | | 7 | 11 | Frankreich | Französisch | EUR | +33 | | 5 | Peking | | 13 | 11 | Frankreich | Französisch | EUR | +33 | | 6 | Berlin | | 5 | 11 | Frankreich | Französisch | EUR | +33 | | 8 | Edinburgh | | 4 | 11 | Frankreich | Französisch | EUR | +33 | | 9 | Valetta | | 14 | 11 | Frankreich | Französisch | EUR | +33 | | 10 | Atlantis | | 6 | 11 | Frankreich | Französisch | EUR | +33 | | 11 | Loch Ness | | 4 | 11 | Frankreich | Französisch | EUR | +33 | | 12 | Tiefes Schwarzes Loch | 0.01 | 2 | 11 | Frankreich | Französisch | EUR | +33 | | 1 | New York | | 1 | 12 | Indonesien | Indonesisch | IDR | 62 | | 2 | Bangkok | | 2 | 12 | Indonesien | Indonesisch | IDR | 62 | | 3 | Sydney | | 7 | 12 | Indonesien | Indonesisch | IDR | 62 | | 4 | Darwin | | 7 | 12 | Indonesien | Indonesisch | IDR | 62 | | 5 | Peking | | 13 | 12 | Indonesien | Indonesisch | IDR | 62 | | 6 | Berlin | | 5 | 12 | Indonesien | Indonesisch | IDR | 62 | | 8 | Edinburgh | | 4 | 12 | Indonesien | Indonesisch | IDR | 62 | | 9 | Valetta | | 14 | 12 | Indonesien | Indonesisch | IDR | 62 | | 10 | Atlantis | | 6 | 12 | Indonesien | Indonesisch | IDR | 62 | | 11 | Loch Ness | | 4 | 12 | Indonesien | Indonesisch | IDR | 62 | | 12 | Tiefes Schwarzes Loch | 0.01 | 2 | 12 | Indonesien | Indonesisch | IDR | 62 | | 1 | New York | | 1 | 13 | China | Chinesich | UFD | | | 2 | Bangkok | | 2 | 13 | China | Chinesich | UFD | | | 3 | Sydney | | 7 | 13 | China | Chinesich | UFD | | | 4 | Darwin | | 7 | 13 | China | Chinesich | UFD | | | 5 | Peking | | 13 | 13 | China | Chinesich | UFD | | | 6 | Berlin | | 5 | 13 | China | Chinesich | UFD | | | 8 | Edinburgh | | 4 | 13 | China | Chinesich | UFD | | | 9 | Valetta | | 14 | 13 | China | Chinesich | UFD | | | 10 | Atlantis | | 6 | 13 | China | Chinesich | UFD | | | 11 | Loch Ness | | 4 | 13 | China | Chinesich | UFD | | | 12 | Tiefes Schwarzes Loch | 0.01 | 2 | 13 | China | Chinesich | UFD | | | 1 | New York | | 1 | 14 | Malta | Maltesisch | EUR | +356 | | 2 | Bangkok | | 2 | 14 | Malta | Maltesisch | EUR | +356 | | 3 | Sydney | | 7 | 14 | Malta | Maltesisch | EUR | +356 | | 4 | Darwin | | 7 | 14 | Malta | Maltesisch | EUR | +356 | | 5 | Peking | | 13 | 14 | Malta | Maltesisch | EUR | +356 | | 6 | Berlin | | 5 | 14 | Malta | Maltesisch | EUR | +356 | | 8 | Edinburgh | | 4 | 14 | Malta | Maltesisch | EUR | +356 | | 9 | Valetta | | 14 | 14 | Malta | Maltesisch | EUR | +356 | | 10 | Atlantis | | 6 | 14 | Malta | Maltesisch | EUR | +356 | | 11 | Loch Ness | | 4 | 14 | Malta | Maltesisch | EUR | +356 | | 12 | Tiefes Schwarzes Loch | 0.01 | 2 | 14 | Malta | Maltesisch | EUR | +356 |

10 D.h.: Reisebuero,Land ist eine Tabelle, die aus allen Kombinationen einer Zeile von Reisebuero und einer Zeile von Land besteht. Diese Tabelle wird auch das kartesische Produkt der Tabellen Reisebuero und Land genannt. Sie enthält auch alle unsinnigen Kombinationen der beiden Tabellen. Um die sinnvollen Kombinationen herauszufiltern, fügen wir die Bedingung an, dass das Feld LandNr in beiden Tabellen gleich sein muss: SELECT * FROM Reisebuero,Land WHERE Reisebuero.LandNr = Land.LandNr; Schliesslich beschränken wir uns auf diejenigen Spalten, welche uns interessieren und geben ihnen eindeutige Titel.

11 komplizierteres Beispiel: SELECT Person.Name FROM Person,Buchung,Reiseziel,Land WHERE Person.PersNr = Buchung.KundeNr AND Buchung.ZielNr = Reiseziel.ZielNr AND Reiseziel.LandNr = Land.LandNr AND Land.Sprache='Deutsch'; zu jedem kartesischen Produkt gehört eine WHERE-Bedingung WHERE-Bedingungen werden mit AND verknüpft

12 identische Spalten eliminieren: SELECT DISTINCT Person.Name FROM Person,Buchung,Reiseziel,Land WHERE Person.PersNr = Buchung.KundeNr AND Buchung.ZielNr = Reiseziel.ZielNr AND Reiseziel.LandNr = Land.LandNr AND Land.Sprache='Deutsch'; DISTINCT schadet nie im Zweifelsfall verwenden!

13 Was kann hinter SELECT stehen? SELECT [DISTINCT] [Tabellenname1.]Spalte1 [AS Bezeichnung1] [,[Tabellenname2.]Spalte2] [AS Bezeichnung2]]... [] : optionale Teile Wenn es die Eindeutigkeit erfordert (gleicher Spaltenname in mehr als einer der in FROM ausgewählten Tabellen), muss der Tabellenname angegeben werden. Noch nicht erwähnt sind bisher Aggretationsfunktionen.

14 Was kann hinter WHERE stehen? Bedingungen zu Spalten aus den in FROM verwendeten Tabellen Operatoren zur Formulierung dieser Bedingungen:, =, LIKE, REGEXP, IS NULL, IS NOT NULL Operatoren zur Verknüpfung von Bedingungen: AND, OR, NOT, () Operatoren für Tests auf Enthaltensein in einer Auswahl: EXISTS, IN Beispiele in den Übungen zu LIKE: es können die Wildcards % (keines, eines oder beliebig viele Zeichen) und _ (genau ein Zeichen) verwendet werden.

15 Was kann hinter ORDER BY stehen? ORDER BY Bezeichnung1 [ASC|DESC] [, Bezeichnung 2] [ASC|DESC]]... Beispiel: SELECT Name,Preis FROM Reiseziel WHERE Preis < 3000 ORDER BY Preis ASC; Bezeichnung1: Spaltenname oder Tabellenname.Spaltenname oder Bezeichnung gemäss AS im SELECT-Teil Zuerst wird nach Bezeichnung1 sortiert, innerhalb der Zeilen mit gleichem Wert bei Bezeichnung1 wird nach Bezeichnung2 sortiert usw.

16 Aggregationsfunktionen Wichtigste Vertreter: COUNT(): Wie viele Zeilen hat das Ergebnis SUM(Spaltenbezeichnung): Summe AVG(Spaltenbezeichnung): Mittelwert Beispiel 1: SELECT AVG(Gehalt) FROM Mitarbeiter; Beispiel 2: SELECT Person.Name,SUM(Reiseziel.Preis) AS Summe FROM Reiseziel,Buchung,Kunde,Person WHERE Reiseziel.ZielNr = Buchung.ZielNr AND Buchung.KundeNr = Kunde.PersNr AND Kunde.PersNr = Person.PersNr GROUP BY Person.Name ORDER BY Summe DESC GROUP BY Person.Name: Summiere verschiedene Personen getrennt!

17 Aufgaben Die folgenden Aufgaben können mit dem Webinterface auf gelöst weden. Sie beziehen sich auf die Reisebüro-Datenbank. 1.Geben Sie die Namen aller Länder, welche mindestens zweimal den Buchstaben A enthalten, alphabetisch geordnet aus. SELECT Name FROM Land WHERE Name LIKE '%a%a%' ORDER BY Name Bemerkungen: Wenn weder ASC noch DESC für die Sortierreihenfolge angegeben wird, wird ASC angekommen, also aufsteigende Sortierung. LIKE unterscheidet keine Gross- und Kleinschreibung, daher wird auch Australien gefunden.

18 Aufgaben Die folgenden Aufgaben können mit dem Webinterface auf gelöst weden. Sie beziehen sich auf die Reisebüro-Datenbank. 2.Geben Sie die Namen aller Kunden alphabetisch geordnet aus. SELECT Name FROM Person,Kunde WHERE Person.PersNr = Kunde.PersNr ORDER BY Name

19 Aufgaben Die folgenden Aufgaben können mit dem Webinterface auf gelöst weden. Sie beziehen sich auf die Reisebüro-Datenbank. 3.Geben Sie die Namen aller Kunden einmal aus, welche schon einmal in New York waren. SELECT DISTINCT Person.Name FROM Person,Kunde,Buchung,Reiseziel WHERE Person.PersNr = Kunde.PersNr AND Buchung.KundeNr = Kunde.PersNr AND Buchung.ZielNr = Reiseziel.ZielNr AND Reiseziel.Name = 'New York'

20 Aufgaben Die folgenden Aufgaben können mit dem Webinterface auf gelöst weden. Sie beziehen sich auf die Reisebüro-Datenbank. 4.Geben Sie eine Rangliste der Namen der Kunden aus, absteigend sortiert nach der Anzahl der von ihnen gebuchten Reisen SELECT Person.Name,count(Buchung.KundeNr) AS `Anz. Buchungen` FROM Person,Kunde,Buchung WHERE Person.PersNr = Kunde.PersNr AND Kunde.PersNr = Buchung.KundeNr GROUP BY Person.Name ORDER BY `Anz. Buchungen` DESC Anmerkung: Namen mit Sonder- und/oder Leerzeichen in verkehrte Hochkommata (``) einschliessen!

21 Aufgaben Die folgenden Aufgaben können mit dem Webinterface auf gelöst weden. Sie beziehen sich auf die Reisebüro-Datenbank. 5.Geben Sie eine Rangliste der Mitarbeiter an, absteigend sortiert nach der Anzahl Kunden, welch der jeweilige Mitarbeiter schon beraten hat. Aus der Rangliste soll der Name des Mitarbeiters und die jeweilige Anzahl Beratungen ersichtlich sein. SELECT Person.Name,COUNT(Beratung.MitarbeiterNr) AS Beratungen FROM Person,Mitarbeiter,Beratung WHERE Mitarbeiter.PersNr = Person.PersNr AND Beratung.MitarbeiterNr = Mitarbeiter.PersNr GROUP BY Person.Name ORDER BY Beratungen DESC

22 Aufgaben Die folgenden Aufgaben können mit dem Webinterface auf gelöst weden. Sie beziehen sich auf die Reisebüro-Datenbank. 6.Welche Mitarbeiter haben schon mindestens 3 Kunden beraten? Geben Sie deren Namen zusammen mit der Anzahl beratener Kunden aus, sortiert nach Namen SELECT * FROM (SELECT Person.Name,COUNT(Beratung.MitarbeiterNr) AS Beratungen FROM Person,Mitarbeiter,Beratung WHERE Person.PersNr = Mitarbeiter.PersNr AND Mitarbeiter.PersNr = Beratung.MitarbeiterNr GROUP BY Person.Name) AS Zwischentabelle WHERE Beratungen >= 3 ORDER BY Name


Herunterladen ppt "Relationale Datenbanken IV Mit SQL Datenbankeinträge heraussuchen."

Ähnliche Präsentationen


Google-Anzeigen