Einführung in die Wirtschaftsinformatik Teil 12 - SQL - Abfragen und Joins Wintersemester 2015/2016 Lehrstuhl für Wirtschaftsinformatik und Electronic Government Universität Potsdam Chair of Business Information Systems and Electronic Government University of Potsdam Univ.-Prof. Dr.–Ing. habil. Norbert Gronau Lehrstuhlinhaber | Chairholder August-Bebel-Str. 89 | 14482 Potsdam | Germany Tel Fax +49 331 977 3322 +49 331 977 3406 E-Mail [email protected] Web lswi.de Inhalt Alternative Ausdrücke Daten aus mehreren Tabellen Datenauswahl mit Joins Quelle: Alternative Ausdrücke Daten aus mehreren Tabellen Datenauswahl mit Joins Bedingte Ausdrücke Bereitstellen von IF-THEN-ELSE-Logik innerhalb der SQL-Anweisung Verwendung von zwei Methoden CASE-Ausdrücke CASE ausdruck WHEN comp_ausdruck1 THEN return_ausdruck1 [WHEN comp_ausdruck2 THEN return_ausdruck WHEN comp_ausdruckn THEN return_ausdruckn ELSE else_ausdruck] END Funktion DECODE DECODE(col|ausdruck, such1, ergebnis1 [, such2, ergebnis2,...,] [, default]) Anwendung von CASE-Ausdrücken Bedingte Abfragen in der Form von IF-THEN-ELSE-Anweisung SELECT name, position, gehalt, CASE position WHEN 'Konstrukteur' THEN gehalt*1.10 WHEN 'Monteur' THEN gehalt*1.15 WHEN 'Meister' THEN gehalt*1.05 ELSE gehalt END Gehaltserhöhung FROM mitarbeiter ORDER BY position; NAME ... Klein Plenk ... Ascheid Krause ... Thal Möhlmann ... Quelle: Greenberg 2002, S. 176 POSITION ... Konstrukteur Konstrukteur ... Meister Meister ... Monteur Monteur ... GEHALT ... 4100 4700 ... 3990 3680 ... 2400 2740 ... GEHALTSERHÖHUNG ... 4510 5170 ... 4189,5 3864 ... 2760 3151 ... Anwendung der Funktion DECODE Wirkung der Anweisung ähnlich der IF-THEN-ELSE-Anweisung SELECT name, position, gehalt, DECODE(position, 'Konstrukteur', gehalt*1.10, 'Monteur', gehalt*1.15, 'Meister', gehalt*1.05, gehalt) Gehaltserhöhung FROM mitarbeiter ORDER BY position; NAME ... Klein Plenk ... Ascheid Krause ... Thal Möhlmann ... Quelle: Greenberg 2002, S. 178 POSITION ... Konstrukteur Konstrukteur ... Meister Meister ... Monteur Monteur ... GEHALT ... 4100 4700 ... 3990 3680 ... 2400 2740 ... GEHALTSERHÖHUNG ... 4510 5170 ... 4189,5 3864 ... 2760 3151 ... Abfragereihen mit der Funktion DECODE Anzeige des Steuersatzes aller Angestellten der Abteilung 310T SELECT name, position, gehalt, DECODE (TRUNC(gehalt/1000, 0), 0, 0.00, 1, 0.20, 2, 0.25, 3, 0.30, 4, 0.35, 5, 0.40, 0.45) Steuersatz FROM mitarbeiter WHERE abt_nr = '310T'; NAME Kettler Klein Plenk Berg Quelle: Greenberg 2002, S. 179 POSITION Abteilungsleiter Konstrukteur Konstrukteur Sekretärin GEHALT 8080 4100 4000 2250 STEUERSATZ ,45 ,35 ,35 ,25 Alternative Ausdrücke Daten aus mehreren Tabellen Datenauswahl mit Joins Fähigkeiten der Anweisung SELECT n A n n Auswahl (Selektion) Projektion B C D A E B Join - Verbinden von Tabellen A B C D E A2 B2 C2 D C D E Kartesische Produkte Bildung eines kartesischen Produktes, wenn... ... alle Zeilen aus der ersten Tabelle mit allen Zeilen aus der zweiten Tabelle verknüpft werden ... eine Join-Bedingung fehlt ... eine Join-Bedingung ungültig ist Vermeidung kartesischer Produkte WHERE-Klausel enthält gültige Join-Bedingung Voraussetzung - Beziehung über Fremd- und Primärschlüssel bzw. Felder mit identischen Datentypen Daten abfragen - Verbinden von Tabellen Direkte Verknüpfung mehrerer Tabellen Verknüpfung erfolgt in Ausgabeliste durch kartesisches Produkt (Kreuzprodukt) Grundprinzip Verknüpfung jeder Zeile einer Tabelle mit jeder Zeile der anderen Tabelle(n) Beispiel auf den folgenden Seiten - kartesisches Produkt aus Tabellen mitarbeiter x abteilung --> 139 Zeilen x 30 Zeilen --> 4170 Zeilen --> 14 Spalten + 4 Spalten --> 18 Spalten Ergebnistabelle --> Ergebnis inhaltlich unsinnig --> Logischer Zusammenhang nur zwischen einzelnen Datenfeldern Das formale Vorgehen beim Kreuzprodukt entspricht dem beim Vektorprodukt in der Mathematik. Kreuzprodukt aus mehreren Tabellen - Struktur abteilung mitarbeiter ABT_NR PERS_NR NAME VORNAME ANREDE AKAD_TITEL LEITER POSITION GEBURTSTAG EINSTELLUNG GEHALT ABT_NR PROJ_NR KONTO BLZ x ABT_NAME BETR_TEIL BEMERKUNG = Ergebnis der Abfrage PERS_NR NAME VORNAME ANREDE AKAD_TITEL LEITER POSITION GEBURTSTAG EINSTELLUNG GEHALT ABT_NR PROJ_NR KONTO BLZ ABT_NR ABT_NAME BETR_TEIL BEMERKUNG Bei einem Kreuzprodukt werden alle Spalten der betreffenden Tabellen miteinander "gekreuzt". Kreuzprodukt aus mehreren Tabellen - Inhalt PERS_NR ... 4170 Zeilen ... NAME VORNAME ABT_NR PROJ_NR ABT_NR ABT_NAME BETR_TEIL 101001Büchner Edgar 260F 100VVorstandsstab GL 101001Büchner Edgar 260F 105CControlling GL 101001Büchner Edgar 260F 106QQualitätssicherung GL 101001Büchner Edgar 260F 107RInterne Revision GL ... ... ... 101001Büchner Edgar 260F 101001Büchner Edgar 260F ... ... ... ...... 260EElektro-Werkstatt 260FProduktion-Fertigung ...... ... PO PO ... 101002Martens Eugen 260F 100VVorstandsstab GL 101002Martens Eugen 260F 105CControlling GL ... ... 101002Martens ... Eugen ... ...... 260F 260FProduktion-Fertigung ... PO 18 Spalten Die umrahmten Bereiche beinhalten Ergebnisse des Kreuzproduktes mit logischem Zusammenhang Ein kartesisches Produkt mehrerer Tabellen erzeugt (in der Regel) keine sinnvolle Ergebnistabelle. Kreuzprodukt - Problemstellung Namensgleichheit Mehrdeutigkeit bei Namensgleichheit von Spalten Zuordnung Spaltenname zu Tabellenname in Abfrage notwendig A SELECT pers_nr, name, abt_nr, abt_name FROM mitarbeiter, abteilung; Spalte "abt_nr" - keine Zuordnung möglich B SELECT pers_nr, name, m.abt_nr, abt_name FROM mitarbeiter m, abteilung a; Zuordnung der Spalte "abt_nr" erfolgt aus Tabelle "mitarbeiter" C SELECT pers_nr, name, a.abt_nr, abt_name FROM mitarbeiter m, abteilung a; Zuordnung der Spalte "abt_nr" erfolgt aus Tabelle "abteilung" Ergebnistabellen (Ausgabe) für Beispiel B und C sind identisch Alternative Ausdrücke Daten aus mehreren Tabellen Datenauswahl mit Joins Arten von Joins Oracle-spezifische Joins SQL: 1999-kompatible Joins Equi-Join Cross-Joins Non-Equi-Join Natural-Joins Outer-Join USING-Klausel Self-Join Vollständige (zweiseitige) Outer-Joins Beliebige Join-Bedingungen für Outer-Joins Quelle: Greenberg 2002, S. 194 Verknüpfung von Tabellen - Grundlagen, Syntax Daten aus mehreren Tabellen abfragen mit Join Join-Bedingung in der WHERE-Klausel Tabellenname steht vor Spaltennamen durch Punkt getrennt Syntax: tabellenname.spaltenname SELECT tabelle1.spalte, tabelle2.spalte FROM tabelle1, tabelle2 WHERE tabelle1.spalte1 = tabelle2.spalte2; Kann - unterschiedliche Spaltennamen in den Tabellen Muss - dieselben Spaltennamen in verschiedenen Tabellen Quelle: Greenberg 2002, S. 195 Voraussetzungen für Verknüpfung von Tabellen Tabelle 1 -> Fremdschlüssel = Primärschlüssel <- Tabelle 2 Notwendig - Identische Eigenschaften (Datentyp) der Spalten Sinnvoll aber nicht zwingend - Identische Spaltennamen mitarbeiter PERS_NR NAME VORNAME ANREDE AKAD_TITEL LEITER POSITION GEBURTSTAG EINSTELLUNG GEHALT ABT_NR PROJ_NR KONTO BLZ abteilung ABT_NR ABT_NAME BETR_TEIL BEMERKUNG projekt PROJ_NR PROJ_NAME PROJ_LEITER PROJ_BEGINN PERSONALKOSTEN PROJEKTBESCHREIBUNG PROJ_ENDE Equi-Joins (Joins, Inner-Joins, Inner-Equi-Joins) Tabelle „mitarbeiter“ Tabelle „abteilung“ ABT_NR ABT_NAME 100V Vorstandsstab PERS_NR 101026 ABT_NR 105C 101025 210E 105C Controlling 101085 107R 106Q Qualitätssicherung 101017 260Z 107R Interne Revision 101032 230P 210E Einkauf 101130 550S 101050 101129 540P 101082 107R ..... ..... 220L Logistik 230P Produktionsplanung 240P Prozessplanung ... ... Beispiele für Übereinstimmung Fremdschlüssel Quelle: Elmasri 2002, S. 251 Primärschlüssel Aufruf von Datensätzen über Equi-Joins SELECT ma.pers_nr, ma.name, ma.abt_nr, abt.abt_nr, A B abt.abt_name FROM mitarbeiter ma, abteilung abt WHERE ma.abt_nr = abt.abt_nr; A PERS_NR NAME 101068 Adler 101093 Sonntag 101066 Grimm ... ... 101058 Müller 101038 Michalke ... ... 101045 Krause 101074 Kohl ABT_NR 100V 100V 100V ... 220L 230P ... 640S 640S B ABT_NR ABT_NAME 100V Vorstandsstab 100V Vorstandsstab 100V Vorstandsstab ... ... 220L Logistik 230P Produktionsplanung ... ... 640S Technik, Service, Support 640S Technik, Service, Support Die WHERE-Klausel verknüpft Tabellen so, dass nur sinnvolle und logische Ergebnisse entstehen. Quelle: Greenberg 2002, S. 197 Übersicht: Mehrdeutige Spaltennamen mitarbeiter.name abteilung.name Kennzeichnung Eindeutige Kennzeichnung von Spaltennamen bei Vorkommen in mehreren Tabellen --> Einsatz von Präfixen Name AS Mitarbeitername Geschwindigkeit Performance- Verbesserung durch Angabe von Präfixen Zuordnung Eindeutigkeit bei Namensgleichheit Unterscheidung bei identischem Namen in unterschiedlichen Tabellen über Spalten-Alias Eindeutige Kennzeichnung von Spaltennamen bei Vorkommen in mehreren Tabellen --> Einsatz von Präfixen Vereinfachung von Anfragen - Aliasnamen Kürzen Verlängern Kürzen langer und zusammengesetzter Tabellennamen Lesbarmachen kryptischer oder missverständlicher Tabellenkürzel Beispiele Beispiel ... FROM artikelstammdaten artikel ... FROM abt abteilung, ma mitarbeiter ... FROM abteilung a, mitarbeiter m ... FROM btl betriebsteil Erweiterung der Suchkriterien Einschränkungen von Datensätzen in der Abfrage Verwendung des Operators AND SELECT ma.pers_nr, ma.name, ma.abt_nr, ma.position, abt.abt_name FROM mitarbeiter ma, abteilung abt WHERE ma.abt_nr = abt.abt_nr AND position = 'Sekretärin'; pers_nr name abt_nr position abt_name 101048 Jörgensen 105C Sekretärin Controlling 101081 Wolff 106Q Sekretärin Qualitätssicherung 101022 Brauer 210E Sekretärin Einkauf ... ... ... ... ... 101118 Groß 340R Sekretärin Konstruktion Research Verknüpfung - mehrere Tabellen Zusätzliche Suchkriterien in WHERE-Klausel Verknüpfung von n Tabellen - mindestens n-1 Join-Bedingungen mitarbeiter NAME Johansson Schmiedel Martens Büchner Kettler Thal Remus Möhlmann Köhler Grauer ….. abteilung ABT_NR 410R 260D 310T 260F 410R 260F 250A 520G ABT_NR 100V 105C 106Q 107R 210E 220L 230P 240P 250A BETR_TEIL GL GL GL GL PO PO PO PO PO betriebsteil BETR_TEIL BEREICHSNAME GL Geschäftsleitung PO Produktion, Organisation KE Konstruktion, Entwicklung FR Finanzbuchhaltung, Rechnungswesen HR Personal IT Technik ... ... ….. ... WHERE m.abt_nr = a.abt_nr AND a.betr_teil = b.betr_teil; Non-Equi-Joins Join-Bedingung, die nicht den Gleich-Operator verwendet Beispiel: Ungleichheitszeichen (<> oder !=) gratifikation mitarbeiter NAME GEHALT 56000 35000 Reinhard Johansson ... ... 3610 3600 3480 Hofmann Fuchs Riekhoff ... Schuster Assmann Kohl Schuster ... 700 500 500 500 MINGEHALT 0 2501 3501 5001 7501 MAXGEHALT 2500 3500 5000 7500 19999 GRATIF 65 55 45 35 25 Prüfung der Werte aus "GEHALT" mit Spalten "MINGEHALT" und "MAXGEHALT" über WHERE-Klausel auf Ungleichheit Zuordnung des jeweiligen Werte aus Spalte "GRATIF", wenn Ungleichheitsbedingung erfüllt ist Quelle: Greenberg 2002, S. 202 Aufruf eines Non-Equi-Joins SELECT m.name, m.gehalt, g.gratif FROM mitarbeiter m, gratifikation g WHERE m.gehalt BETWEEN g.mingehalt AND g.maxgehalt; NAME GEHALT 500 500 Assmann Schuster ... 55 45 45 3480 3600 3610 Riekhoff Fuchs Hofmann Michalke Schulz-Niemeyer Büchner 65 65 ... ... ... GRATIF ... Anzeige von Datensätzen nur bei erfüllter Bedingung. ... 8440 8900 10430 25 25 25 Die Verwendung der Tabellen-Aliasnamen erfolgt oft aus Performance-Gründen. Outer-Joins Anzeige der in direkter Beziehung stehenden Datensätze und... Anzeige von Datensätzen, ohne direkten Bezug zu Datensätzen anderer Tabellen mitarbeiter abteilung ABT_NR ABT_NAME 100V Vorstandsstab 105C Controlling 106Q Qualitätssicherung .......... 530A Personal Leiharbeit 540P Personalentwicklung 550S Arbeitssicherheit ...... Abteilung 550S noch ohne Mitarbeiter Quelle: Greenberg 2002, S. 204 PERS_NR 101001 101002 101003 101004 101005 101006 101007 101008 NAME Büchner Martens Dost Fuchs Rösch Beyer Kettler Schneider …..….. 101134 Ludwig 101135 Fritzsche 101136 Bode ABT_NR 260D 210E 260D 510L 320M 310T 260K ….. 630E 630E 630E keiner Abteilung zugeordnet Outer-Joins - Syntax RIGHT: Aufruf aller Zeilen der rechten Tabelle nach ON SELECT tabelle1.spalte, tabelle2.spalte, ... FROM tabelle1 RIGHT OUTER JOIN tabelle2 ON tabelle1.spalte = tabelle2.spalte; LEFT: Aufruf aller Zeilen der linken Tabelle nach ON SELECT tabelle1.spalte, tabelle2.spalte, ... FROM tabelle1, LEFT OUTER JOIN tabelle2 ON tabelle1.spalte = tabelle2.spalte; Mit einem Right- bzw. Left-Outer-Join wird eine sogenannte rechte bzw. linke Inklusionsverknüpfung erstellt. Aufruf eines Outer-Joins SELECT m.name, m.abt_nr, a.abt_name FROM mitarbeiter m RIGHT OUTER JOIN abteilung a ON m.abt_nr = a.abt_nr; NAME Adler Sonntag Grimm Walther ABT_NR 100V 100V 100V 100V ... Vorstandsstab Vorstandsstab Vorstandsstab Vorstandsstab ... ... 260D Werkstatt Drehteilefert. 260D Werkstatt Drehteilefert. 260D Werkstatt Drehteilefert. Elektro-Werkstatt 260F Produktion-Fertigung Martens Tänzer Fuchs Büchner ... ABT_NAME ... ... keine Daten in Tabelle "mitarbeiter" Übersicht: Inner- und Outer-Joins Join Join Inner-Join (Equi-Join) Verknüpfung zwischen zwei Tabellen Rückgabe nur von übereinstimmenden Zeilen Left(Right)-Outer-Join Ergebnisrückgabe des Inner-Joins sowie Zeilen ohne Übereinstimmungen in der linken (bzw. rechten) Tabelle Join Full-Outer-Join Ergebnisrückgabe des Inner-Joins sowie eines Left-Outer-Joins und Right-Outer-Joins Verknüpfung zwischen zwei Tabellen - Rückgabe nur von übereinstimmenden Zeilen Quelle: Kemper 2000, S. 90 f. Full-Outer-Join Kombination von Left-Outer-Join und Right-Outer-Join Anzeige aller in den verknüpften Basistabellen vorhandenen Zeilen SELECT m.name, m.abt_nr, a.abt_name FROM mitarbeiter m FULL OUTER JOIN abteilung a ON m.abt_nr = a.abt_nr; NAME Büchner Martens Dost ... ABT_NR ABT_NAME 260F Produktion-Fertigung 260D Werkstatt Drehteilefertigung 210E Einkauf ...... Krajcsir Walker ... Brauer Quelle: Elmasri 2002, S.258 ...... 210E Einkauf Elektro-Werkstatt Self-Joins Tabelle wird mit sich selbst verbunden Zusätzliche Bezeichner/Alias-Namen in der FROM-Klausel zur Unterscheidung mitarbeiter (angestellte) PERS_NR NAME LEITER 101001 Büchner 101002 Martens 101003 Dost 101004 Fuchs 101005 Rösch 101006 Beyer 101007 Kettler 101008 Schneider 101009 Beyerke ….. mitarbeiter (leiter) ….. 101060 101060 101059 101060 101047 101070 101070 101038 PERS_NR NAME ….. ….. 101041 Büchner 101042 Schmiedel ….. ….. ….. ….. Ein Self-Join ermöglicht die Herstellung von Verbindungen innerhalb einer Tabelle mit einer einzigen Abfrage. Syntax für Self-Joins SELECT tab1.spalte, ..., tab2.spalte FROM tabelle1 tab1, tabelle1 tab2 WHERE tab1.spalte1 = tab2.spalte1; Wer ist der/die Vorgesetzte von Mitarbeiter Beyerke? SELECT angestellte.name || ' ist Untergebene/r von ' || leiter.name FROM mitarbeiter angestellte, mitarbeiter leiter WHERE angestellte.leiter = leiter.pers_nr AND angestellte.name = 'Beyerke'; ANGESTELLTE.NAME||'ISTUNTERGEBENE/RVON'||LEITER.NAME Beyerke ist Untergebene/r von Schmiedel Kreuzprodukt aus zwei Tabellen Entspricht kartesischem Produkt Verbinden mehrerer Tabellen ohne Verknüpfungskriterium Liefert meist sinnlose Ergebnisse Vorteil für Test von Datenbanken - Einfaches Erzeugen großer Datenmengen SELECT spalte1, spalte2, ... FROM tabelle1 CROSS JOIN tabelle2; entspricht der simplen Syntax SELECT spalte1, spalte2, ... FROM tabelle1, tabelle2; Natural-Join NATURAL JOIN-Klausel - basiert auf allen Spalten mit demselben Spaltentitel in beiden Tabellen Auswahl der Zeilen mit übereinstimmenden Werten in allen gemeinsamen Spalten Rückgabe einer Fehlermeldung bei Namensgleichheit aber unterschiedlichen Datentypen der Spalten Verknüpfung über NATURAL JOIN - automatisches Einbinden aller Spalten mit gleichen Namen und gleichem Datentyp Einsatz eines Präfix vor verknüpften Spaltennamen nicht zulässig - Fehlermeldung Quelle: Greenberg 2002, S. 212 Datensatzaufruf über Natural-Joins Alternative Formulierung über Equi-Join SELECT abt_nr, abt_name, betr_teil, bereichsname FROM abteilung NATURAL JOIN bereich; ABT_NR ABT_NAME BETR_TEIL BEREICHSNAME 420F Finanzbuchhaltung FR Finanzbuchhaltung, Rechnungswesen 410R Rechnungswesen FR FInanzbuchhaltung, Rechnungswesen 107R Interne Revision GL Geschäftsleitung 106Q Qualitätssicherung GL Geschäftsleitung ... ... ... ... 240P Prozessplanung PO Produktion, Organisation SELECT abt_nr, abt_name, a.betr_teil, bereichsname FROM abteilung a, bereich b WHERE a.betr_teil = b.betr_teil; Quelle: Greenberg 2002, S. 213 On-Klausel in Natural-Joins Erhöhung der Anweisungsverständlichkeit Wirkung der Join-Bedingung für den Natural-Join analog einem Equi-Join aller Spalten mit gleichem Namen On-Klausel dient der Festlegung von beliebigen Bedingungen oder der Angabe zu verknüpfender Spalten SELECT pers_nr, name, vorname, abt_name FROM mitarbeiter m JOIN abteilung a ON m.abt_nr = a.abt_nr; PERS_NR NAME VORNAME ABT_NAME 101068 Adler Jana Vorstandsstab 101093 Sonntag Christof Vorstandsstab 101066 Grimm Bernd Vorstandsstab 101086 Walther Stefanie Vorstandsstab ... ... .. ... 101108 Haustein Reiner Endmontage ... ... ... ... 101090 Kohl Melanie Technik Service, Support Quelle: Greenberg 2002, S. 217 Selektion, Projektion und Join - Fazit Zusammenfassung SELECT mitarbeiter.name, abteilung.name Projektion FROM mitarbeiter, abteilung Join* WHERE mitarbeiter.abt_nr = abteilung.abt_nr AND abteilung.abt_nr = XXX ** Selektion * Verbund (Kreuz-, Kartesisches Produkt) ** Konkreter Wert Kontrollfragen Wann werden CASE-Ausdrücke in SQL-Anweisungen verwendet? Nach der Normalisierung sind ursprüngliche Tabellen oftmals in mehrere neue Tabellen aufgeteilt. Mit welcher Funktion können die Daten daraus wieder miteinander verbunden werden? Unter welchen Bedingungen wird ein kartesisches Produkt erzeugt? Was bewirkt die Verwendung eines LEFT OUTER JOIN in einer Anweisung? Literatur Kemper, A./Eickler, A.: Datenbanksysteme; 6. Auflage, 2006, Oldenbourg Verlag Elmazri, R./Navathe, S. B.: Grundlagen von Datenbanksystemen; 3. Auflage, 2002, Addison-Wesley Greenberg, N./Nathan, P: Professioneller Einstieg in Oracle9i SQL - Band 1; 2002, Oracle Zum Nachlesen Kontakt Univ.-Prof. Dr.-Ing. Norbert Gronau Universität Potsdam August-Bebel-Str. 89 | 14482 Potsdam Germany Tel. +49 331 977 3322 E-Mail [email protected] Gronau, N., Gäbler, A.: Einführung in die Wirtschaftsinformatik GITO Verlag Berlin, 5. Auflage 2014 ISBN 978-3-95545-096-0