SQL-Abfragen 9. Oktober 2012 SQL-Abfragen 1. Einleitung SQL ist eine relational vollständige Datenbanksprache. SQL-Abfragen 1. Einleitung SQL ist eine relational vollständige Datenbanksprache. SQL steht für Structured Query Language. SQL-Abfragen 1. Einleitung SQL ist eine relational vollständige Datenbanksprache. SQL steht für Structured Query Language. Der englische Ausdruck Query steht für Abfrage. SQL-Abfragen 1. Einleitung SQL ist eine relational vollständige Datenbanksprache. SQL steht für Structured Query Language. Der englische Ausdruck Query steht für Abfrage. SQL wurde in den siebziger Jahren des letzten Jahrunderts entwickelt und gilt heute als führende Sprache auf diesem Gebiet. SQL-Abfragen 1. Einleitung SQL ist eine relational vollständige Datenbanksprache. SQL steht für Structured Query Language. Der englische Ausdruck Query steht für Abfrage. SQL wurde in den siebziger Jahren des letzten Jahrunderts entwickelt und gilt heute als führende Sprache auf diesem Gebiet. Für SQL gibt es einen ISO-Standard. Die meisten aktuellen Datenbanksysteme verwenden mehr oder weniger grosse Teile dieses Standards. SQL-Abfragen 1. Einleitung SQL ist eine relational vollständige Datenbanksprache. SQL steht für Structured Query Language. Der englische Ausdruck Query steht für Abfrage. SQL wurde in den siebziger Jahren des letzten Jahrunderts entwickelt und gilt heute als führende Sprache auf diesem Gebiet. Für SQL gibt es einen ISO-Standard. Die meisten aktuellen Datenbanksysteme verwenden mehr oder weniger grosse Teile dieses Standards. Wir werden für die folgenden Beispiele exemplarisch das weit R verbreitete Datenbanksystem MySQL verwenden. SQL-Abfragen 2. Grundstruktur von SQL-Abfragen SELECT FROM [WHERE merkmalsname [, merkmalsname ...], tabellenname [, tabellenname ...], selektionsbedingung]; SQL-Abfragen 2. Grundstruktur von SQL-Abfragen SELECT FROM [WHERE merkmalsname [, merkmalsname ...], tabellenname [, tabellenname ...], selektionsbedingung]; SQL-Schlüsselwörter werden üblicherweise in Grossbuchstaben geschrieben. Auch Kleinschreibung ist möglich. SQL-Abfragen 2. Grundstruktur von SQL-Abfragen SELECT FROM [WHERE merkmalsname [, merkmalsname ...], tabellenname [, tabellenname ...], selektionsbedingung]; SQL-Schlüsselwörter werden üblicherweise in Grossbuchstaben geschrieben. Auch Kleinschreibung ist möglich. Vorsicht: Bei Tabellen- und Merkmalsnamen wird zwischen Gross- und Kleinschreibung unterschieden. SQL-Abfragen 2. Grundstruktur von SQL-Abfragen SELECT FROM [WHERE merkmalsname [, merkmalsname ...], tabellenname [, tabellenname ...], selektionsbedingung]; SQL-Schlüsselwörter werden üblicherweise in Grossbuchstaben geschrieben. Auch Kleinschreibung ist möglich. Vorsicht: Bei Tabellen- und Merkmalsnamen wird zwischen Gross- und Kleinschreibung unterschieden. Alle Angaben, die bei der Syntaxdefinition in eckigen Klammern [. . . ] stehen, können weggelassen werden. SQL-Abfragen 2. Grundstruktur von SQL-Abfragen SELECT FROM [WHERE merkmalsname [, merkmalsname ...], tabellenname [, tabellenname ...], selektionsbedingung]; SQL-Schlüsselwörter werden üblicherweise in Grossbuchstaben geschrieben. Auch Kleinschreibung ist möglich. Vorsicht: Bei Tabellen- und Merkmalsnamen wird zwischen Gross- und Kleinschreibung unterschieden. Alle Angaben, die bei der Syntaxdefinition in eckigen Klammern [. . . ] stehen, können weggelassen werden. Leerzeichen, Tabulatoren und Zeilenschaltungen können zur besseren Lesbarkeit eingefügt werden. SQL-Abfragen 2. Grundstruktur von SQL-Abfragen SELECT FROM [WHERE merkmalsname [, merkmalsname ...], tabellenname [, tabellenname ...], selektionsbedingung]; SQL-Schlüsselwörter werden üblicherweise in Grossbuchstaben geschrieben. Auch Kleinschreibung ist möglich. Vorsicht: Bei Tabellen- und Merkmalsnamen wird zwischen Gross- und Kleinschreibung unterschieden. Alle Angaben, die bei der Syntaxdefinition in eckigen Klammern [. . . ] stehen, können weggelassen werden. Leerzeichen, Tabulatoren und Zeilenschaltungen können zur besseren Lesbarkeit eingefügt werden. Eine SQL-Anweisung wird mit einem Semikolon (;) abgeschlossen. SQL-Abfragen 3. Das ERM der Übungsdatenbank SQL-Abfragen 4. Tabellenschema der Übungsdatenbank LIEFERANT(lid, name) ARTIKEL(aid, bezeichnung, preis, menge, einheit, lid) KUNDE(kid, nachname, vorname, strasse, plz, ort) VERKAUF(vid, kid, aid, datum, zeit) Fremdschlüssel sind blau hervorgehoben. SQL-Abfragen 5. Die Schnittstelle der Übungsdatenbank http://efi.kantiriederer.ch/mysql/login.php Username: Passwort: sqlabfrage x3.kH;jY,97F SQL-Abfragen 6. Projektionen (1) SELECT FROM nachname, ort kunde; liefert eine Tabelle mit den Merkmalen nachname und ort aller Tupel aus der Tabelle kunde. SQL-Abfragen 6. Projektionen (1) SELECT FROM nachname, ort kunde; liefert eine Tabelle mit den Merkmalen nachname und ort aller Tupel aus der Tabelle kunde. nachname Meier Baumann ... ort Büren NW Stans ... SQL-Abfragen 6. Projektionen (2) Da man häufig alle Merkmalsnamen anzeigen möchten, kann man anstelle der Aufzählung aller Merkmale auch das Zeichen * verwenden. SELECT FROM kid 1 2 ... * kunde; nachname Meier Baumann ... vorname Noemi Riccardo ... strasse Buchhölzlistrasse Künzlistrasse ... SQL-Abfragen plz 6382 6370 ... ort Büren NW Stans ... 6. Projektionen (3) SELECT FROM plz 6382 6370 6365 ... plz, ort kunde; ort Büren NW Stans Kehrsiten ... SQL-Abfragen 6. Projektionen (3) SELECT FROM plz 6382 6370 6365 ... plz, ort kunde; ort Büren NW Stans Kehrsiten ... Diese Liste ist streng genommen gar keine Tabelle im Sinne des Relationenmodells. Warum? SQL-Abfragen 6. Projektionen (3) SELECT FROM plz 6382 6370 6365 ... plz, ort kunde; ort Büren NW Stans Kehrsiten ... Diese Liste ist streng genommen gar keine Tabelle im Sinne des Relationenmodells. Warum? Es gibt kein Merkmal bzw. keine Merkmalskombination, die die Tupel innerhalb der Tabelle eindeutig identifiziert. SQL-Abfragen 6. Projektionen (4) Wird hinter SELECT das Schlüsselwort DISTINCT eingefügt, werden Duplikate eliminiert: SELECT FROM DISTINCT plz, ort kunde; SQL-Abfragen 6. Projektionen (4) Wird hinter SELECT das Schlüsselwort DISTINCT eingefügt, werden Duplikate eliminiert: SELECT FROM plz 6382 6370 ... DISTINCT plz, ort kunde; ort Büren NW Stans ... SQL-Abfragen 7. Qualifizierte Abfragen (1) Mit Hilfe von Selektionsbedingungen lassen sich qualifzierte Abfragen durchführen. SQL-Abfragen 7. Qualifizierte Abfragen (1) Mit Hilfe von Selektionsbedingungen lassen sich qualifzierte Abfragen durchführen. Interessieren wir uns für alle Kunden, die in Stans wohnen, so lautet die entsprechende SQL-Abfrage: SELECT FROM WHERE * kunde ort = ’Stans’; SQL-Abfragen 7. Qualifizierte Abfragen (1) Mit Hilfe von Selektionsbedingungen lassen sich qualifzierte Abfragen durchführen. Interessieren wir uns für alle Kunden, die in Stans wohnen, so lautet die entsprechende SQL-Abfrage: SELECT FROM WHERE kid 2 8 ... * kunde ort = ’Stans’; nachname Baumann Moser ... vorname Riccardo Nathan ... strasse Künzlistrasse Röschibachstrasse ... SQL-Abfragen plz 6370 6370 ... ort Stans Stans ... 7. Qualifizierte Abfragen (2) Die Selektionsprädikate könne auch Ungleichheitsbeziehungen enthalten und mit den logischen Operatoren AND, OR und NOT verknüpft werden: SELECT * FROM artikel WHERE preis > 3.0 AND (NOT lid = 6); SQL-Abfragen 7. Qualifizierte Abfragen (2) Die Selektionsprädikate könne auch Ungleichheitsbeziehungen enthalten und mit den logischen Operatoren AND, OR und NOT verknüpft werden: SELECT * FROM artikel WHERE preis > 3.0 AND (NOT lid = 6); Welche Artikel sind teurer als 3 Franken und kommen nicht vom Lieferanten mit der ID 6? SQL-Abfragen 7. Qualifizierte Abfragen (2) Die Selektionsprädikate könne auch Ungleichheitsbeziehungen enthalten und mit den logischen Operatoren AND, OR und NOT verknüpft werden: SELECT * FROM artikel WHERE preis > 3.0 AND (NOT lid = 6); Welche Artikel sind teurer als 3 Franken und kommen nicht vom Lieferanten mit der ID 6? aid 3 5 ... bezeichnung Zopf Salami ... preis 4.50 4.20 ... menge 1 100 ... einheit Stück Gramm ... SQL-Abfragen lid 1 2 ... 7. Qualifizierte Abfragen (3) Durch Angabe von Merkmalsnamen wird die Selektion mit einer Projektion verknüpft. Interessiert man sich im letzten Beispiel nur für die Bezeichnung, so lautet die Abfrage: SELECT bezeichnung, preis, lid FROM artikel WHERE preis > 3.0 AND (NOT lid = 6); SQL-Abfragen 7. Qualifizierte Abfragen (3) Durch Angabe von Merkmalsnamen wird die Selektion mit einer Projektion verknüpft. Interessiert man sich im letzten Beispiel nur für die Bezeichnung, so lautet die Abfrage: SELECT bezeichnung, preis, lid FROM artikel WHERE preis > 3.0 AND (NOT lid = 6); bezeichnung Zopf Salami Schweinssteak ... preis 4.50 4.20 5.00 ... lid 1 2 2 ... SQL-Abfragen 7. Qualifizierte Abfragen (4) Enthält eine Spalte Zahlenwerte, können einfache Berechnungen damit durchgeführt werden. Zudem ermöglicht das Schlüsselwort AS die Vergabe eines neuen Namens (Alias) für die Spaltenüberschrift. SELECT bezeichnung, preis * 0.025 AS MWSt FROM artikel; SQL-Abfragen 7. Qualifizierte Abfragen (4) Enthält eine Spalte Zahlenwerte, können einfache Berechnungen damit durchgeführt werden. Zudem ermöglicht das Schlüsselwort AS die Vergabe eines neuen Namens (Alias) für die Spaltenüberschrift. SELECT bezeichnung, preis * 0.025 AS MWSt FROM artikel; bezeichnung Ruchbrot Gipfeli Zopf ... MWSt 0.06250 0.02500 0.11250 ... SQL-Abfragen 8. Abfragen mit Zeichenerkennung (1) Das %-Zeichen steht für eine beliebige Zeichenkette von einem oder mehreren Buchstaben. Mit dem Schlüsselwort LIKE kann in der WHERE-Klausel nach Zeichenketten bestimmter Länge gesucht werden. SELECT * FROM lieferant WHERE name LIKE ’M%’; SQL-Abfragen 8. Abfragen mit Zeichenerkennung (1) Das %-Zeichen steht für eine beliebige Zeichenkette von einem oder mehreren Buchstaben. Mit dem Schlüsselwort LIKE kann in der WHERE-Klausel nach Zeichenketten bestimmter Länge gesucht werden. SELECT * FROM lieferant WHERE name LIKE ’M%’; lid 2 4 name Metzgerei Stierli Molkerei Senn SQL-Abfragen 8. Abfragen mit Zeichenerkennung (2) Der Unterstrich ( ) steht für genau ein (beliebiges) Zeichen. Mit dem Schlüsselwort LIKE kann in der WHERE-Klausel nach Zeichenketten bestimmter Länge gesucht werden. SELECT * FROM artikel WHERE bezeichnung LIKE ’B_____’; SQL-Abfragen 8. Abfragen mit Zeichenerkennung (2) Der Unterstrich ( ) steht für genau ein (beliebiges) Zeichen. Mit dem Schlüsselwort LIKE kann in der WHERE-Klausel nach Zeichenketten bestimmter Länge gesucht werden. SELECT * FROM artikel WHERE bezeichnung LIKE ’B_____’; Mit der obigen Abfrage suchen wir nach Artikelbezeichnungen, die mit einem ’B’ beginnen und aus genau 6 Zeichen bestehen. SQL-Abfragen 8. Abfragen mit Zeichenerkennung (2) Der Unterstrich ( ) steht für genau ein (beliebiges) Zeichen. Mit dem Schlüsselwort LIKE kann in der WHERE-Klausel nach Zeichenketten bestimmter Länge gesucht werden. SELECT * FROM artikel WHERE bezeichnung LIKE ’B_____’; Mit der obigen Abfrage suchen wir nach Artikelbezeichnungen, die mit einem ’B’ beginnen und aus genau 6 Zeichen bestehen. aid 9 14 bezeichnung Banane Butter preis 2.70 2.70 menge 1 250 einheit Kilogramm Gramm SQL-Abfragen lid 3 4 9. Abfragen mit Aggregatsfunktionen (1) Neben den Operatoren der Relationenalgebra existieren in SQL auch sogenannte eingebaute Funktionen, die in der SELECT-Klausel verwendet werden können. Sie gelten für jeweils eine Tabellenspalte. COUNT für die Zählung der Datenwerte SUM für die Summenbildung über die Datenwerte MAX und MIN um das Maximum bzw. Minimum zu bestimen AVG für die Durchschnittbildung (average) SQL-Abfragen 9. Abfragen mit Aggregatsfunktionen (2) Wie viele Artikel wurden im Monat Juli verkauft? SELECT FROM WHERE AND COUNT(vid) AS ’Anzahl Verkäufe im Juli’ verkauf datum >= ’2011-07-01’ datum <= ’2011-07-31’; SQL-Abfragen 9. Abfragen mit Aggregatsfunktionen (2) Wie viele Artikel wurden im Monat Juli verkauft? SELECT FROM WHERE AND COUNT(vid) AS ’Anzahl Verkäufe im Juli’ verkauf datum >= ’2011-07-01’ datum <= ’2011-07-31’; Anzahl Verkäufe im Juli 330 SQL-Abfragen 9. Abfragen mit Aggregatsfunktionen (3) Wie viel kostet unser billigster Artikel? SQL-Abfragen 9. Abfragen mit Aggregatsfunktionen (3) Wie viel kostet unser billigster Artikel? SELECT MIN(preis) AS ’Preis’ FROM artikel; SQL-Abfragen 9. Abfragen mit Aggregatsfunktionen (3) Wie viel kostet unser billigster Artikel? SELECT MIN(preis) AS ’Preis’ FROM artikel; Preis 0.60 SQL-Abfragen 10. Abfragen mit dem Verbundoperator (1) Datenbankabfragen sind besonders interessant, wenn dabei mehrere Tabellen verknüpft werden. Wir möchten zum Beispiel wissen, wie viele Packungen Spaghetti (à 500 g) seit dem Bestehen der Datenbank verkauft wurden. SELECT FROM WHERE AND * artikel, verkauf bezeichnung = ’Spaghetti’ artikel.aid = verkauf.aid; SQL-Abfragen 10. Abfragen mit dem Verbundoperator (1) Datenbankabfragen sind besonders interessant, wenn dabei mehrere Tabellen verknüpft werden. Wir möchten zum Beispiel wissen, wie viele Packungen Spaghetti (à 500 g) seit dem Bestehen der Datenbank verkauft wurden. SELECT FROM WHERE AND aid 19 19 ... * artikel, verkauf bezeichnung = ’Spaghetti’ artikel.aid = verkauf.aid; bezeichnung Spaghetti Spaghetti ... preis 1.80 1.80 ... menge 500 500 ... einheit Gramm Gramm ... SQL-Abfragen ... ... ... ... 10. Abfragen mit dem Verbundoperator (2) Möchte man die Anzahl der Datensätze nicht von Hand zählen, verwendet man von Vorteil die Aggregationsfunktion COUNT, der wir bereits weiter oben begegnet sind. SELECT FROM WHERE AND COUNT(artikel.aid) AS "Spaghettipackungen" artikel, verkauf bezeichnung = ’Spaghetti’ artikel.aid = verkauf.aid; SQL-Abfragen 10. Abfragen mit dem Verbundoperator (2) Möchte man die Anzahl der Datensätze nicht von Hand zählen, verwendet man von Vorteil die Aggregationsfunktion COUNT, der wir bereits weiter oben begegnet sind. SELECT FROM WHERE AND COUNT(artikel.aid) AS "Spaghettipackungen" artikel, verkauf bezeichnung = ’Spaghetti’ artikel.aid = verkauf.aid; Spaghettipackungen 26 SQL-Abfragen 11. Sortieren und Gruppieren von Tupel-Einträgen (1) Gemäss Definition ist die Reihenfolge der Tupel in einer Tabelle unwesentlich. Oft möchte man aber, dass die Resultattabelle nach einem bestimmten Merkmal sortiert dargestellt wird. Dies erreicht man mit dem Schlüsselwort ORDER BY, gefolgt vom einem Merkmalsnamen und einem Zusatz, der die Art der Sortierung präzisiert: ASC = aufsteigend (Voreinstellung), DESC = absteigend. SELECT * FROM kunde ORDER BY nachname DESC; SQL-Abfragen 11. Sortieren und Gruppieren von Tupel-Einträgen (1) Gemäss Definition ist die Reihenfolge der Tupel in einer Tabelle unwesentlich. Oft möchte man aber, dass die Resultattabelle nach einem bestimmten Merkmal sortiert dargestellt wird. Dies erreicht man mit dem Schlüsselwort ORDER BY, gefolgt vom einem Merkmalsnamen und einem Zusatz, der die Art der Sortierung präzisiert: ASC = aufsteigend (Voreinstellung), DESC = absteigend. SELECT * FROM kunde ORDER BY nachname DESC; kid 22 ... nachname Zimmermann ... vorname Ben ... strasse Schanzeneggstrasse ... SQL-Abfragen plz 6370 ... ort Stans ... 11. Sortieren und Gruppieren von Tupel-Einträgen (2) Es gibt Situationen, in denen man innerhalb der Resultattabelle die Tupel nach bestimmten Kriterien zusammenfassen möchte. Dazu dient das Schlüsselwort GROUP BY. SQL-Abfragen 11. Sortieren und Gruppieren von Tupel-Einträgen (2) Es gibt Situationen, in denen man innerhalb der Resultattabelle die Tupel nach bestimmten Kriterien zusammenfassen möchte. Dazu dient das Schlüsselwort GROUP BY. Wie viele Artikel werden von jedem Lieferanten geliefert? SELECT lid, COUNT(lid) AS ’Anzahl Artikel’ FROM artikel GROUP BY lid; SQL-Abfragen 11. Sortieren und Gruppieren von Tupel-Einträgen (2) Es gibt Situationen, in denen man innerhalb der Resultattabelle die Tupel nach bestimmten Kriterien zusammenfassen möchte. Dazu dient das Schlüsselwort GROUP BY. Wie viele Artikel werden von jedem Lieferanten geliefert? SELECT lid, COUNT(lid) AS ’Anzahl Artikel’ FROM artikel GROUP BY lid; id 1 2 ... Anzahl Artikel 3 4 ... SQL-Abfragen 11. Sortieren und Gruppieren von Tupel-Einträgen (3) Wenn man anstelle der Lieferanten-Nummer die konkreten Lieferanten-Namen angezeigt haben möchte, muss man zusätzlich den Verbund-Operator anwenden. SQL-Abfragen 11. Sortieren und Gruppieren von Tupel-Einträgen (3) Wenn man anstelle der Lieferanten-Nummer die konkreten Lieferanten-Namen angezeigt haben möchte, muss man zusätzlich den Verbund-Operator anwenden. SELECT FROM WHERE GROUP BY name, COUNT(lieferant.lid) AS ’Anzahl Artikel’ artikel, lieferant artikel.lid = lieferant.lid lieferant.lid; SQL-Abfragen 11. Sortieren und Gruppieren von Tupel-Einträgen (3) Wenn man anstelle der Lieferanten-Nummer die konkreten Lieferanten-Namen angezeigt haben möchte, muss man zusätzlich den Verbund-Operator anwenden. SELECT FROM WHERE GROUP BY name, COUNT(lieferant.lid) AS ’Anzahl Artikel’ artikel, lieferant artikel.lid = lieferant.lid lieferant.lid; name Bäckerei Müller Metzgerei Stierli ... Anzahl Artikel 3 4 ... SQL-Abfragen 11. Sortieren und Gruppieren von Tupel-Einträgen (4) Aus den mit GROUP BY zusammengefassten Tupeln können wir mit dem Zusatz HAVING ein Auswahl treffen. Dabei ist zu beachten, dass dieses Auswahlkriterium nur in Verbindung mit Aggregatsfunktionen zulässig ist. Wie viele Kunden haben mehr als 30 Artikel gekauft? SQL-Abfragen 11. Sortieren und Gruppieren von Tupel-Einträgen (4) Aus den mit GROUP BY zusammengefassten Tupeln können wir mit dem Zusatz HAVING ein Auswahl treffen. Dabei ist zu beachten, dass dieses Auswahlkriterium nur in Verbindung mit Aggregatsfunktionen zulässig ist. Wie viele Kunden haben mehr als 30 Artikel gekauft? SELECT FROM GROUP BY HAVING v.kid, COUNT(v.vid) AS "Anzahl Artikel" verkauf AS v v.kid COUNT(v.vid) > 30; Mit AS können auch Aliase für Tabellennamen erzeugt werden. Diese sind im ganzen SQL-Statement gültig. SQL-Abfragen 11. Sortieren und Gruppieren von Tupel-Einträgen (4) Aus den mit GROUP BY zusammengefassten Tupeln können wir mit dem Zusatz HAVING ein Auswahl treffen. Dabei ist zu beachten, dass dieses Auswahlkriterium nur in Verbindung mit Aggregatsfunktionen zulässig ist. Wie viele Kunden haben mehr als 30 Artikel gekauft? SELECT FROM GROUP BY HAVING v.kid, COUNT(v.vid) AS "Anzahl Artikel" verkauf AS v v.kid COUNT(v.vid) > 30; Mit AS können auch Aliase für Tabellennamen erzeugt werden. Diese sind im ganzen SQL-Statement gültig. kid 29 53 68 Anzahl Artikel 37 36 31 SQL-Abfragen 12. Vereinigung Der entsprechende Operator heisst UNION. Für eine Vereinigung müssen die Tabellen vereinigungsverträglich sein. Welche Artikel stammen von Lieferant 3 oder von Lieferant 5? SQL-Abfragen 12. Vereinigung Der entsprechende Operator heisst UNION. Für eine Vereinigung müssen die Tabellen vereinigungsverträglich sein. Welche Artikel stammen von Lieferant 3 oder von Lieferant 5? (SELECT * FROM artikel WHERE lid = 3) UNION (SELECT * FROM artikel WHERE lid = 5); SQL-Abfragen 12. Vereinigung Der entsprechende Operator heisst UNION. Für eine Vereinigung müssen die Tabellen vereinigungsverträglich sein. Welche Artikel stammen von Lieferant 3 oder von Lieferant 5? (SELECT * FROM artikel WHERE lid = 3) UNION (SELECT * FROM artikel WHERE lid = 5); Die Klammern können auch weggelassen werden, da UNION schwächer bindet als SELECT. SQL-Abfragen 12. Vereinigung Der entsprechende Operator heisst UNION. Für eine Vereinigung müssen die Tabellen vereinigungsverträglich sein. Welche Artikel stammen von Lieferant 3 oder von Lieferant 5? (SELECT * FROM artikel WHERE lid = 3) UNION (SELECT * FROM artikel WHERE lid = 5); Die Klammern können auch weggelassen werden, da UNION schwächer bindet als SELECT. aid 8 9 ... 16 bezeichnung Apfel Banane ... Ei preis 2.30 2.70 ... 0.60 menge 1 1 ... 1 einheit Kilogramm Kilogramm ... Stück SQL-Abfragen lid 3 3 ... 5 13. Durchschnitt und Differenz MySQL kennt keine direkte Unterstützung für die SQL-Mengenoperationen INTERSECT und EXCEPT (oder MINUS) Daher müssen diese Operationen über einen Umweg gebildet werden. Das ersparen wir uns aber. SQL-Abfragen 14. Kartesisches Produkt Das kartesische Produkt ist nichts anderes als ein Verbund mit einem leeren Prädikat. SQL-Abfragen 14. Kartesisches Produkt Das kartesische Produkt ist nichts anderes als ein Verbund mit einem leeren Prädikat. Achtung: Ohne Prädikat führt das kartesische Produkt schnell zu sehr grossen Produkttabellen“. ” SQL-Abfragen 14. Kartesisches Produkt Das kartesische Produkt ist nichts anderes als ein Verbund mit einem leeren Prädikat. Achtung: Ohne Prädikat führt das kartesische Produkt schnell zu sehr grossen Produkttabellen“. ” SELECT * FROM artikel, lieferant; SQL-Abfragen 14. Kartesisches Produkt Das kartesische Produkt ist nichts anderes als ein Verbund mit einem leeren Prädikat. Achtung: Ohne Prädikat führt das kartesische Produkt schnell zu sehr grossen Produkttabellen“. ” SELECT * FROM artikel, lieferant; Wie viele Zeilen hat das obige kartesische Produkt aus den Tabellen artikel und lieferant? SQL-Abfragen 14. Kartesisches Produkt Das kartesische Produkt ist nichts anderes als ein Verbund mit einem leeren Prädikat. Achtung: Ohne Prädikat führt das kartesische Produkt schnell zu sehr grossen Produkttabellen“. ” SELECT * FROM artikel, lieferant; Wie viele Zeilen hat das obige kartesische Produkt aus den Tabellen artikel und lieferant? 243 = 27 · 9 SQL-Abfragen 15. Geschachtelte Abfragen Manchmal ist es nötig, eine SQL-Abfrage innerhalb einer anderen zu formulieren. In einem früheren Beispiel haben wir den tiefsten Preis bestimmt, den ein Artikel in unserem Sortiment haben kann. Möchte man auch noch wissen, um welchen (welche) Artikel es sich handelt, müssen SQL-Abfragen geschachtelt werden: SQL-Abfragen 15. Geschachtelte Abfragen Manchmal ist es nötig, eine SQL-Abfrage innerhalb einer anderen zu formulieren. In einem früheren Beispiel haben wir den tiefsten Preis bestimmt, den ein Artikel in unserem Sortiment haben kann. Möchte man auch noch wissen, um welchen (welche) Artikel es sich handelt, müssen SQL-Abfragen geschachtelt werden: SELECT FROM WHERE bezeichnung, preis artikel preis >= ALL (SELECT preis FROM artikel); SQL-Abfragen 15. Geschachtelte Abfragen Manchmal ist es nötig, eine SQL-Abfrage innerhalb einer anderen zu formulieren. In einem früheren Beispiel haben wir den tiefsten Preis bestimmt, den ein Artikel in unserem Sortiment haben kann. Möchte man auch noch wissen, um welchen (welche) Artikel es sich handelt, müssen SQL-Abfragen geschachtelt werden: SELECT FROM WHERE bezeichnung, preis artikel preis >= ALL (SELECT preis FROM artikel); bezeichnung Waschmittel preis 12.00 SQL-Abfragen 16. Was es sonst noch gibt Tabellen erzeugen und löschen (CREATE TABLE, DROP TABLE) Datensätze einfügen und löschen (INSERT, DELETE) Datensätze verändern und akutalisieren (ALTER, UPDATE) Tabellen mischen (MERGE) Benutzerrechte vergeben (GRANT) usw. SQL-Abfragen Quelle A. Meier, Relationale und postrelationale Datenbanken, Springer Berlin, 2007 SQL-Abfragen