150.422 1 Datenbanken – SQL Handout 1 SS 2016 Einfache Abfragen • Allgemeine Form • einfacher SQL-Abfragen: SELECT spalte1, spalte2,... FROM tabelle WHERE bedingung Diese Abfrage gibt alle Werte von tabelle in den Spalten spalte1, spalte2,... zurück, die bedingung erfüllen (d.h., sodass bedingung wahr ist). Das heißt, der SELECT-Teil gibt an, welche Spalten zurückgegeben werden sollen, der WHERE-Teil spezifiziert, welche Zeilen angezeigt werden. Sollen alle Spalten von tabelle zurückgegeben werden, so kann statt der Spaltennamen * verwendet werden. B Beispiele. Zeige alle steirischen Firmen der Tabelle Supplier mit ihrer PLZ und Evaluierung. 1 SELECT S_Company , S_Areacode , S_Evaluation FROM Supplier WHERE S_State = ’ Steiermark ’ Zeige alle Spalten von Angeboten aus Order Options mit einem Preis kleiner als 5,– pro Einheit. SELECT * FROM Order_Options WHERE Price_per_Unit < 5 Zeige alle Bestellungen aus Orders, bei denen die Anzahl der bestellten Einheiten kleiner ist als die Anzahl der Einheiten pro Bestellung. SELECT * FROM Orders WHERE No_of_Units_ordered < Unit_No_per_Order • Vergleiche • Zum Vergleich von Ausdrücken können =, <, >, <=, >=, and <> (alternativ !=) verwendet werden. Dies funktioniert auch für Strings, die lexikografisch, oder Datumswerte, die chronologisch miteinander verglichen werden. String-Literale müssen unter Anführungszeichen gesetzt werden, numerische Literale sollten nicht mit Anführungszeichen verwendet werden. MySQL wandelt oft automatisch Datentypen um. Daher ist Vorsicht geboten, wenn verschiedene Datentypen miteinander verglichen werden. Weil in der Tabelle Supplier die Spalte Area Code als String (varchar) definiert ist, wird in der Abfrage SELECT * FROM Supplier WHERE Area_Code < ’8 ’ lexikografisch verglichen. Ersetzt man ’8’ durch 8 wird die PLZ in eine Zahl umgewandelt und numerisch verglichen. Einfache Muster in Strings können mit LIKE abgefragt werden. Im Vergleichsstring steht dabei das Sonderzeichen für ein beliebiges einzelnes Zeichen sowie % für eine beliebige Anzahl (inkl. 0) von beliebigen Zeichen. B Beispiele. Zeige alle Firmen aus Supplier, deren PLZ mit 8 beginnt. SELECT * FROM Supplier WHERE S_Areacode LIKE ’ 8% ’ Zeige alle Firmen aus Supplier, deren PLZ aus vier Stellen besteht und mit 8 beginnt. SELECT * FROM Supplier WHERE S_Areacode LIKE ’8 ___ ’ Zeige alle Firmen aus Supplier mit 7 an der zweiten Stelle der PLZ. SELECT * FROM Supplier WHERE S_Areacode LIKE ’ _7 % ’ • Mathematische Ausdrücke • In mathematischen Ausdrücken können sowohl Konstanten (in der Form von Literalen) als auch Spalten(namen) verwendet werden. Neben den Grundrechnungsarten +, -, * and / stehen auch einige mathematische Funktionen zur Verfügung, u.a. SQRT(x), POWER(x,y ), SIN(x), COS(x), TAN(x), ROUND(x), ROUND(x,digits), FLOOR(x), CEILING(x), EXP(x), LOG(x), LOG10(x), ABS(x), SIGN(x), RAND(x), LEAST(x,y ,. . . ), GREATEST(x,y ,. . . ), sowie die Konstante PI. • Verknüpfen von Bedingungen • Bedingungen (Boolesche Ausdrücke) können mit AND, OR miteinander verknüpft und mit NOT negiert werden. Um die Auswertungsreihenfolge festzulegen, sollten runde Klammern verwendet werden. B Examples. Zeige alle Bestellungen mit einem Bestellwert zwischen 1 und 100. 3 SELECT O_No , S_No , P_No , No_of_Units_ordered * Price_per_Unit AS Price FROM Orders WHERE No_of_Units_ordered * Price_per_Unit > 1 AND No_of_Units_ordered * Price_per_Unit < 100 Mit AS können Spalten in der angezeigten Ergebnistabelle umbenannt werden. Zeige alle Bestellmöglichkeiten aus Order Options für alle KT-Teile und all jene DL-Teile, deren P No nicht mit 7 endet. Gib den Preis pro Einheit gerundet nach der ersten Dezimalstelle an. 1 SELECT S_No , P_No , ROUND ( Price_per_Unit ,1) AS Price FROM Order_Options WHERE P_No LIKE ’ KT % ’ OR ( P_No LIKE ’ DL % ’ AND NOT ( P_No LIKE ’ %7 ’) ) Anstelle von NOT (P No LIKE ’%7’) kann auch P No NOT LIKE ’%7’ verwendet werden. ∆ Achtung! ∆ Beachten Sie, dass hier ein umgangsprachliches und ein logisches oder ist! Zeige alle steirischen und deutschen Firmen aus Supplier, die die Evaluierung A haben. 2 SELECT * FROM Supplier WHERE ( S_State = ’ Steiermark ’ OR S_Country = ’ Deutschland ’) AND S_Evaluation = ’A ’ ∆ Achtung! ∆ Ohne Klammern würde die letzte Abfrage ein anderes Ergebnis liefern! Faustregel: Verwende immer Klammern, wenn Bedingungen mit AND und OR miteinander verknüpft werden! • Sortieren • Die Ergebnistabelle kann durch nachgestelltes ORDER BY spalte1, spalte2,... nach den angegebenen Spalten sortiert werden. Anstelle des Spaltennamens kann auch die Spaltennummer im SELECT-Teil der Abfrage verwendet werden (d.h., 1=erste Spalte,. . . ). Die Sortierung erfolgt in der Regel aufsteigend. Fügt man der entsprechenden Spalte bzw. Spaltennummer DESC hinzu, wird absteigend sortiert. B Beispiele. Zeige alle Firmen aus Supplier. Sortiere nach Land (aufsteigend) sowie nach der Spalte S No (absteigend). 2 SELECT * FROM Supplier ORDER BY S_Country , S_No DESC Zeige alle Bestellungen zusammen mit ihrem Bestellwert. Sortiere absteigend nach Bestellwert. 3 SELECT O_No , S_No , P_No , No_of_Units_ordered * Price_per_Unit AS Price FROM Orders ORDER BY 4 DESC Regel: ORDER BY muss immer am Ende einer Abfrage stehen.