Merkblatt D-2.1 Datentechnik SQL SELECT SQL Select Datenbasis Grundlage einer Datenabfrage bilden Tabellen. Person Autoschild Person PID AID 1 PID Name Name NR 1 Meier m Pers (*) 2 Karlen seit 3 Grüter 4 Fior 5 Meier Autoschild AId NR 1 ZH 23 2 AG3 3 ZH 5 4 ZH 67 5 SG 4 6 ZH 54 7 AG 33 Pers 3 1 4 3 3 4 5 seit 1990 1978 2000 1990 1995 1990 2000 SQL Grundbefehl SELECT FROM WHERE Person.Name, Autoschild.NR Person, Autoschild Person.PID = Autoschild.Pers Resultat : Person.Name Grüter Meier Fior Grüter Grüter Fior Meier Autoschild.NR ZH 23 AG 3 ZH 5 ZH 67 SG 4 ZH 54 AG 33 ! Liste der Attribute die angezeigt werden Liste der benötigten Tabellen Festlegen der Beziehung über Schlüssel-Fremdschlüssel Paar ( EQUI-Join) ACHTUNG : Meier, AG 3 und Meier, AG 33 ist nicht die gleiche Person! Ganz korrekt wäre das Resultat, wenn auch der Schlüsselwert PID in die Abfrage einbezogen wäre! ! Da zu Karlen (PID = 2) kein korrespondierender Eintrag existiert, erscheint diese Person auch nicht in den Resultatdaten! (Hinweis : Bei Abfrage mit Outer-Join auf Tabelle Person werden alle Personen angezeigt) Abteilung Informatik/Technik Merkblatt D2-1 SQL_a.doc 1/4 Datentechnik SQL SELECT Merkblatt D-2.1 Filter Filter dienen der Auswahl ganz bestimmter Datensätze SELECT Person.Name, Autoschild.NR FROM Person, Autoschild WHERE Person.PID = Autoschild.Pers AND Autoschild.NR LIKE ’ZH%’ Resultat : Person.Name Grüter Fior Grüter Fior Text muss in ‘ ‘ angeschrieben werden Autoschild.NR ZH 23 ZH 5 ZH 67 ZH 54 Operatoren = >=, <=, <> LIKE BETWEEN .. AND .. AND, OR Gleichheit von zwei Attributwerten kleiner, grosser, ungleich “Ähnlichkeit” von Zeichenketten Bereich mit Start- und Endwert logische Verknüpfung mehrerer Bedingungen Textersatz % _ 2/4 für viele beliebige Zeichen für genau ein beliebiges Zeichen V 1.1 © René Probst Merkblatt D-2.1 Datentechnik SQL SELECT Aggregationen Die Attribute der Ausgabe können einer Funktion zugewiesen und so weiter verarbeitet werden. Einige Funktionen COUNT SUM AVG MIN, MAX usw. zählt die resultierenden Datensätze summiert die Datenwert (nur für Zahlen) ermittelt den arithmetischen Mittelwert ermittelt den kleinsten, grössten Attributswert Abfrage für Aggregierung „Wie viele Autos besitzen die Personen?“ Die Abfrage muss – bis auf die aggregierte Spalte – redundante Datensätze liefern! SELECT Person.PID Person.Name, COUNT(Person.PID) AS ’Anzahl Auto’ FROM Person, Autoschild WHERE Person.PID = Autoschild.Pers GROUP BY Person.PID, Person.Name Alle Attribute die nicht in die Aggregation eingebunden sind, müssen in der GROUB BY Klausel aufgelistet werden! Resultat : PID Person.Name 4 Fior 3 Grüter 1 Meier 5 Meier Anzahl Auto 2 3 1 1 Filter auf aggregierten Wert „Welche Personen haben mehr als zwei Autos?“ SELECT Person.PID, Person.Name, COUNT(Person.PID) AS ’Anzahl Auto’ FROM Person, Autoschild WHERE Person.PID = Autoschild.Pers GROUP BY Person.PID, Person.Name HAVING Count(Person.PID) > 2 Resultat : Person.Name Grüter Anzahl Auto 3 Abteilung Informatik/Technik Merkblatt D2-1 SQL_a.doc 3/4 Datentechnik SQL SELECT Merkblatt D-2.1 Typische Fehlerfälle Kreuzprodukt Beziehung zwischen den Tabellen werden nicht berücksichtigt! SELECT Person.Name, Autoschild.NR FROM Person, Autoschild Beziehung fehlt!! 5 Einträge in Tabelle Person und 7 Einträge in Tabelle Autoschild 5 * 7 = 35 Datensätze angezeigt Unnötige Beziehungen Es werden Tabellen aufgelistet, die für die Abfrage nicht relevant sind! SELECT Person.Name FROM Person, Autoschild Autoschild ist nicht nötig, da nur Name! WHERE Person.PID = Autoschild.Pers ohne Beziehung ergibt sich ein Kreuzprodukt mit 35 Datensätzen! Es werden alle verknüpften Datensätze angezeigt, d.h. dass auch Mehrfachnennungen vorkommen und Datensätze ohne Fremdschlüssel nicht erscheinen (hier z.B. Karlen) Resultat falsch : Resultat korrekt : SELECT Person.Name Person.Name Person.Name FROM Person Grüter Meier Meier Karlen Abfrage ohne unnötige Tabellen Fior Grüter und Beziehungen! Grüter Fior Grüter Meier Fior Meier Unnötige Gruppierung Wird auf eine SQL-Abfrage die GROUP BY Klausel angewendet, so werden gleiche (redundante) Datensätze zusammengefasst! SELECT Person.Name FROM Person GROUP BY Person.Name Person.Name Meier Karlen Grüter Fior 4/4 Die beiden Meier werden als ein Datensatz interpretiert! V 1.1 © René Probst