Übung 1: SQL in ACCESS Udo Matthias Munz Übung 1: SQL in ACCESS In ACCESS ist zunächst ein neue Abfrage einzurichten: Wählen Sie „Entwurfsansicht“ und klicken sie dann auf die zu verwendende Tabelle: Wählen Sie die gewünschte Tabelle aus und rufen Sie dann im Menü Abfrage den Punkt SQL-spezifisch – Union auf: Im Abfragefenster formulieren Sie den SQL-Abfrage Term. Lassen Sie die Abfrage ausführen. Um die Abfrage abzuändern klicken Sie mit der rechten Maustaste im Abfragefenster und wählen Sie SQL. Es erscheint wieder das Editierfenster in welchem Sie den Abfrageterm verändern können. 1 z:\_skripte\datenbanken\adam übungen ct12\übungen.doc 2 Tabellenzugriff Tabellenzugriff Daten auswählen: Verwendung von SELECT Wenn im Feldbezeichner Leerstellen vorkommen oder der Bezeichner ein reserviertes Wort darstellt, ist er in Hochkomma zu schreiben und die Tabelle zu benennen: SELECT BIOLIFE.DB.'Species Name' FROM BIOLIFE.DB oder SELECT Datenbank.'Species Name' FROM BIOLIFE.DB AS Datenbank SELECT NAME, a.'SIZE', WEIGHT, AREA, BMP FROM ANIMALS.DBF AS a Daten eintragen: Verwendung von INSERT Mit der folgenden Anweisung wird ein vollständiger Datensatz eingefügt. Beachten Sie, dass die Anzahl, Reihenfolge und Typ der Feldbezeichner in der Feld-Liste (<column_list>) genau mit den Werten in der Werte-Liste (<value_list>) übereinstimmen müssen. Sie müssen aber nicht sämtliche Felder angeben. Nicht extra angegebene Feldwerte werden entweder mit den Null-Werten oder den Vorgabewerten aufgefüllt. Manche Feldwerte können Sie gar nicht angeben; bei dieser Tabelle ist es das Feld ‚ID‘, welches als Schlüsselfeld definiert wurde und automatisch inkrementiert wird. INSERT INTO stamm (Name, Vorname, Geburtsdatum, Geburtsort, Strasse_HausNr, PLZ, Ort, Klasse) VALUES ("Unfug", "Purer", "11.11.11", "Blödelhausen", "Jodelgasse 11", "77777", "Stupeldorf", "TG11/1") Erproben Sie auch die SQL-Anweisungen DELETE und UPDATE. Die Struktur einer Tabelle ändern: ALTER TABLE Weitere Auswertungen einer Tabelle Mengen- bzw. Aggregationsfunktionen Die folgenden Mengen- oder auch „Aggregations-"Funktionen in der ANSI-StandardSQL stehen der lokalen SQL für den Abruf von Daten zur Verfügung: • SUM(), um alle numerischen Werte in einer Spalte zu summieren • AVG(), um den Durchschnitt aller von NULL verschiedenen numerischen Werte in einer Spalte zu berechnen • MIN() für die Bestimmung des kleinsten Wertes in einer Spalte • MAX() für die Bestimmung des größten Wertes in einer Spalte • COUNT(), um in einer Spalte die Anzahl der Werte zu zählen, die bestimmte Kriterien erfüllen String-Funktionen Die lokale SQL unterstützt folgende Stringmanipulationen zum Abrufen, Einfügen und Aktualisieren in der ANSI-Standard-SQL: • UPPER() für die Umwandlung eines Strings in Großbuchstaben • LOWER() für die Umwandlung eines Strings in Kleinbuchstaben • SUBSTRING() für die Rückgabe eines bestimmten Teils eines Strings • TRIM() für die Entfernung von Wiederholungen eines bestimmten Zeichens von rechts, links oder von beiden Seiten her 3 Tabellenzugriff Datumfunktionen Die lokale SQL unterstützt die Funktion EXTRACT() für die Isolierung eines einzelnen numerischen Feldes aus einem Datum/Zeit-Feld unter Verwendung folgender Syntax: EXTRACT (extract_field FROM field_name) Die folgende Anweisung zum Beispiel extrahiert YEAR aus einem DATE-Feld: SELECT EXTRACT(YEAR FROM HIRE_DATE) FROM EMPLOYEE Mit dieser Funktion lassen sich auch MONTH, DAY, HOUR, MINUTE und SECOND extrahieren. Achtung! Bei Abfragen für ein Datum müssen Sie das Datum in Gatter-Zeichen # einschließen: SELECT x FROM Stamm WHERE Geburtsdatum < #31/12/79# Operatoren Die lokale SQL unterstützt folgende Operatoren: Typ Operatoren arithmetische Operatoren Vergleichsoperatoren logische Operatoren String- Verkettungsoperator +, -, *, / <, >, =, <>, <=, >=, IS NULL AND, OR, NOT || , + Beispiele: Select max(note01) from stamm liefert schlechteste Note Select min(note01) from stamm liefert beste Note select avg(note02) from stamm liefert Durchschnittsnote Verwenden von Unterabfragen Zur Auswahl von Datensätzen aus einer Auswahl kann man die SELECTAnweisungen „schachteln“. liefert Namen und Noten derjenigen, die select name, note02 from stamm where note02 >= schlechter als der Durchschnitt sind (select avg(note02) from stamm) select * from stamm where note01 = (select min(note01) from stamm) liefert Name und beste Note 4 Übung 2 Übung 2 1. Erstellen einer leeren Datenbank Das Datenbankfenster enthält noch keine Objekte (Tabellen, Formulare, Abfragen, etc.). 2. Eine Tabelle erstellen Wählen Sie im Datenbankfenster das Objekt Tabellen und Erstellt eine Tabelle in Entwurfsansicht aus. Vergeben Sie die folgenden Feldnamen und den dazugehörigen Datentyp. Durch rechten Mausklick auf das Feld Adresslistenkennung können Sie dem Feld den Primärschlüssel zuordnen. 3. Daten erfassen und bearbeiten Sie können die Datenblattansicht öffnen durch Doppelklick auf Adresskartei im Objekt Tabellen im Datenbankfenster. Geben Sie folgende Datensätze ein. Bei großen Datenblättern kann die Eingabe übersichtlicher gestaltet werden, falls nur ein Datensatz angezeigt wird: Datensätze / Daten Eingeben 4. Datenblattfenster Sortieren und Filtern Zum Sortieren markieren Sie das Feld welches sortiert werden soll. Geben Sie folgende Anweisung: Datensätze/Sortieren/ Aufsteigend Um das Datenblatt nach Nach- und Vornamen zu sortieren, müssen Sie beide Spalten markieren. Access wendet das Sortierkriterium dann erst auf die linke Spalte 5 Übung 2 an, falls zwei Felder identisch sind, wird das Sortierkriterium nochmals auf die identischen Felder in der nächsten Spalte angewendet. Wenn sie alle Datensätze mit Nachname Müller aus dem Datenblatt herausfiltern möchten, gehen Sie wie folgt vor. Setzen sie den Cursor in das Feld Müller und wählen Sie die Anweisung Datensätze/Filter/Auswahlbasierteren Filter Um den Filter aufzuheben wählen Sie Datensätze/Filter/Sortierung entfernen 5. Layout von Datenblättern Unter dem Menü Format können Sie die Eigenschaften des Datenblattes einstellen. Die Formatierung wirkt sich auf die markierten Felder aus. Falls Sie Spalten vertauschen möchten, können Sie die betreffende Spalte markieren und dann bei gedrückter linker Maustaste an die gewünschte Position im Datenblatt verschieben. 6. Felddefinition und Eigenschaften Wechseln sie in die Entwurfsansicht Ansicht/Entwurfsansicht Es wird Ihnen eine grobe Auswahl von Felddatentypen angeboten. Im Register Allgemein/Feldgröße können Sie weitere Differenzierungen treffen. Beachten Sie bitte, möglichst wenig Platz beanspruchende Datentypen zu verwenden. Um Murphy zu zitieren: „Datenbanken werden immer größer als angenommen. Wird eine Datenbank nicht größer, dann nur, weil die Platte bereits voll ist.“. Die weiteren möglichen Einstellungen im Register Allgemein sind abhängig vom gewählten Felddatentyp. Der Gültigkeitsbereich der Felddatentypen und die weitern Formatierungsoptionen im Register Allgemein sind in der Accesshilfe erläutert. Übungen: 1. Formatieren Sie die Felder Ihrer Tabelle sinnvoll (s. Murphy). 2. Erstellen Sie Formulare und Abfragen zu Ihrer Tabelle ohne Zuhilfenahme des Assistenten. 3. Erstellen Sie die Tabellen für ein CD-Verleihsystem. 6 Übung 3 Übung 3 Ziel dieser Übung ist es das Verknüpfungen von Tabellen über Relationen zu üben. Aus Reduktionsgründen entsprechen diese Tabellen zunächst nicht der Normalform. 1:n Relation (Beziehung) Kunde (KuNr, Nachname, Vorname, Straße, PLZ, Ort) Auftrag(AuNr, KuNr, ArtNr, Bezeichnung, Stück) Ein Kunde kann mehrere Aufträge erteilen, jedoch ein Auftrag ist genau einem Kunden zugeordnet: 1:nRelation. 1. Entwurf der Kundentabelle Achten Sie darauf das Feld Nachname zu indizieren, damit eine Indexdatei erstellt wird (schnelles Suchen). 2. Entwurf der Auftragstabelle Achten Sie besonders auf die Formatierung des Feldes KuNr. 3. Relation in Access erstellen Wählen Sie das Menü Extras/Beziehungen Fügen Sie die Tabellen Kunde und Auftrag in das Beziehungen-Fenster ein. Bevor Sie nun die Beziehung definieren, müssen Sie darauf achten, dass die Tabellen geschlossen sind. Sonst Kuddelmuttel. Klicken Sie mit der Maus das Primärschlüsselfeld „KuNr“ der Tabelle „Kunde“ an und ziehen es bei gedrückter Maustaste zum gleichnamigen Feld der Tabelle „Auftrag“. Es erscheint folgendes Dialogfeld: Nebentatelle (Detailtabelle) Haupttabelle 7 Übung 3 4. Kontrollkästchen referentieller Integrität Hilft inkonsistente Datensätze zu vermeiden. Z.B. die Eingabe einer nicht vorhandenen Kundennummer in die Tabelle „Auftrag“ wird unterbunden. Des weiteren wird verhindert, dass z.B. ein Kundendatensatz in der Tabelle „Kunde“ gelöscht werden kann, solange noch ein Auftrag von ihm vorhanden ist. Im Todesfall eines Kunden führt dies allerdings zu Problemen. Der Auftrag kann nicht mehr ausgeführt werden und bei aktivierter referentieller Integrität könnte der Kunde nicht gelöscht werden. Durch Aktivierung des Kontrollkästchens „Löschweitergabe an verwandte Datensätze“ kann dieses Problem behoben werden. Wird nun der Datensatz des Kunden gelöscht werden automatisch alle Detaildatensätze mitgelöscht. Bei aktivierter referentieller Integrität weigert sich Access auch Änderungen in Beziehungsfeldern durchzuführen, um verwaiste Datensätze zu verhindern. Wollen Sie dennoch Beziehungsfelder ändern, so Aktivieren Sie das Kontrollkästchen „Aktualisierungsweitergabe an Detailfeld“. Die Änderung ist dann möglich und wird automatisch an alle Detailtabellen weitergereicht. 5. Verknüpfungstyp Bei Mausklick auf die Schaltfläche „Verknüpfungstyp“ im Dialogfenster „Beziehungen bearbeiten“ erscheint folgende Auswahlmöglichkeit: Die von Ihnen gewählte Verknüpfungseigenschaft hat keinen Einfluss auf die Relation der Tabellen. Für Abfragen (wird später besprochen) ist es allerdings wichtig welche Datensätze die Verknüpfungstabelle beinhaltet. Übungsaufgaben: Zur Vermeidung eines inkonsistenten Datenbestandes, bitte ich sie die folgenden Übungen eigenverantwortlich durchzuführen. 1. Geben Sie Daten in die Tabellen ein und überprüfen Sie die Auswirkungen der unterschiedliche Einstellungen unter referentieller Integrität. 2. Programmieren Sie die im Unterricht normalisierte Datenbank. 8 Übung 4 Übung 4 Leseratte: Überlegungen beim Entwurf eines Datenmodells Ergebnis der folgenden Überlegungen soll eine Verwaltung für eine private Büchersammlung sein. Bei Büchern ist es sicher sinnvoll, Daten wie Autor, Titel, Untertitel, Verlag und Sprache zu erfassen und vielleicht noch Felder für Kaufdatum, Erscheinungsjahr und Bemerkungen vorzusehen. Enthält die Sammlung vorwiegend Sachbücher. hilft eine Klassifizierung nach Sachgebieten, Belletristik könnte man nach Genre sortieren. Wer es bunt mag, spendiert noch ein Feld, das einen Scan des Einbands aufnimmt. Bei verliehenen Büchern sind der Entleiher, Verleih- und versprochenes Rück,gabedatum zu erfassen. Bei der Festlegung, wie die Tabellen der zu erstellenden Datenbank aufgebaut sein sollen, ist es oft hilfreich, einfach erst einmal die Hauptwörter aus einer solchen groben Beschreibung herauszuschreiben, zu gruppieren und sich zu überlegen. in welcher Beziehung sie stehen. Zwei Tabellen kristallisieren sich sofort heraus: 'Buch' und 'Entleiher'. Bei der Entscheidung, welche Attribute als Felder beispielsweise der Tabelle 'Buch' zu realisieren sind und für welche eine verknüpfte Tabelle zu spendieren ist, helfen Fragen wie: 'Hat dieses Attribut jedes Buch, die meisten oder nur wenige?', 'Kann es mehrfach bei einem Buch vorhanden sein?' und 'Ist es atomar, also durch eine Zahl, einen kurzen Text oder Ähnliches darstellbar, oder besteht es aus weiteren Unterattributen?' Jedes Buch hat einen Titel und eine Sprache, ist in einem bestimmten Jahr in einem Verlag erschienen und zu einem Zeitpunkt gekauft worden. Einige Bücher haben einen Untertitel, für einige liegt ein Umschlag-Scan vor, und zu einigen fällt mir sofort eine Bemerkung ein. Bücher haben einen oder mehrere Autoren und gehören zu einer oder mehreren Kategorien. Ein Verlag ist gekennzeichnet durch Name, Land und Ort, ein Autor durch Vor- und Nachname. Letzteres gilt auch für einen Entleiher, der außerdem eine Telefonnummer und eine E-Mail-Adresse hat. Eine Person kann sich zu unterschiedlichen Zeitpunkten mehrere Bücher leihen und für jedes ein anderes Rückgabedatum vereinbaren; ein Buch kann nur an eine Person verliehen sein. 9 Leseratte: Überlegungen beim Entwurf eines Datenmodells ER-Diagramm Die geschilderten Zusammenhänge kann man grafisch wie in der Abbildung auf dieser Seite darstellen. Die Rechtecke kennzeichnen dabei Objekte aus der realen Welt, die abgerundeten Kästen ihre Attribute. Rauten stehen für Beziehungen zwischen Objekten; an den Enden ihrer Verbindungslinien steht ihre sogenannte Kardinalität. die 1:n-, m:n- und 1:1-Beziehungen auseinander hält. Tabellen erstellen Aus einer solchen Grafik lässt sich unmittelbar die Tabellenstruktur der Datenbank ableiten: Rechtecke werden zu Tabellen, die dazugehörigen Attribute zu deren Feldern. Die Tabelle am Ende jeder 1:n-Beziehung bekommt ein weiteres Feld mit einem entsprechenden Fremdschlüssel. Zusätzliche Tabellen sind für m:n-Beziehungen vorzusehen, neben eventuellen Attributen besitzen sie ein Feld für jede an der Relation beteiligte Tabelle. Relationen mit Attributen Einen Sonderfall stellt in diesem Beispiel die 1:n-Relation 'hat geliehen’ dar, die man eigentlich ohne zusätzliche Tabelle realisieren könnte. Aber wo bringt man Entleih- und geplantes Rückgabedatum unter? Speichert man sie in der Buch-Tabelle, verschwendet man Speicherplatz. denn die müsste diese Felder für jedes Buch bereithalten, obwohl in der Regel nur wenige Bücher verliehen sind. Schlägt man sie andererseits der Entleiher-Tabelle zu, müsste man Name, Telefonnummer und E-Mail-Adresse des Empfängers jedes Mal neu ausfüllen, auch wenn sich ein und dieselbe Person mehrere Bücher leiht; außerdem gehen diese Informationen verloren, wenn man den entsprechenden Eintrag löscht, weil jemand ein Buch zurückgibt. Die beste Lösung ist hier wohl, eine Extra-Tabelle 'Leihe' zu spendieren, die die Felder 'Buch' und 'Entleiher’ als Fremdschlüssel sowie die beiden Datumsfelder enthält. Datentypen Die Datentypen der einzelnen Tabellenfelder ergeben sich meist intuitiv. Zu beachten ist, dass Frerndschlüsselfelder denselben Typ besitzen müssen wie das Primärschlüsselfeld, auf das sie verweisen. Ansonsten sollte man Zahlentypen nur dann verwenden, wenn man die Werte für Berechnungen verwenden oder Datensätze numerisch sortieren will - für deutsche Postleitzahlen ist beispielsweise ein fünf Zeichen fassendes Textfeld angebrachter, denn sonst erscheint Leipzig (04105) nur vierstellig. Bei der Dimensionierung von Textfeldem sollte man nicht zu 10 Leseratte: Überlegungen beim Entwurf eines Datenmodells sparsam sein, denn bei den meisten modernen Datenbankprogrammen belegen Datensätze auf der Festplatte nur die Anzahl von Zeichen, die tatsächlich benutzt sind. Lediglich ältere Datenbankformate wie dBase arbeiten mit festen Feldlängen und verbraten für ein Textfeld, das 100 Zeichen fassen darf, in jedem Datensatz 100 Bytes, auch wenn dort nur 'Der Herr der Ringe' steht. Auf dem Index: die Schlüsselfelder Für die Primärschlüssel der Tabellen kommen in diesem Beispiel eigentlich nur automatisch hochgezählte laufende Nummern in Frage, es gibt bei keinem der Objekte Attribute, die es eindeutig kennzeichnen. Man könnte auf die Idee kommen, zu jedem Buch seine ISBN zu speichern und als Primärschlüssel zu verwenden, das kann aber zu Problemen führen, wenn man mehrere Bände eines Werkes getrennt verwalten will oder wenn etwa ein Versandhauskatalog seinen Platz in der Bibliothek finden soll. Für Sekundärindizes sind selbstverständlich erst einmal alle Fremdschlüsselfelder vorzusehen, damit man beispielsweise schnell von einem Verlag zu den Büchern gelangt, die er herausgegeben hat. Welche weiteren Felder man indiziert, ist weitgehend Geschmackssache und hängt davon ab, wonach man häufig suchen und sortieren will. Folgendes ist dabei allerdings zu beachten: Man wird die Datenbank wohl selten benutzen, um beispielsweise herauszufinden, wie ein Autor namens Brecht mit Vornamen heißt, also für eine Suche nur in der Autoren-Tabelle. Allerdings ist eine Anfrage wie 'alle Bücher eines Autors, der mit Nachnamen Brecht heißt' durchaus sinnvoll. Daher sollte die Datenbank einen Sekundärindex über die Nachnamen der Autoren enthalten. Dasselbe gilt für die Namen von Verlagen und Entleihern. Datenbankanwendung fertigstellen Mit dem Entwurf des Datenmodells und dem Anlegen der Tabellen ist ein Großteil der Handarbeit auf dem Weg zu einer Datenbankanwendung erledigt. Was fehlt, sind Eingabeund Suchmasken, mit denen man den Datenbestand bequem pflegen und durchforschen kann, sowie Formulardefinitionen zum Drucken von Berichten. Die meisten modernen Datenbankprogramme bieten dafür aber recht brauchbare Vorlagen oder Assistenten an, die zumindest ein funktionierendes Grundgerüst erstellen. Der Rest ist Kosmetik. So kann man sich die Dateneingabe dadurch erleichtern, dass die Datenbank beim Anlegen eines neues Datensatzes bestimmte Felder mit sinnvollen Vorgaben belegt, etwa 'Heute' als Kaufdatum und 'Deutsch' als Sprache beim Eintragen eines neuen Buches. Wer zusätzlich Lust verspürt, sich in die Skriptoder Programmiersprache eines Datenbanksystems einzuarbeiten, eröffnet sich die Möglichkeit, weitere Funktionen um die eigentliche Datenbank herum zu programmieren, etwa das automatische Versenden von ErinnerungsMails an säumige Entleiher. (nach c’t Heft 18/2001) 11 Übung 5 Übung 5 1:n-Beziehung Eine 1:n-Relation haben wir bereits erstellt. n:m-Beziehung Problem: Eine n:m-Relation kann in Access nicht direkt abgebildet werden. Beispiel: 1 Lieferant liefert CD-Rohlinge und 1 Lieferant liefert mehrere Artikel 1:m Disketten. Mehrere Lieferanten liefern Disketten Mehrere Lieferanten liefern 1 n:1 Artikel. Daraus folgt: Mehrere Lieferanten liefern CD-Rohlinge Mehrere Lieferanten liefern n:m und Disketten mehrere Artikel: Lösung: Auflösung der n:m-Beziehung mittels einer dritten Tabelle in zwei 1:n-Beziehungen. Beispiel: Lieferant(Lief-Nr, Nachname, Vorname, Straße, PLZ, Ort) Lief-Art(Lief-Nr, Art-Nr) Artikel(Art-Nr, Bezeichnung, Preis) Aus der Tabelle Lief-Art geht eindeutig hervor, welcher Artikel ein Lieferant liefert, bzw. von welchem Lieferanten ein Artikel bezogen wird. Lieferant 1 n Lief-Art n 1 Artikel Hinweis: In der Tabelle Lief-Art sind zwei Primärschlüssel definiert. Sie können dies in Access realisieren, in dem Sie beide Zeilen markieren und anschließend auf das Schlüsselsymbol klicken. Übungsaufgabe: Erstellen Sie die Tabellen Lieferant, Lief-Art, Artikel und die zugehörigen Beziehungen. Lief-Nr und Art-Nr sind Primärschlüsselfelder vom Typ AutoWert. Das Feld Preis ist vom Typ Währung. PLZ vom Typ Zahl (Feldgröße Long Integer). Alle anderen Felder sind Textfelder (Standardlänge 50 Zeichen). Geben Sie folgende Testdatensätze ein: 12 Übung 6 Übung 6 Eine Transportkompanie der Schweizer Armee benötigt zur Abwicklung der Transportzentrale eine Datenbank. Früher wurde die Abwicklung in MS Excel gemacht. ER-Diagramm Ein Unteroffizier verwaltet die Standalone Datenbank. Die Fahraufträge kommen per Fax oder telefonisch. Angegeben wird bei der Bestellung die Route das Transportgut und die am Auftragsort zuständige Person. Der Unteroffizier wählt anhand des Transportguts und der Strecke das passende Fahrzeug aus. Er wählt einen Motorfahrer, der dieses Fahrzeug führen kann. Der Unteroffizier nimmt die Datenbank zu Hilfe. In der Datenbank sind alle Fahrer erfasst. Unterschieden werden sie anhand der eindeutigen Matrikel – Nummer. Des weiteren hat ein Fahrer noch einen Dienstgrad, Namen und Vornamen. Er hat die Fahrerlaubnis einer bestimmten Kategorie. In einer Tabelle Kategorie sind der Kategoriename und die Bezeichnung der dazugehörigen erlaubten Fahrzeuge gespeichert. Von einer Kategorie können mehrere Fahrer die Erlaubnis haben. 13 Übung 6 Die Fahrzeuge müssen auch erfasst werden. Jedes Fahrzeug hat eine eindeutige Nummer (Verkehrsschild) und eine Bezeichnung. Ein bestimmtes Fahrzeug gehört zu einem Typ. Ein Typ kann mehrere Fahrzeuge beinhalten. Der Typ beinhaltet die Bezeichnung, Höhe, Breite, das Leergewicht in Kilo, das Höchstgewicht in tbTransportgut tbeinsetzen tbKategorie tbfährt tbFahrzeug tbFahrauftrag tbFahrer tbFahrzeugtyp 14 Übung 6 Abfrage Nr. 1 Ausgabe von Fahrzeugnummer, -bezeichnung und Anzahl Einsätze (für dieses Transportgut) von den Fahrzeugen, die während der Dauer des Kurses Brot (Artikel 2) transportiert haben. SQL SELECT Count(einsetzen.Nummer) AS [Anzahl Einsätze], Fahrzeug.Nummer, Fahrzeug.Bezeichnung FROM Fahrzeug INNER JOIN (Fahrauftrag INNER JOIN einsetzen ON Fahrauftrag.Nummer = einsetzen.AuftrNr) ON Fahrzeug.Nummer = einsetzen.Nummer GROUP BY einsetzen.Nummer, Fahrzeug.Nummer, Fahrzeug.Bezeichnung, Fahrauftrag.Artikel HAVING Fahrauftrag.Artikel = 2; Ausgabe Abfrage 2 Ausgabe der Bezeichnung aller Fahrzeuge mit den Kategorien, in denen sie sind und den dazugehörigen Nutzlasten. SQL SELECT Fahrzeugtyp.Bezeichnung, Kategorie.Bezeichnung, Fahrzeugtyp.[Höchstgewicht (kg)] Fahrzeugtyp.[Leergewicht (kg)] AS Nutzlast FROM Fahrzeugtyp INNER JOIN Kategorie ON Fahrzeugtyp.Kategorie = Kategorie.Name; 15 Übung 6 Ausgabe Abfrage 3 Ausgabe von Fahrzeugnummer und –bezeichnung der Fahrzeuge, die im Fahrauftrag 2 eingesetzt werden. SQL SELECT * FROM Fahrzeug WHERE Nummer IN (SELECT Nummer FROM einsetzen WHERE AuftrNr=2); Ausgabe (Eine Aufgabe der Zürcher Hochschule Winterthur http://www2.active.ch/~gusti/projekte/transport/transport.htm) 16