Datenbankabfragen (Query) mit SQL (Structured Query Language) 1 Aufbau des SELECT-Befehls Im Folgenden werden zunächst Abfragen aus einer Tabelle vorgenommen. SQL-Syntax: SELECT spaltenliste FROM tabellenname [WHERE Auswahlbedingung] [GROUP BY spaltenliste] [HAVING Auswahlbedingung] [ORDER BY spaltenliste]; Mit FROM geben Sie die Tabelle an, in der sich diese Spalten befinden. Mit WHERE können Sie die Suche einschränken. Sie legen den Wert einer Spalte fest, der nötig ist, damit die anderen gesuchten Werte des Datensatzes angezeigt werden. Sie können Werte mit GROUP BY zu Gruppen zusammenfassen, um spezielle Berechnungen durchzuführen. Dabei können Sie die Gruppen mit HAVING einschränken. Mit ORDER BY lassen Sie sich die Ergebnisse sortiert anzeigen. Probieren Sie die folgenden Abfragen und lösen die Aufgaben: Alle Spalten einer Tabelle ausgeben: SELECT * ; Spalten auswählen: SELECT name, vorname, strasse, plz, ort ; Select mit Bedingung (WHERE): SELECT name, vorname WHERE ort = 'Bonn'; SELECT name, vorname, strasse, plz, ort WHERE ort = 'Hamburg' OR ort = 'Bonn'; SELECT name, vorname, strasse, plz, ort WHERE name = 'Kaufmann' AND vorname = 'Andreas'; SELECT name, vorname, email, strasse, plz, ort WHERE email IS NOT NULL AND plz STARTING WITH '50'; Übungen (die Lösungstabellen befinden sich unter oder neben der Frage) : 1. Listen Sie alle Artikel der Tabelle artikel auf, deren Nettopreis höher als 100 liegt....
Datenbankabfragen (Query) mit SQL (Structured Query Language) 2 2. Listen Sie alle Mitarbeiter auf, die in der Abteilung 2 beschäftigt sind. 3. Listen Sie alle Artikel auf, die zur Kategorie Grafikkarten (Kategorienr. 3) gehören. 4. Geben Sie alle Kunden aus, deren Kundennummer größer als 50 ist und die nicht in Köln wohnen ('nicht' wird in SQL mit!= ausgedrückt).... Vergleichsoperatoren: SELECT * WHERE name IN ('Maier', 'Mayer', 'Meier', 'Meyer'); SELECT * WHERE name LIKE 'M er'; SELECT * WHERE name IS NOT NULL; SELECT * FROM mitarbeiter WHERE gehalt BETWEEN 2000 AND 3000; SELECT * FROM mitarbeiter WHERE gehalt >= 2000 AND gehalt <=3000; SELECT * WHERE name BETWEEN 'C' AND 'M'; Alle Datensätze im Feld name,die mit a oder A beginnen Alle Datensätze, die mit a enden Alle Datensätze, die ein a beinhalten Datensätze mit der Buchstabenkombination d,(egal),na select * from personen where name like a% ; select * from personen where name like %a ; select * from personen where name like %a% ; select * from personen where name like d_na% ; 5. Lassen Sie die Daten eines Kunden anzeigen, dessen Namen Sie nicht mehr genau wissen, nur so viel: Die Anfangsbuchstaben lauten 'Sc' letzter Buchstabe 'i'.
Datenbankabfragen (Query) mit SQL (Structured Query Language) 3 6. Lassen Sie die Kundendaten der Kunden anzeigen, die im PLZ-Bereich zwischen 3000 und 4100 wohnen. 7. Geben Sie die Kundennummer und das Bestelldatum aus der Tabelle 'Bestellungen' an, wo das Bestelldatum zwischen dem 02.01.2006 und 04.01.2006 liegt. 8. Geben Sie alle Spalten der Artikel an, dessen Nettopreis zwischen 200 und 250 liegt. 9. Lassen Sie alle Informationen der Artikel anzeigen, in dessen Bezeichnung das Wort 'Stylus' vorkommt. Ausgabe sortieren (ORDER BY): SELECT * ORDER BY ort desc, plz; SELECT * ORDER BY ort asc, plz; Feld 'ort' beginnend mit größtem Wert (erster Buchstabe im Alphabet) descending(absteigend), oder beginnend mit kleinstem Wert (letzter Buchstabe im Alphabet) ascending (aufsteigend) SELECT name, vorname WHERE name = 'Hecht' OR name = 'Martin' ORDER BY name DESC, vorname; SELECT name, vorname, strasse, plz, ort WHERE ort = 'Hamburg' OR ort = 'Bonn' ORDER BY ort DESC, name, vorname; Übungen: 10. Listen Sie alle Artikel in der Reihenfolge der Kategorie und dann alphabetisch auf. 11. Listen Sie alle Mitarbeiter nach ihrem Gehalt und dann der Abteilung auf. Das Gehalt soll absteigend sortiert werden. 12. Listen Sie alle Kunden, die per Nachname (N) bezahlen, nach Postleitzahlenbezirken auf.
Datenbankabfragen (Query) mit SQL (Structured Query Language) 4 Aggregatfunktionen Die Funktion Count(*) zählt Datensätze: SELECT COUNT(*) ; Wird ein zweites Feld ausgegeben, werden die Datensätze gezählt, die zu diesem Feld gehören. Dieses zweite Feld muss zusammen gefasst (Gruppiert) werden. SELECT count(*) as Wohnen_in, ort GROUP BY ort; mit 'as' können die Feldnamen der Ergebnistabelle bestimmt werden es werden nicht mehr alle Datensätze der Tabelle 'kunde' gezählt, sondern die, die zum Feld 'ort' passen!... Exkurs: Wird eine Funktion in der Select-Abfrage eingesetzt, müssen alle ausgegebenen Felder, der ergebnistabelle gruppiert werden. Ohne eine Gruppierung gibt es von jedem DBMS eine Fehlermeldung, ausser bei 'phpmyadmin': Es soll gezählt werden, wie viele Kunden aus einem Ort kommen. Angezeigt werden sollen der Ort und die entsprechende Anzahl pro Ort. Falsch: SELECT ort, count(*) as Anzahl from kunde Richtig: SELECT ort, count(*) as Anzahl from kunde group by ort Die gesamte Bestellmenge (die Summe) pro Ort soll angezeigt werden. Falsch: SELECT ort, SUM(Bestellmenge) as Bestellungen from kunde Richtig: SELECT ort, SUM(Bestellmenge) as Bestellungen from kunde group by ort
Datenbankabfragen (Query) mit SQL (Structured Query Language) 5 Having: Das Ergebnis einer Berechnung kann durch 'having' eingeschränkt werden. Having folgt immer dem group by. Count() wird wie ein Spaltenname verwendet. SELECT ort, COUNT(*) GROUP BY ort HAVING COUNT(*) >= 10; 13. Sorgen Sie bei der letzten Abfrage der Beispielfirma für eine sortierte Ausgabe der Städte nach der Anzahl der dort lebenden Kunden. Die Stadt mit den meisten Kunden soll dabei zuerst ausgegeben werden. 14. Lassen Sie die Städte nach der Anzahl der dort lebenden Kunden ausgeben (wie Aufgabe 13.). Bei gleicher Anzahl der Kunden soll die Ausgabe der Städte alphabetisch erfolgen. 15. Lassen Sie die Anzahl der Artikel pro Kategorie ausgeben, die teurer als 50 sind. 16. Lassen Sie sich die Bestellnummern von allen Bestellungen aus der Tabelle posten ausgeben, bei denen 5 Artikel oder mehr bestellt wurden. Sorgen Sie für eine Ausgabe der Größe nach. Weitere Aggregatfunktionen SELECT kategorie AS Kategorie, COUNT(*) AS Anzahl_der_Artikel, SUM(nettopreis) AS Summe_aller_Preise, AVG(nettopreis) AS Durchschnittspreis, MAX(nettopreis) AS hoechster_preis, MIN(nettopreis) AS niedrigster_preis FROM artikel GROUP BY kategorie; SELECT bestellnr, SUM(liefermenge) FROM posten GROUP BY bestellnr; SELECT AVG(nettopreis) AS durchschnittlicher_preis FROM artikel; SELECT SUM (bestand) FROM artikel WHERE kategorie = 1; SELECT SUM (bestand) AS vorhandene_monitore FROM artikel WHERE kategorie = 1; SELECT MAX(gehalt) AS hoechstes_gehalt FROM mitarbeiter; SELECT min(bestelldatum) FROM bestellung;
Datenbankabfragen (Query) mit SQL (Structured Query Language) 6 17. Wie hoch ist der Durchschnittsverdienst der Angestellten pro Abteilungen? 18. Ermitteln Sie das Eintrittsdatum des Mitarbeiters, der zuletzt zur Firma gekommen ist. Mit first 1 feldname kann man die Ausgabe in der Ergebnistabelle begrenzen. 19. Wie groß ist die höchste Bestellmenge in der Tabelle posten? 20. Wie viel wird im Durchschnitt pro Artikel bestellt? 21. Welcher Kunde steht alphabetisch am Anfang der Liste? Mathematische, Zeichenketten und Datums Funktionen: SELECT bezeichnung, nettopreis * 1.19 AS Endpreis FROM artikel; SELECT name, CHAR_LENGTH(name) FROM mitarbeiter; SELECT COUNT(*) FROM bestellung WHERE EXTRACT(MONTH FROM bestelldatum) = 1 AND EXTRACT(YEAR FROM bestelldatum) = 2006; 22. Einer der Geschäftsführer der Beispielfirma hat gehört, dass Artikel, deren Bezeichnung mehr als 17 Buchstaben lang ist, von Kunden ungern gekauft werden. Er möchte daher wissen, welche Artikelnamen länger als 17 Zeichen sind. 23. Wie können Sie feststellen, wie viele Bestellungen bisher insgesamt am zweiten Tag eines Monats eingegangen sind? 24. Welche Kunden haben E-Mail-Adressen von on-line.de?
Datenbankabfragen (Query) mit SQL (Structured Query Language) 7 Abfragen über mehrere Tabellen Der SQL-Syntax von Seite 1 bleibt gleich, hinzu kommt die Tabellenverknüpfung. Dazu muss man wissen, wie die Tabellen untereinander verknüpft sind: 25. Wie viele Produkte von den einzelnen Herstellern sind im Angebot? Listen Sie den Herstellernamen und die Anzahl ihrer Produkte (die Bezeichnungen müssen gezählt werden). Die Schlüssel: Tabelle Artikel: Hersteller Falsch: ohne Tabellenverknüpfung: Tabelle Hersteller: Herstellernr Richtig: mit Tabellenverknüpfung: 26. Geben Sie zu jedem Mitarbeiter die Bezeichnung seiner Abteilung an. Die Tabellen mitarbeiter und abteilung sind über die Abteilungsnummer miteinander verknüpft. 27. Um festzustellen, ob die Beispielfirma irgendwelche Ladenhüter in ihrem Lager beherbergt, listen Sie für alle Artikel auf, wie viele von ihnen bestellt wurden. Der innere Verbund (INNER JOIN) Der innere Verbund gibt nur Datensätze aus, die in beiden Tabellen vorhanden sind. Wenn alle Kunden mit ihren Bestellungen aufgelistet werden sollen, werden nur die Kunden aufgeführt, die schon etwas bestellt haben man erhält dasselbe Ergebnis wie mit der WHERE-Bedingung. SQL-Syntax: Ganz allgemein sieht die Verknüpfung über WHERE so aus:
Datenbankabfragen (Query) mit SQL (Structured Query Language) 8 SELECT spaltenliste FROM tabellenliste WHERE tabellenname1.primärschlüssel = tabellenname2.fremdschlüssel; Der Aufbau des INNER JOIN entspricht dem allgemeinen Befehl: SELECT spaltenliste FROM tabellenname1 [INNER] JOIN tabellenname2 ON tabellenname1.primärschlüssel = tabellenname2. Fremdschlüssel [INNER] JOIN tabellenname3 ON tabellenname2. primärschlüssel = tabellenname3.fremdschlüssel ; Beispiel: Die Geschäftsführung der Beispielfirma möchte wissen, wann welcher Kunde etwas bestellt hat. Die dazu benötigten Tabellen kunde und bestellung sind über die Kundennummer miteinander verknüpft. SELECT kunde.name, kunde.vorname, bestellung.bestelldatum INNER JOIN bestellung ON kunde.kundennr = bestellung.kundennr; Der äußere Verbund (LEFT JOIN / RIGHT JOIN) Es sollen alle Kunden und ihre Bestellungen aufgelistet werden, selbst wenn die Kunden nichts bestellt haben vielleicht weil sie gerade erst einen Katalog angefordert haben. In diesem Fall existiert zu diesem Kunden ein Datensatz in der Tabelle 'kunde' aber nicht in der Tabelle 'bestellungen'; trotzdem sollen alle Kunden angezeigt werden. Das ist weder mit WHERE noch mit INNER JOIN möglich. Dafür wird ein äußerer Verbund hergestellt, der OUTER JOIN. Hier können Sie angeben, welche der Tabellen alle Spalten angeben soll Bei LEFT JOIN werden alle Spalten der Tabelle angezeigt, die 'links' bzw. direkt hinter 'from' steht. SQL-Syntax: SELECT k.name, k.vorname, b.rechnungsbetrag AS k LEFT JOIN bestellung AS b ON k.kundennr = b.kundennr; Lösen Sie die Aufgaben 25 27 mit inner join. Aufgaben: