SQL SQL SELECT Anweisung Mit der SQL SELECT-Anweisung werden Datenwerte aus einer oder mehreren Tabellen einer Datenbank ausgewählt. Das Ergebnis der Auswahl ist erneut eine Tabelle, die sich dynamisch den Veränderungen der Ausgangstabelle anpasst. SELECT {Liste der Attribute} FROM {Liste der Tabellen}; Beispiel: SELECT abt_name, stadt FROM abteilung; 2 In der Auswahl können die Namen der neuen Attribute neu bestimmt werden. ACCESS verlang hier im Ggs. zu Standard-SQL den Operator AS Beispiel: SELECT abt_name AS Name, stadt AS Ort FROM abteilung; 3
Mit der -Klausel lassen sich gezielt Datensätze auswählen. Beispiel: SELECT abt_name, abt_nr FROM abteilung stadt = München ; 4 Neben der Prüfung auf Gleichheit können auch die folgenden Vergleichsoperatoren benutzt werden: = gleich <> oder!= nicht gleich (!= nicht in Access) > größer als < kleiner als >= größer gleich <= kleiner gleich!> nicht größer als (nicht in Access)!< nicht kleiner als (nicht in Access) 5 Zusätzlich sind auch Berechnungen möglich SELECT pr_name FROM projekt mittel * 0.55 > 60000; 6
Mit Hilfe der Boolschen Operatoren AND und OR lassen sich mehrere Bedingungen verknüpfen SELECT m_nr, pr_nr, aufgabe FROM arbeiten pr_nr = p1 AND aufgabe = Projektleiter ; 7 Sollen mehrere nicht zusammenhängende Werte abgefragt werden, so kann man die nötige Reihe von OR-Operatoren durch den -Operator ersetzen SELECT * FROM mitarbeiter m_name ( Meier, Müller, Mozer ); 8 Ein zusammenhängender Bereich lässt sich sehr einfach über den -Operator ermitteln SELECT pr_name, mittel FROM projekt mittel 95000 AND 120000; 9
In ACCESS (und MySQL) entspricht das Datumsformat von Konstanten nicht der Form von Standard-SQL Datumsformat in Standard-SQL: 31.01.2004 Datum mit Trennpunkten in Hochkommata in der Reihenfolge: Tag. Monat. Jahr Datumsformat in ACCESS: #01/31/2004# Datum mit Slash als Trennzeichen zwischen Nummernzeichen (#) in der Reihenfolge: #Monat / Tag / Jahr#. Datumsformat in MySQL: 2004-01-31 Datum mit/ohne Trennzeichen 04.01.31 in Hochkommata 040131 in der Reihenfolge: Jahr Monat Tag 10 Nicht vorhandene Werte werden in Datenbanken durch den Wert (nicht zu verwechseln mit 0!) dargestellt. Solche Werte werden in Abfragen nicht berücksichtigt. Um auch leere Feldwerte erfassen zu können, wurde der -Operator eingeführt. SELECT * FROM arbeiten aufgabe IS ; 11 Manchmal ist es hilfreich, nach einem Muster selektieren zu können, z.b. wenn man alle Mitarbeiter sucht, deren Nachname mit K beginnt. Für diesen Zweck wurde der -Operator geschaffen. Der -Operator ist nur auf Zeichenketten und Datumswerte anwendbar. Um beliebige Zeichen oder Zeichenketten darstellen zu können, bedient man sich sog. Zeichenbereiche können in eckigen Klammern angegeben werden: [E-N]* findet z.b. alle Zeichenketten, die mit einem Buchstaben zwischen E und N beginnen 12
Die Zeichen für in ACCESS unterscheiden sich von den Zeichen in Standard-SQL Standard- SQL % _ ^ ACCESS *?! Bedeutung Eine beliebige Folge von n Zeichen Genau ein beliebiges Zeichen Negation 13 Innerhalb des Vergleichs einer -Klausel kann wiederum eine SELECT-Anweisung stehen. Diese Vorgehensweise wird Unterabfrage genannt. Viele lassen sich auch durch Verknüpfungen mehrerer Tabellen (die sog. Join) ersetzen. Beide Formen werden eingesetzt um Informationen über mehrere Tabellen hinweg zu erhalten Die innere SELECT-Anweisung (dass ist die in der -Klausel) liefert einen oder mehrere Werte zurück, die dann in der äußeren SELECT-Anweisung als Prüfkriterium benutzt werden. 14 Beispiel: Einfacher Vergleichsoperator Gesucht sind die Nummern aller Projekte, in denen Mitarbeiter mit einer kleineren Personalnummer als Müller arbeiten SELECT pr_nr FROM arbeiten m_nr < (SELECT m_nr FROM mitarbeiter m_name = Müller ); Die innere SELECT-Anweisung ermittelt aus der Tabelle mitarbeiter die Mitarbeiternummer von Müller Die äußere SELECT-Anweisung vergleicht das Ergebnis mit der Mitarbeiternummer der Tabelle arbeiten und gibt die zugehörige Projektnummer aus. 15
Innere SELECT-Anweisung: (SELECT m_nr FROM mitarbeiter m_name = Müller ); 16 Äußere SELECT-Abfrage: SELECT pr_nr FROM arbeiten m_nr < {Ergebnis}; 17 Die Gesamtabfrage ist noch unschön, da die Projektnummern mehrfach ausgegeben werden. Die endgültige Abfrage lautete deshalb: SELECT DISTCT pr_nr FROM arbeiten m_nr < (SELECT m_nr FROM mitarbeiter m_name = Müller ); 18
Beispiel: -Operator Auch in lässt sich der -Operator verwenden. Zudem lassen sich auch schachteln. Beispiel: Gesucht sind die Namen der Mitarbeiter am Apollo-Projekt. SELECT m_name FROM mitarbeiter m_nr (SELECT m_nr FROM arbeiten pr_nr = (SELECT pr_nr FROM projekt pr_name = Apollo )); 19 Beispiel: -Operator (Fortsetzung 1) SELECT pr_nr FROM projekt pr_name = Apollo ; 20 Beispiel: -Operator (Fortsetzung 2) SELECT m_nr FROM arbeiten pr_nr = (SELECT pr_nr FROM projekt pr_name = Apollo ); 21
Beispiel: -Operator (Fortsetzung 3) SELECT m_name FROM mitarbeiter m_nr (SELECT m_nr FROM arbeiten pr_nr = (SELECT pr_nr FROM projekt pr_name = Apollo )); 22 Die -Klausel bildet für jeden Wert der angegebenen Spalte eine Gruppe, d.h. gleiche Werte werden zusammengefasst. Die Datentypen Text (in ACCESS: Memo) und Image (OLE-Objekt) sind in der -Klausel nicht zulässig Wird die -Klausel angegeben, so müssen alle Attribute der Abfrage auch in der - Klausel erscheinen. Zulässig: SELECT aufgabe FROM arbeiten aufgabe; Nicht zulässig: SELECT pr_nr, aufgabe FROM arbeiten aufgabe; 23 Beispiel: SELECT aufgabe FROM arbeiten aufgabe; 24
Beispiel mit zwei Attributen: SELECT pr_nr, aufgabe FROM arbeiten pr_nr, aufgabe; 25 werden auf alle oder einige Datensätze angewendet und liefern jeweils einen Wert zurück. Es sind zwei Parameter möglich: ALL Dies ist die Voreinstellung Es werden alle Werte berücksichtigt DISTCT Es werden alle unterschiedlichen Werte einer Spalte berücksichtigt. sind: M sucht den kleinsten Wert MAX sucht den größten Wert SUM berechnet die Summe (nur Zahl) AVG berechnet den Mittelwert (nur Zahl) COUNT ermittelt die Anzahl von Einträgen 26 können mit der - Klausel kombiniert werden. Es dürfen zusätzlich zu der Aggregatfunktion in der Abfrage nur Werte erscheinen, die in der -Klausel enthalten sind. Beispiel: SELECT M (m_nr) AS kleinstenummer FROM mitarbeiter; SELECT m_name, M(m_nr) FROM mitarbeiter; SELECT m_name, M (m_nr) AS kleinstenummer FROM mitarbeiter m_name; FEHLER!!!!! 27
Die Funktionen M und MAX Die beiden Funktionen geben den kleinsten bzw. größten Wert aus. Wie im letzten Beispiel gezeigt, ist die direkte Ausgabe des Namens nicht möglich, wir benötigen hierzu eine Unterabfrage: SELECT m_nr, m_name FROM mitarbeiter m_nr = (SELECT M (m_nr) FROM mitarbeiter); 28 Die Funktionen SUM und AVG Die beiden Funktionen berechnen die Summe bzw. das arithmetische Mittel der Datenwerte. Die Werte müssen dazu vom Datentyp Zahl sein. SELECT SUM (mittel) AS Summe FROM projekt; SELECT AVG (mittel) AS Mittelwert FROM projekt mittel > 100000; 29 Die Funktion COUNT Die Funktion kann in zwei Formen angewandt werden COUNT (spaltenname) COUNT (DISTCT spaltenname) Hier werden die Werte der Spalte gezählt, wobei im zweiten Fall alle doppelten Werte ignoriert werden. -Werte bleiben unberücksichtigt. COUNT (*) Hier werden die Zeilen (unter Berücksichtigung der -Werte) gezählt. 30
COUNT - Beispiel 1 für die erste Form: Wie viele Aufgaben werden in jedem Projekt ausgeübt? (Werte ohne ) SELECT pr_nr, COUNT (aufgabe) AS anzahl FROM arbeiten pr_nr; 31 COUNT - Beispiel 2 für die erste Form: Wie viele verschiedene Aufgaben werden in jedem Projekt ausgeübt? (Werte zusammengefasst ohne ). Diese Form wird von Access nicht unterstützt! SELECT pr_nr, COUNT DISTCT (aufgabe) AS anzahl FROM arbeiten pr_nr; 1 32 COUNT - Beispiel für die zweite Form: Wie viele Mitarbeiter arbeiten in jedem Projekt? (Werte mit ) SELECT pr_nr, COUNT (*) AS anzahl FROM arbeiten pr_nr; 33
Die Funktion -Klausel steht alternativ zur -Klausel. Um auch hier eine Auswahl aus den Daten treffen zu können, lässt sich die - Klausel durch die -Klausel erweitern. Anders ausgedrückt hat die -Klausel für die gleiche Bedeutung wie die - Klausel in der SELECT-Anweisung. Die -Klausel darf neben Konstanten auch enthalten. In der Praxis werden tatsächlich (wegen der Gruppierung) fast ausschließlich eingesetzt. 34 Beispiel: Welche Projekte haben weniger als 4 Mitarbeiter? SELECT pr_nr FROM arbeiten pr_nr COUNT (*) < 4; 35 Die -Klausel definiert die Reihenfolge, in der die Ergebnisse einer Abfrage ausgegeben werden. Attribute, die in der -Klausel erscheinen, müssen in der Abfrage vorhanden sein. Dies kann aber auch implizit durch die Angabe aller Attribute (*) geschehen. 36
Beispiel: Die Mitarbeiter sollen sortiert nach Nachname und Vorname ausgegeben werden. SELECT * FROM mitarbeiter m_name, m_vorname; 37 Wie man erkennen kann, wird standardmäßig in aufsteigender Reihenfolge sortiert. Dies lässt sich aber durch die Angabe des optionalen Sortierparameters steuern. Die vollständige Syntax lautet: {name position ASC DESC} Beispiel 1: SELECT * FROM mitarbeiter m_name DESC; Beispiel 2 (Mischform): SELECT * FROM mitarbeiter m_name DESC, m_vorname [ASC]; Die Angabe ASC kann hier entfallen! 38 Sollen Daten aus verschiedenen Tabellen und mit verschiedenen Kriterien zusammengefügt werden, so benötigt man den Mengenoperator. Die Zusammenführung beinhaltet alle Daten, die in einer oder mehrerer der Ergebnismengen vorhanden ist. Ebenso wie SELECT kann man bei den Operator ALL verwenden. Dies bewirkt, dass mehrfache Ergebnisse auch mehrfach ausgegeben werden. Im Gegensatz zu SELECT ist ALL bei aber nicht die Voreinstellung. 39
Beispiel: Gesucht sind die Personalnummern aller Mitarbeiter, die entweder der Abteilung a1 angehören oder Gruppenleiter sind. SELECT m_nr FROM mitarbeiter abt_nr = a1 SELECT m_nr FROM arbeiten aufgabe = Gruppenleiter ; 40 SELECT m_nr FROM mitarbeiter abt_nr = a1 SELECT m_nr FROM arbeiten aufgabe = Gruppenleiter ; 41