Wirtschaftsinformatik SQL Abfragen und QBE Unterrichtsskript Version: Autor: Datum: 2.0 Jonas Lanz 02.06.2006 FHNW⏐Hochschule für Wirtschaft 2 / 29 Inhaltsverzeichnis 1. Einführung 3 1.1 Relationale Operationen 4 1.1.1 Selektion 4 1.1.2 Projektion 4 1.1.3 Verbund 4 2. Datenabfrage (Query) 5 2.1 Einfache Abfragen 6 2.1.1 Duplikate ausblenden 7 2.1.2 Berechnungen 8 2.1.3 Aggregatsfunktionen 8 2.2 Abfragen mit Bedingungen 10 2.2.1 Operatoren 10 2.3 Datensätze sortieren 14 2.4 Datensätze gruppieren 16 2.4.1 Bedingungen für Gruppierungen 17 2.5 Unterabfragen 19 2.6 Tabellen verknüpfen (Joining) 22 2.6.1 Verknüpfungseigenschaften 24 2.7 Kombinationen 26 2.8 Parameterabfragen 27 Anhang 29 Tabellen mit Daten 29 SQL Abfragen und QBE Datum: 02.06.2006 3 / 29 FHNW⏐Hochschule für Wirtschaft 1. Einführung In diesem Kapitel werden die Grundlagen der Datenbanksprache "SQL" (Structured Query Language) für Datenabfragen vermittelt. Diese Sprache wird von vielen Datenbanksystemen (z.B. ORACLE, DBase IV, Microsoft Access usw.) unterstützt. Sie ermöglicht dem Benutzer das Kommunizieren mit dem eigentlichen Datenbanksystem. SQL wurde vom American National Standard Institut (ANSI) als Standardsprache für relationale Datenbanken erklärt. Allerdings haben viele Datenbankhersteller den Sprachumfang für ihre eigenen Systeme erweitert, wodurch die Kompatibilität mit anderen Datenbanksystemen nicht vollständig gewährleistet ist. Der Befehlssatz von SQL lässt sich folgende drei Gruppen unterteilen: Datendefinitionsbefehle: Datenbeschreibung DDL (Data Definition Language) Datenmanipulationsbefehle Datenmanipulationssprache DML (Data Manipulation Language). Datenabfragebefehle: Query Vorliegendes Skript behandelt nur die Datenabfrage. Alle Beispiele beziehen sich auf die Tabellen im Anhang zum Thema "Projektarbeit"1. Die Befehle basieren auf dem von MS Access verwendeten Befehlssatz von SQL. Darüber hinaus bietet MS Access - wie viele andere Produkte auch - eine grafische Oberfläche zur Erstellung von Datenabfragen an. Diese wird als QBE (Query By Example) bezeichnet. Bei den Beispielen sind jeweils beide Varianten gegenüber gestellt. 1 In Anlehnung an: Abts/Mülder 2000, Aufbaukurs Wirtschaftsinformatik. Braunschweig/Wiesbaden: vieweg SQL Abfragen und QBE Datum: 02.06.2006 4 / 29 FHNW⏐Hochschule für Wirtschaft 1.1 Relationale Operationen Im Zusammenhang mit der Datenabfrage sind für Tabellen spezifische Operationen definiert, die als Resultat wiederum Tabellen liefern. Diese relationalen Operationen werden durch entsprechende SQL-Anweisungen umgesetzt. 1.1.1 Selektion Der Selektion entspricht die Ausgabe aller Datensätze einer Tabelle, die bestimmten Kriterien entsprechen. Beispiel: Alle Mitarbeiter mit Ausbildung Informatiker. MITARBEITER PersNr 00100010 00100020 00100030 00100040 00100050 00100060 00100070 00100080 00100090 AbtNr S001 S002 S001 S002 S002 R001 A001 S003 V001 Name Maier Schulz Müller Neumann Moser Kunze Meyer Peters Otto Vorname Hugo Franz Wolfgang Peter Heinz Otto Emil Heinz Karl Heinz Ausbildung Informatiker DVK Systemplaner Programmierer Programmierer Informatiker Systemplaner Systemplaner Informatiker Geburtsdatum 01.01.1960 05.03.1959 22.05.1952 13.09.1962 01.01.1970 02.03.1955 22.07.1965 01.07.1950 13.12.1949 Stundensatz 100.00 80.00 100.00 80.00 85.00 100.00 100.00 100.00 110.00 1.1.2 Projektion Durch die Projektion werden bestimmte Attribute einer Tabelle ausgewählt. Beispiel: PersNr, Name und Vorname aller Mitarbeiter. MITARBEITER PersNr 00100010 00100020 00100030 00100040 00100050 00100060 00100070 00100080 00100090 AbtNr S001 S002 S001 S002 S002 R001 A001 S003 V001 Name Maier Schulz Müller Neumann Moser Kunze Meyer Peters Otto Vorname Hugo Franz Wolfgang Peter Heinz Otto Emil Heinz Karl Heinz Ausbildung Informatiker DVK Systemplaner Programmierer Programmierer Informatiker Systemplaner Systemplaner Informatiker Geburtsdatum 01.01.1960 05.03.1959 22.05.1952 13.09.1962 01.01.1970 02.03.1955 22.07.1965 01.07.1950 13.12.1949 Stundensatz 100.00 80.00 100.00 80.00 85.00 100.00 100.00 100.00 110.00 1.1.3 Verbund Der Verbund (Join) verknüpft zwei Tabellen miteinander. Beispiel: Vgl. Kapitel "Tabellen verknüpfen (Joning)" SQL Abfragen und QBE Datum: 02.06.2006 5 / 29 FHNW⏐Hochschule für Wirtschaft 2. Datenabfrage (Query) Die grundlegende Syntax eines SQL-Abfragebefehls sieht folgendermassen aus: 2 SELECT [DISTINCT] {*|Attributliste|mathematische Ausdrücke} [Bezeichner] FROM Tabellenliste [Bezeichner] [WHERE Bedingungen] [GROUP BY Attributliste] [HAVING Bedingungen] [ORDER BY Attributliste] [ASC|DESC]; Mit SELECT kann angegeben werden, welche Attribute angezeigt werden sollen und wie diese allenfalls in Berechnungen und Funktionen einzusetzen sind. Falls DISTINCT verwendet wird, werden mehrfach auftretende, identische Datensätze nur einmal angezeigt. Mit FROM wird angegeben, aus welchen Tabellen Datensätze abgefragt bzw. zu neuen Datensätzen kombiniert werden. Mit WHERE wird angegeben, welche Bedingungen ein Datensatz erfüllen muss, damit er weiterverarbeitet wird. Mit GROUP BY können Datensätze zu Gruppen zusammengefasst und mit speziellen Gruppenfunktionen weiterverarbeitet werden. HAVING gibt an, welche Bedingungen eine Gruppe aus Datensätzen erfüllen muss, damit sie weiterverwendet wird. Mit ORDER BY können die resultierenden Datensätze vor der Ausgabe nach bestimmten Attributen aufsteigend (ASC für "ascending") bzw. absteigend (DESC für "descending") sortiert werden. 2 Ausdrücke, welche in eckigen Klammern ("[", "]") stehen sind optional, d.h. sie können auch weggelassen werden. Bei Ausdrücken, welche in geschweiften Klammern ("{", "}") stehen und durch einen senkrechten Strich ("|") verbunden sind, kann nur einer dieser Ausdrücke auf einmal verwendet werden. SQL Abfragen und QBE Datum: 02.06.2006 FHNW⏐Hochschule für Wirtschaft 6 / 29 2.1 Einfache Abfragen Die einfachste Datenabfrage mit SQL ist nachstehend aufgeführt. Damit werden alle Datensätze einer Tabelle mit den entsprechenden Attributnamen aufgelistet. In diesem Fall alle Datensätze der Tabelle ABTEILUNG. Die Punktschreibweise ("ABTEILUNG.") gibt explizit an, dass es sich um die Tabelle ABTEILUNG handelt. Diese Schreibweise dient der Unterscheidung von gleichnamigen Attributen in unterschiedlichen Tabellen und ist in Fällen, wo diese Unterscheidung nicht vorgenommen werden muss, nicht zwingend notwendig. Im Sinne einer einheitlichen Schreibweise sollte sie jedoch konsequent angewandt werden. Beispiel 1 SELECT ABTEILUNG.* FROM ABTEILUNG; AbtNr AbtName Kostenstelle A001 Organisation 04711 R001 Rechnerbetrieb 05000 S001 Systemplanung 03030 S002 Anwendungsentwicklung 03020 S003 Benutzerservice 03030 V001 Vertrieb 08010 Im nächsten Beispiel werden von allen Abteilungen "AbtNr" und "AbtName" angezeigt. Beispiel 2 SELECT ABTEILUNG.AbtNr, ABTEILUNG.AbtName FROM ABTEILUNG; SQL Abfragen und QBE Datum: 02.06.2006 FHNW⏐Hochschule für Wirtschaft AbtNr 7 / 29 AbtName A001 Organisation R001 Rechnerbetrieb S001 Systemplanung S002 Anwendungsentwicklung S003 Benutzerservice V001 Vertrieb 2.1.1 Duplikate ausblenden Es gibt Fälle, in denen gleiche Werte mehrmals vorkommen. Beispielsweise kommen in der Tabelle MITARBEITER dieselben AbtNr mehrmals vor. Wenn wir nun wissen möchten, welche verschiedenen AbtNr vorkommen, muss der Befehl DISTINCT verwendet werden: Beispiel 3 SELECT DISTINCT MITARBEITER.AbtNr FROM MITARBEITER; AbtNr A001 R001 S001 S002 S003 V001 SQL Abfragen und QBE Datum: 02.06.2006 8 / 29 FHNW⏐Hochschule für Wirtschaft 2.1.2 Berechnungen Es können auch Berechnungen durchgeführt werden. Mit folgender Abfrage wird das Budget inkl. MWSt zu einem Satz von 7.6% basierend auf dem (Netto-) Budget berechnet. Beispiel 4 SELECT PROJEKT.ProjNr, PROJEKT.Budget, Budget*1.076 AS Budget_inkl_MWSt FROM PROJEKT; ProjNr Budget Budget_inkl_MWSt 4711 100'000.00 107600 4712 80'000.00 86080 5000 60'000.00 64560 An diesem Beispiel ist ersichtlich, dass man jedem Attribut für die Ausgabe einen eigenen Namen geben kann ("Budget_inkl_MWSt" statt dem Formelausdruck). Hätten wir auf diesen Ausdruck im SELECT-Teil verzichtet, so wäre die ganze Formel oder alternativ ein systeminterner Ausdruck als Spaltenname angezeigt worden. 2.1.3 Aggregatsfunktionen Für Berechnungen, insbesondere statistische Berechnungen, gibt es diverse sog. Aggregatsfunktionen. Die wichtigsten sind folgende: Funktion Name Beschreibung COUNT() Anzahl Berechnet die Anzahl der von einer Abfrage zurückgegebenen Datensätze. AVG() Mittelwert Berechnet den arithmetischen Mittelwert einer Menge von Werten. MIN(), MAX() Minimum Geben den kleinsten bzw. grössten Wert aus einer Menge von Werten Maximum zurück. Summe Gibt die Summe einer Menge von Werten zurück. SUM() SQL Abfragen und QBE Datum: 02.06.2006 9 / 29 FHNW⏐Hochschule für Wirtschaft Mit der folgenden Abfrage erhält man die Anzahl Projekte, das höchste Budget, das niedrigste Budget und das Durchschnittsbudget. Beispiel 5 SELECT Count(PROJEKT.ProjNr) AS AnzahlvonPersNr, MAX(PROJEKT.Budget) AS MaxvonBudget, MIN(PROJEKT.Budget) AS MinvonBudget, AVG(PROJEKT.Budget) AS MittelwertvonBudget FROM PROJEKT; AnzahlvonPersNr MaxvonBudget MinvonBudget MittelwertvonBudget 3 100000 SQL Abfragen und QBE 60000 80000 Datum: 02.06.2006 10 / 29 FHNW⏐Hochschule für Wirtschaft 2.2 Abfragen mit Bedingungen Meistens möchte man nicht alle Datensätze einer Tabelle anzeigen lassen, sondern eine Auswahl treffen. Dazu müssen Bedingungen eingegeben werden. In folgendem Beispiel werden "Name" und "Vorname" derjenigen Mitarbeiter aufgelistet, die Informatiker sind. Beispiel 6 SELECT MITARBEITER.Vorname, MITARBEITER.Name FROM MITARBEITER WHERE MITARBEITER.Ausbildung="Informatiker"; Vorname Name Hugo Maier Otto Kunze Karl Heinz Otto 2.2.1 Operatoren Für Vergleiche von Werten werden Operatoren benötigt. Folgende Vergleichsoperatoren sind zulässig: = Test auf Gleichheit NOT Ungleich > Grösser als ... LIKE Ähnlich < Kleiner als ... IS NULL Unbesetzt (leer) >= Grösser oder gleich IS NOT NULL Nicht unbesetzt (nicht leer) <= Kleiner oder gleich IN In einer Liste von Werten <> Ungleich enthalten SQL Abfragen und QBE Datum: 02.06.2006 11 / 29 FHNW⏐Hochschule für Wirtschaft Mit den logischen Operatoren AND (logisches UND), OR (logisches ODER) und NOT (Negation) können weitere Bedingungen konstruiert werden: Für die Verknüpfung der Schlüsselwörter AND, OR und NOT gelten folgende Regeln: ausdruck1 AND ausdruck2 = resultat ausdruck1 ausdruck2 resultat 03 0 0 X 0 0 0 X 0 X X X ausdruck1 OR ausdruck2 = resultat ausdruck1 ausdruck2 resultat 0 0 0 X 0 X 0 X X X X X NOT ausdruck = resultat ausdruck resultat 0 X X 0 In folgendem Beispiel werden diejenigen Mitarbeiter aufgelistet werden, die sowohl Informatiker sind als auch einen Stundensatz kleiner oder gleich 100 aufweisen. Beispiel 7 SELECT MITARBEITER.Vorname, MITARBEITER.Name FROM MITARBEITER WHERE MITARBEITER.Ausbildung="Informatiker" AND MITARBEITER.Stundensatz<=100; 3 0 X trifft nicht zu trifft zu ist nicht erfüllt ist erfüllt SQL Abfragen und QBE falsch wahr off on aus an Datum: 02.06.2006 12 / 29 FHNW⏐Hochschule für Wirtschaft Vorname Name Hugo Maier Otto Kunze Während in folgendem Beispiel diejenigen Mitarbeiter aufgelistet werden, die entweder Informatiker sind oder einen Stundensatz kleiner oder gleich 100 aufweisen. Beispiel 8 SELECT MITARBEITER.Vorname, MITARBEITER.Name FROM MITARBEITER WHERE MITARBEITER.Ausbildung="Informatiker" OR MITARBEITER.Stundensatz<=100; Vorname Name Hugo Maier Franz Schulz Wolfgang Müller Peter Neumann Heinz Moser Otto Kunze Emil Meyer Heinz Peters Karl Heinz Otto SQL Abfragen und QBE Datum: 02.06.2006 13 / 29 FHNW⏐Hochschule für Wirtschaft Es sind auch Kombinationen von AND, OR und NOT denkbar, wobei Folgendes gilt: AND bindet stärker als OR, d.h. Ausdrücke, die mit AND verknüpft sind, werden zuerst abgearbeitet. Dies kann durch Setzen von Klammern übersteuert werden, d.h. die Reihenfolge der Abarbeitung wird durch die Klammern bestimmt. Unter Beachtung dieser Punkte lassen sich umfangreiche Kombinationen schrittweise auf den Vergleich zweier Ausdrücke reduzieren. In folgendem Beispiel werden zunächst alle Projekte gewählt, die entweder "PersNr" 00100030 oder 00100070 zugeordnet sind. Dies sind die Projekte 4711 und 5000. Das Endresultat muss nun sowohl eines dieser Projekte sein, als auch ein Budget < 80'000 aufweisen. Dies ist nur für Projekt 5000 der Fall. Beispiel 9 SELECT PROJEKT.ProjNr, PROJEKT.PersNr, PROJEKT.Budget FROM PROJEKT WHERE (PROJEKT.PersNr="00100030" OR PROJEKT.PersNr="00100070") AND PROJEKT.Budget<80000; ProjNr PersNr 5000 Budget 00100070 60'000.00 SQL Abfragen und QBE Datum: 02.06.2006 14 / 29 FHNW⏐Hochschule für Wirtschaft 2.3 Datensätze sortieren Um die Lesbarkeit einer Ergebnistabelle zu verbessern, ist es häufig sinnvoll, die einzelnen Datensätze nach bestimmten Kriterien zu sortieren (aufsteigend, absteigend). In nachstehendem Beispiel werden alle Mitarbeiter nach "Ausbildung" und - innerhalb derselben Ausbildung - nach "Name" aufsteigend sortiert. Das Schlüsselwort ASC muss im SQL-Befehl nicht zwingend eingegeben werden, da als Standardwert ASC verwendet wird. Beispiel 10 SELECT MITARBEITER.Ausbildung, MITARBEITER.Name, MITARBEITER.Vorname FROM MITARBEITER ORDER BY MITARBEITER.Ausbildung, MITARBEITER.Name; Ausbildung Name Vorname DVK Schulz Franz Informatiker Kunze Otto Informatiker Maier Hugo Informatiker Otto Karl Heinz Programmierer Moser Heinz Programmierer Neumann Peter Systemplaner Meyer Emil Systemplaner Müller Wolfgang Systemplaner Peters Heinz In folgendem Beispiel werden die Datensätze nach "Geburtsdatum" absteigend sortiert. Beispiel 11 SELECT MITARBEITER.Name, MITARBEITER.Vorname, MITARBEITER.Geburtsdatum FROM MITARBEITER ORDER BY MITARBEITER.Geburtsdatum DESC; SQL Abfragen und QBE Datum: 02.06.2006 FHNW⏐Hochschule für Wirtschaft Name 15 / 29 Vorname Geburtsdatum Moser Heinz 01.01.1970 Meyer Emil 22.07.1965 Neumann Peter 13.09.1962 Maier Hugo 01.01.1960 Schulz Franz 05.03.1959 Kunze Otto 02.03.1955 Müller Wolfgang 22.05.1952 Peters Heinz 01.07.1950 Otto Karl Heinz 13.12.1949 SQL Abfragen und QBE Datum: 02.06.2006 16 / 29 FHNW⏐Hochschule für Wirtschaft 2.4 Datensätze gruppieren Mit Hilfe der Gruppierungsfunktion werden Datensätze, die in der angegebenen Attributliste dieselben Werte enthalten, zu einem einzelnen Datensatz zusammengefasst. Folgendes Beispiel gruppiert alle Mitarbeiter nach "Ausbildung", wobei Mehrfachnennungen des Attributs "Ausbildung" zu einem Datensatz zusammengefasst werden. SELECT MITARBEITER.Ausbildung FROM MITARBEITER GROUP BY MITARBEITER.Ausbildung; Ausbildung DVK Informatiker Programmierer Systemplaner Häufig werden Gruppierungen in Kombination mit Aggregatsfunktionen eingesetzt. Folgendes Beispiel gruppiert alle Mitarbeiter nach "Ausbildung" und gibt die Anzahl Mitarbeiter für jede Ausbildungsart an. Beispiel 12 SELECT MITARBEITER.Ausbildung, Count(MITARBEITER.PersNr) AS AnzahlvonPersNr FROM MITARBEITER GROUP BY MITARBEITER.Ausbildung; SQL Abfragen und QBE Datum: 02.06.2006 17 / 29 FHNW⏐Hochschule für Wirtschaft Ausbildung AnzahlvonPersNr DVK 1 Informatiker 3 Programmierer 2 Systemplaner 3 2.4.1 Bedingungen für Gruppierungen In Verbindung mit der Gruppierungsfunktion existiert die Möglichkeit zur Definition von Gruppenbedingungen. Im Gegensatz zur einfachen Abfrage mit Bedingungen ("WHERE"Befehl) werden die auf Gruppierungen angegebenen Bedingungen ("HAVING"-Befehl) nicht auf einzelne Datensätze, sondern auf Datensatzgruppen angewendet. In folgendem Beispiel wird der minimale, maximale und durchschnittliche Stundensatz für jede Ausbildungsart berechnet, wobei der durchschnittliche Stundensatz grösser oder gleich 80 sein soll. Beispiel 13 SELECT MITARBEITER.Ausbildung, MIN(MITARBEITER.Stundensatz) AS MinvonStundensatz, MAX(MITARBEITER.Stundensatz) AS MaxvonStundensatz, AVG(MITARBEITER.Stundensatz) AS MittelwertvonStundensatz FROM MITARBEITER GROUP BY MITARBEITER.Ausbildung HAVING AVG(MITARBEITER.Stundensatz)>=80; SQL Abfragen und QBE Datum: 02.06.2006 18 / 29 FHNW⏐Hochschule für Wirtschaft Ausbildung MinvonStundensatz MaxvonStundensatz MittelwertvonStundensatz DVK Informatiker Programmierer Systemplaner SQL Abfragen und QBE 80 80 80 100 110 103.33 80 85 82.5 100 100 100 Datum: 02.06.2006 19 / 29 FHNW⏐Hochschule für Wirtschaft 2.5 Unterabfragen Oft tritt der Fall auf, dass eine Abfrage auf dem Ergebnis einer oder mehrerer vorgängiger Abfragen aufbaut. Dies kann mit so genannten Unterabfragen bewerkstelligt werden. Dabei kann sich eine Unterabfrage auf andere aber auch dieselbe Tabelle wie die Abfrage selbst beziehen. Eine Abfrage mit Unterabfragen stellt eine hierarchische Struktur dar, wobei die einzelnen Abfragen "von unten nach oben" abgearbeitet werden. D.h. die auf der hierarchisch tiefsten Ebene stehende Abfrage wird zuerst abgearbeitet, diese gibt ein Resultat zurück, welches mit der nächsthöheren Abfrage verglichen wird etc. In der Ausgabe erscheinen nur die in der obersten Stufe festgelegten Attribute. Abfrage Vergleich Unterabfrage 1 Vergleich Unterabfrage 2 Vergleich Unterabfrage n Richtung der Abarbeitung Ausgabe des Endresultats Abfragen und Unterabfragen müssen Attribute aufweisen, deren Werte miteinander verglichen werden können, d.h. die Datentypen müssen zueinander kompatibel sein. Für den Vergleich von Abfragen und Unterabfragen können wiederum Vergleichsoperatoren verwendet werden: In folgendem Beispiel sollen alle Projekte des Mitarbeiters "Wolfgang Müller" ausgegeben werden, in denen er Projektleiter ist. Dabei wird anhand des Namens und des Vornamens die "PersNr" aus der Tabelle MITARBEITER geholt, welche dann mit der "PersNr" aus der Tabelle PROJEKT verglichen wird. SQL Abfragen und QBE Datum: 02.06.2006 FHNW⏐Hochschule für Wirtschaft 20 / 29 Beispiel 14 SELECT PROJEKT.ProjNr, PROJEKT.PersNr, PROJEKT.ProjName FROM PROJEKT WHERE PROJEKT.PersNr=4 (SELECT MITARBEITER.PersNr FROM MITARBEITER WHERE MITARBEITER.Name = "Müller" AND MITARBEITER.Vorname = "Wolfgang"); ProjNr PersNr 4711 ProjName 00100030 Kraftwerk Entenhausen In folgendem Beispiel werden "Name", "Vorname" und "Stundensatz" aller Mitarbeiter aufgelistet, deren Stundensatz unter dem Durchschnitt liegt. Beispiel 15 SELECT MITARBEITER.Vorname, MITARBEITER.Name, MITARBEITER.Stundensatz FROM MITARBEITER WHERE MITARBEITER.Stundensatz < (SELECT AVG(MITARBEITER.Stundensatz) FROM MITARBEITER); 4 Annahme: Es gibt nur einen Wolfgang Müller. SQL Abfragen und QBE Datum: 02.06.2006 FHNW⏐Hochschule für Wirtschaft Vorname Name 21 / 29 Stundensatz Franz Schulz 80.00 Peter Neumann 80.00 Heinz Moser 85.00 SQL Abfragen und QBE Datum: 02.06.2006 22 / 29 FHNW⏐Hochschule für Wirtschaft 2.6 Tabellen verknüpfen (Joining) Bisher konnten wir nur die Attribute einer einzigen Tabelle anzeigen. Meistens möchte man aber in einer Liste Attribute von verschiedenen Tabellen darstellen. Dies ist durch das Verknüpfen von Tabellen möglich. Folgende Abfrage verknüpft die Tabellen PROJEKT und MITARBEITER über das Attribut "PersNr". Als Resultat werden alle Projekte und deren Projektleiter ausgegeben. Beispiel 16 SELECT PROJEKT.ProjName, MITARBEITER.Name FROM MITARBEITER INNER JOIN PROJEKT ON MITARBEITER.PersNr = PROJEKT.PersNr ORDER BY PROJEKT.ProjName; ProjName Name Bestellsystem für Firma XYZ Kunze Info-System Anlagebau Meyer Kraftwerk Entenhausen Müller Dasselbe Resultat erhält man auch mit folgendem Befehl: Beispiel 17 SELECT PROJEKT.ProjName, MITARBEITER.Name FROM MITARBEITER, PROJEKT WHERE MITARBEITER.PersNr=PROJEKT.PersNr ORDER BY PROJEKT.ProjName; SQL Abfragen und QBE Datum: 02.06.2006 FHNW⏐Hochschule für Wirtschaft ProjName 23 / 29 Name Bestellsystem für Firma XYZ Kunze Info-System Anlagebau Meyer Kraftwerk Entenhausen Müller Folgendes Beispiel zeigt was passiert, wenn man keine Verknüpfung angibt. Die Datensätze der beteiligten Tabellen können dann in keinerlei Beziehung zueinander gebracht werden. Das System kombiniert nun alle Datensätze der einen Tabelle mit allen Datensätzen der anderen Tabelle. In diesem Fall Tabelle PROJEKT (3 Datensätze) mit Tabelle MITARBEITER (9 Datensätze), was als Resultat 27 Datensätze ergibt (3 x 9 = 27). Beispiel 18 SELECT PROJEKT.ProjName, MITARBEITER.Name FROM MITARBEITER, PROJEKT; ProjName Kraftwerk Entenhausen Name Maier Bestellsystem für Firma XYZ Maier Info-System Anlagebau Maier Kraftwerk Entenhausen Schulz Bestellsystem für Firma XYZ Schulz Info-System Anlagebau Schulz Kraftwerk Entenhausen Müller Bestellsystem für Firma XYZ Müller SQL Abfragen und QBE Datum: 02.06.2006 24 / 29 FHNW⏐Hochschule für Wirtschaft ProjName Name Info-System Anlagebau Müller Kraftwerk Entenhausen Neumann Bestellsystem für Firma XYZ Neumann Info-System Anlagebau Neumann Kraftwerk Entenhausen Moser Bestellsystem für Firma XYZ Moser Info-System Anlagebau Moser Kraftwerk Entenhausen Kunze Bestellsystem für Firma XYZ Kunze Info-System Anlagebau Kunze Kraftwerk Entenhausen Meyer Bestellsystem für Firma XYZ Meyer Info-System Anlagebau Meyer Kraftwerk Entenhausen Peters Bestellsystem für Firma XYZ Peters Info-System Anlagebau Peters Kraftwerk Entenhausen Otto Bestellsystem für Firma XYZ Otto Info-System Anlagebau Otto 2.6.1 Verknüpfungseigenschaften Bei der Verknüpfung von Tabellen muss man sich darüber im Klaren sein, welche Informationen man genau erhalten will. Dies kann durch die Festlegung von Verknüpfungseigenschaften genauer spezifiziert werden. Folgende drei Optionen stehen zur Verfügung. INNER JOIN Datensätze aus zwei Tabellen werden kombiniert, sobald Gleichheitsverknüpfung übereinstimmende Werte in einem Feld gefunden werden, das in beiden Tabellen vorhanden ist. LEFT JOIN Schliesst alle Datensätze aus der ersten (linken) Tabelle Linke Inklusionsverknüpfung von zwei Tabellen ein, auch wenn keine entsprechenden Werte für Datensätze in der zweiten (rechten) Tabelle vorhanden sind. RIGHT JOIN Schliesst alle Datensätze aus der zweiten (rechten) Rechte Tabelle von zwei Tabellen ein, auch wenn keine Inklusionsverknüpfung übereinstimmenden Werte für Datensätze in der ersten (linken) Tabelle vorhanden sind. In folgendem Beispiel werden alle Mitarbeiter ausgegeben und bei denjenigen, denen ein Projekt zugeordnet ist, noch die entsprechenden Projektangaben. SQL Abfragen und QBE Datum: 02.06.2006 25 / 29 FHNW⏐Hochschule für Wirtschaft Beispiel 19 SELECT MITARBEITER.PersNr, MITARBEITER.Name, MITARBEITER.Vorname, PROJEKT.ProjNr, PROJEKT.ProjName FROM MITARBEITER LEFT JOIN PROJEKT ON MITARBEITER.PersNr = PROJEKT.PersNr; PersNr Name Vorname ProjNr 00100010 Maier Hugo 00100020 Schulz Franz 00100030 Müller Wolfgang 4711 ProjName Kraftwerk Entenhausen 00100040 Neumann Peter 00100050 Moser Heinz 00100060 Kunze Otto 4712 Bestellsystem für Firma XYZ 00100070 Meyer Emil 5000 Info-System Anlagebau 00100080 Peters Heinz 00100090 Otto Karl Heinz SQL Abfragen und QBE Datum: 02.06.2006 26 / 29 FHNW⏐Hochschule für Wirtschaft 2.7 Kombinationen Entsprechend der Syntax des SQL-Abfragebefehls lassen sich alle bisher behandelten Befehlsmöglichkeiten kombinieren. In folgendem Beispiel werden alle geleisteten Stunden pro Mitarbeiter summiert und dort, wo die Summe > 10 ist, zusammen mit den Mitarbeiterdaten und dem Abteilungsnamen angezeigt, absteigend sortiert nach der Summe geleisteter Stunden (die höchste zuoberst). Beispiel 20 SELECT MITARBEITER.PersNr, MITARBEITER.Name, MITARBEITER.Vorname, SUM(PROJEKTSTUNDEN.Stunden) AS SummevonStunden, ABTEILUNG.AbtName FROM (ABTEILUNG INNER JOIN MITARBEITER ON ABTEILUNG.AbtNr = MITARBEITER.AbtNr) INNER JOIN PROJEKTSTUNDEN ON MITARBEITER.PersNr = PROJEKTSTUNDEN.PersNr GROUP BY MITARBEITER.PersNr, MITARBEITER.Name, MITARBEITER.Vorname, ABTEILUNG.AbtName HAVING SUM(PROJEKTSTUNDEN.Stunden)>10 ORDER BY SUM(PROJEKTSTUNDEN.Stunden) DESC; PersNr Name 00100030 Müller Vorname SummevonStunden Wolfgang AbtName 44 Systemplanung 00100040 Neumann Peter 16 Anwendungsentwicklung 00100020 Schulz Franz 16 Anwendungsentwicklung 00100010 Maier Hugo 16 Systemplanung SQL Abfragen und QBE Datum: 02.06.2006 27 / 29 FHNW⏐Hochschule für Wirtschaft 2.8 Parameterabfragen In den vorangehenden Beispielen, in denen Bedingungen vorkamen, mussten die Vergleichswerte als fixe Werte im Abfragebefehl eingegeben werden. Wollte man andere Vergleichswerte verwenden, so müsste jeweils eine separate Abfrage erstellt bzw. eine bestehende Abfrage angepasst werden. Dies ist umständlich und kann auch nicht allen Endbenutzern zugemutet werden. Als Lösung dafür bieten sich so genannte Parameterabfragen. Eine Parameterabfrage ist eine Abfrage, die bei der Ausführung ein Dialogfeld zur Eingabe von Werten anzeigt. Folgendes Beispiel liefert eine Stundenübersicht eines Projekts, wobei der Wert des Feldes "ProjNr" über den Parameter Projektnummer eingegeben werden kann. Der Abfrageparameter muss in eckigen Klammern stehen. Beispiel 21 SELECT PROJEKTSTUNDEN.ProjNr, PROJEKTSTUNDEN.Datum, PROJEKTSTUNDEN.PersNr, PROJEKTSTUNDEN.Aufgabe, SUM(PROJEKTSTUNDEN.Stunden) AS SummevonStunden FROM PROJEKTSTUNDEN GROUP BY PROJEKTSTUNDEN.ProjNr, PROJEKTSTUNDEN.Datum, PROJEKTSTUNDEN.PersNr, PROJEKTSTUNDEN.Aufgabe HAVING PROJEKTSTUNDEN.ProjNr=[Projektnummer] ORDER BY PROJEKTSTUNDEN.Datum, PROJEKTSTUNDEN.PersNr; ProjNr Aufgabe SummevonStunden 4711 12.01.1995 00100030 Abstimmung Datum PersNr 8 4711 13.01.1995 00100030 Abstimmung 10 4711 20.01.1995 00100010 Konzept 4711 21.01.1995 00100010 Konzept 8 4711 28.01.1995 00100030 Planung 10 4711 02.02.1995 00100030 Planung 10 4711 10.02.1995 00100020 Programmierung 8 4711 10.02.1995 00100040 Programmierung 8 SQL Abfragen und QBE 8 Datum: 02.06.2006 28 / 29 FHNW⏐Hochschule für Wirtschaft ProjNr Datum PersNr Aufgabe SummevonStunden 4711 11.02.1995 00100020 Programmierung 8 4711 11.02.1995 00100040 Programmierung 8 SQL Abfragen und QBE Datum: 02.06.2006 29 / 29 FHNW⏐Hochschule für Wirtschaft Anhang Tabellen mit Daten ABTEILUNG AbtNr A001 R001 S001 S002 S003 V001 AbtName Organisation Rechnerbetrieb Systemplanung Anwendungsentwicklung Benutzerservice Vertrieb Kostenstelle 04711 05000 03030 03020 03030 08010 MITARBEITER PersNr 00100010 00100020 00100030 00100040 00100050 00100060 00100070 00100080 00100090 AbtNr S001 S002 S001 S002 S002 R001 A001 S003 V001 Name Maier Schulz Müller Neumann Moser Kunze Meyer Peters Otto Vorname Hugo Franz Wolfgang Peter Heinz Otto Emil Heinz Karl Heinz Ausbildung Informatiker DVK Systemplaner Programmierer Programmierer Informatiker Systemplaner Systemplaner Informatiker Geburtsdatum 01.01.1960 05.03.1959 22.05.1952 13.09.1962 01.01.1970 02.03.1955 22.07.1965 01.07.1950 13.12.1949 Stundensatz 100.00 80.00 100.00 80.00 85.00 100.00 100.00 100.00 110.00 PROJEKT ProjNr 4711 4712 5000 ProjName Kraftwerk Entenhausen Bestellsystem für Firma XYZ Info-System Anlagebau PersNr 00100030 00100060 00100070 Budget 100'000.00 80'000.00 60'000.00 Starttermin 05.01.1995 01.03.1995 05.04.1995 Endtermin 01.12.1995 01.08.1995 01.08.1995 PROJEKTSTUNDEN Datum 20.01.1995 21.01.1995 10.02.1995 11.02.1995 12.01.1995 13.01.1995 28.01.1995 02.02.1995 05.03.1995 10.02.1995 11.02.1995 04.03.1995 ProjNr 4711 4711 4711 4711 4711 4711 4711 4711 4712 4711 4711 4712 SQL Abfragen und QBE PersNr 00100010 00100010 00100020 00100020 00100030 00100030 00100030 00100030 00100030 00100040 00100040 00100060 Aufgabe Konzept Konzept Programmierung Programmierung Abstimmung Abstimmung Planung Planung Abstimmung Programmierung Programmierung Planung Stunden 8.00 8.00 8.00 8.00 8.00 10.00 10.00 10.00 6.00 8.00 8.00 8.00 Datum: 02.06.2006