1 Vorwort... 9. 2 Einleitung... 11. 3 Datenbankentwurf... 17. 4 Datenbankdefinition... 33. 5 Datensätze einfügen (INSERT INTO)...



Ähnliche Dokumente
Bibliografische Informationen digitalisiert durch

Aufbau des SELECT-Befehls. Im Folgenden werden zunächst Abfragen aus einer Tabelle vorgenommen.

Auf einen Blick. 1 Einleitung Datenbankentwurf Datenbankdefinition Datensätze einfügen (INSERT INTO)...

Informatik 12 Datenbanken SQL-Einführung

Marcus Throll, Oliver Bartosch. Einstieg in SQL. Verstehen, einsetzen, nachschlagen. Galileo Press

Datenbanken SQL Einführung Datenbank in MySQL einrichten mit PhpMyAdmin

SQL für Trolle. mag.e. Dienstag, Qt-Seminar

Marcus Throll, Oliver Bartosch. Einstieg in SQL. Verstehen, einsetzen, nachschlagen

Einführung in SQL. Sprachumfang: Indizes. Datensätzen. Zugriffsrechten

Details zu den Ausdrücken nach FROM, WHERE, GROUP BY und HAVING finden Sie in den Abschnitten über JOIN, WHERE und GROUP BY.

Datenbanken Kapitel 2

Access [basics] Gruppierungen in Abfragen. Beispieldatenbank. Abfragen gruppieren. Artikel pro Kategorie zählen

ISU 1. Ue_08/02_Datenbanken/SQL. 08 Datenbanken. Übung. SQL Einführung. Eckbert Jankowski.

SQL structured query language

SQL - Übungen Bearbeitung der Datenbank Personal (1)

DATENBANKEN SQL UND SQLITE VON MELANIE SCHLIEBENER

4. BEZIEHUNGEN ZWISCHEN TABELLEN

SQL Tutorial. SQL - Tutorial SS 06. Hubert Baumgartner. INSO - Industrial Software

Wie halte ich Ordnung auf meiner Festplatte?

Mengenvergleiche: Alle Konten außer das, mit dem größten Saldo.

Access 2000 und MS SQL Server im Teamwork

In diesem Thema lernen wir die Grundlagen der Datenbanken kennen und werden diese lernen einzusetzen. Access. Die Grundlagen der Datenbanken.

Datenbanken Microsoft Access 2010

Lineargleichungssysteme: Additions-/ Subtraktionsverfahren

Datenexport aus JS - Software

Views in SQL. 2 Anlegen und Verwenden von Views 2

Outlook. sysplus.ch outlook - mail-grundlagen Seite 1/8. Mail-Grundlagen. Posteingang

Auf einen Blick. Abfrage und Bearbeitung. Erstellen einer Datenbank. Komplexe Abfragen. Vorwort... 13

Stellen Sie bitte den Cursor in die Spalte B2 und rufen die Funktion Sverweis auf. Es öffnet sich folgendes Dialogfenster

Eine völlig andere Form Abfragen zu erstellen ist, sie mit Hilfe der Datenbankabfragesprache SQL zu gestalten.

Labor 3 - Datenbank mit MySQL

Vielen Dank an Dennis Riehle für die Bereitstellung dieser Folien

Berechnungen in Access Teil I

SQL SQL. SQL = Structured Query Language (SEQUEL) IBM San Jose Research Laboratory SYSTEM R. Grundlagen der Datenbanksysteme I

Datenübernahme von HKO 5.9 zur. Advolux Kanzleisoftware

Handbuch Fischertechnik-Einzelteiltabelle V3.7.3

2.5.2 Primärschlüssel

Erstellen der Barcode-Etiketten:

Inhaltsverzeichnis. Vorwort Kapitel 1 Einleitung... 15

Kapitel 4 Die Datenbank Kuchenbestellung Seite 1

Auf einen Blick. Abfrage und Bearbeitung. Erstellen einer Datenbank. Komplexe Abfragen. Vorwort 13

HANDBUCH PHOENIX II - DOKUMENTENVERWALTUNG

Handbuch ECDL 2003 Basic Modul 5: Datenbank Grundlagen von relationalen Datenbanken

Dipl. Inf. Dipl. Math. Y. Orkunoglu Datum:

mysql - Clients MySQL - Abfragen eine serverbasierenden Datenbank

teamsync Kurzanleitung

Access [basics] Rechnen in Berichten. Beispieldatenbank. Datensatzweise berechnen. Berechnung im Textfeld. Reporting in Berichten Rechnen in Berichten

Übersicht der wichtigsten MySQL-Befehle

Access Grundlagen für Anwender. Andrea Weikert 1. Ausgabe, 1. Aktualisierung, Juli inkl. zusätzlichem Übungsanhang ACC2010-UA

1 BEDIENUNGSANLEITUNG

Probeklausur im Modul Informationstechnik 1, WS 2003/04. Studiengang IWD 1. Semester Seite 1 von 5

Abfragen: Grundbausteine

Ablaufbeschreibung für das neu Aufsetzen von Firebird und Interbase Datenbanken mit der IBOConsole

Kapitel 33. Der xml-datentyp. In diesem Kapitel: Der xml-datentyp 996 Abfragen aus xml-datentypen 1001 XML-Indizierung 1017 Zusammenfassung 1023

Waimea Phone Monitor. Handbuch. Anzeige von eingehenden Anrufen auf Telefonanlagen mit TAPI-Interface

MMS - Update auf Version 4.4

Sructred Query Language

STRATO Mail Einrichtung Mozilla Thunderbird

Hinweise zur Installation von MySQL

Handbuch. NAFI Online-Spezial. Kunden- / Datenverwaltung. 1. Auflage. (Stand: )

Lieferschein Dorfstrasse 143 CH Kilchberg Telefon 01 / Telefax 01 / info@hp-engineering.com

MORE Profile. Pass- und Lizenzverwaltungssystem. Stand: MORE Projects GmbH

Datenbanken für Online Untersuchungen

SQL. strukturierte Datenbankabfragesprache eine Datenbanksprache zur. Structured Query Language:

Internationales Altkatholisches Laienforum

Erweiterung der Aufgabe. Die Notenberechnung soll nicht nur für einen Schüler, sondern für bis zu 35 Schüler gehen:

Windows. Workshop Internet-Explorer: Arbeiten mit Favoriten, Teil 1

Bedienungsanleitung Anlassteilnehmer (Vereinslisten)

Erstellen von x-y-diagrammen in OpenOffice.calc

Inhaltsverzeichnis. Vorwort 13. Kapitel 1 Einleitung 15

ACCESS das Datenbankprogramm. (Einführung) DI (FH) Levent Öztürk

Einführung in SQL. 1. Grundlagen SQL. Structured Query Language. Viele Dialekte. Unterteilung: i. DDL (Data Definition Language)

GITS Steckbriefe Tutorial

Serienbriefe schreiben mit Ratio - Adressen (Microsoft Word Versionen 8.0 und 9.0)

Stundenerfassung Version 1.8 Anleitung Arbeiten mit Replikaten

Auf der linken Seite wählen Sie nun den Punkt Personen bearbeiten.

Ein Ausflug zu ACCESS

SQL Teil 2. SELECT Projektion Selektion Vereinigung, Schnitt, Differenz Verbund Komplexer SELECT-Ausdruck

Massenversand Dorfstrasse 143 CH Kilchberg Telefon 01 / Telefax 01 / info@hp-engineering.com

Sie sollen eine Datenbank für Befragungen mittels Online-Fragebögen zu unterschiedlichen Themen erstellen:

AutoCAD Dienstprogramm zur Lizenzübertragung

Anwendungsentwicklung Datenbanken SQL. Stefan Goebel

SQL (Structured Query Language) Schemata Datentypen

Anleitung zur Erstellung von Serienbriefen (Word 2003) unter Berücksichtigung von Titeln (wie Dr., Dr. med. usw.)

Inventarverwaltung mit Access 2007/10

1. Adressen für den Serienversand (Briefe Katalogdruck Werbung/Anfrage ) auswählen. Die Auswahl kann gespeichert werden.

A. Ersetzung einer veralteten Govello-ID ( Absenderadresse )

Stammdatenanlage über den Einrichtungsassistenten

Handbuch ECDL 2003 Basic Modul 5: Datenbank Access starten und neue Datenbank anlegen

Dokumentation IBIS Monitor

Anleitung Postfachsystem Inhalt

Leseprobe: SQL mit MySQL - Band 4 Kompendium mit Online-Übungs-DB. Kompendium zur schnellen Kurzinformation der Datenbanksprache SQL/MySQL 5.

P&P Software - Adressexport an Outlook 05/29/16 14:44:26

Funktionsbeschreibung. Lieferantenbewertung. von IT Consulting Kauka GmbH

Abbildung 1: Das ERM. Nun zu den Tabellen: Zunächst wird aus jeder Entity eine Tabelle, d.h. wir erhalten:

2. Im Admin Bereich drücken Sie bitte auf den Button Mediathek unter der Rubrik Erweiterungen.

FuxMedia Programm im Netzwerk einrichten am Beispiel von Windows 7

Transkript:

Auf einen Blick 1 Vorwort... 9 2 Einleitung... 11 3 Datenbankentwurf... 17 4 Datenbankdefinition... 33 5 Datensätze einfügen (INSERT INTO)... 83 6 Daten abfragen (SELECT)... 87 7 Daten aus mehreren Tabelle abfragen (JOIN)... 129 8 Unterabfragen (Sub-Selects)... 141 9 Datensätze ändern (UPDATE)... 153 10 Datensätze löschen (DELETE FROM)... 159 11 Datensichten... 165 12 Transaktionen... 175 13 Routinen und Trigger... 185 14 Zeichensätze und Lokalisierung... 195 15 Benutzer, Privilegien und Sicherheit... 201 16 Lösungen zu den Aufgaben... 209 17 Beispieldatenbank... 231 18 SQL-Syntax gängiger Datenbanken... 239

Inhalt 1 Vorwort 9 2 Einleitung 11 2.1 Zielsetzung und Buchaufbau... 11 2.2 Das durchgehende Datenbankbeispiel... 11 2.3 Die SQL-Übungen... 13 2.4 Übungssoftware SQL-Teacher... 13 2.5 Notationen... 16 3 Datenbankentwurf 17 3.1 Was ist SQL?... 17 3.2 Phasen der Datenbankentwicklung... 19 3.2.1 Datenmodell... 20 3.2.2 ER-Modell... 21 3.2.3 Relationales Datenmodell... 23 3.2.4 Primärschlüssel... 24 3.2.5 Fremdschlüssel und referenzielle Integrität... 24 3.2.6 Optimierung des Datenmodells (Normalisierung)... 26 4 Datenbankdefinition 33 4.1 Einführung... 33 4.2 Tabellen und Datentypen... 35 4.2.1 Text... 37 4.2.2 Zahlen... 39 4.2.3 Zeiten... 41 4.2.4 Bits... 43 4.2.5 Logische Werte... 44 4.3 Tabellen anlegen (CREATE TABLE)... 44 4.4 Integritätsregeln... 45 4.4.1 Primärschlüssel (PRIMARY KEY)... 46 4.4.2 Fremdschlüssel (FOREIGN KEY)... 49 4.4.3 Doppelte Werte verhindern (UNIQUE)... 55 Inhalt 5

4.4.4 Nur bestimmte Werte zulassen (CHECK)... 56 4.4.5 Standardwerte (DEFAULT)... 61 4.5 Domänen... 63 4.5.1 Domänen erstellen (CREATE DOMAIN)... 63 4.5.2 Domänendefinition ändern (ALTER DOMAIN)... 68 4.5.3 Domänendefinition löschen (DROP DOMAIN)... 70 4.6 Tabellendefinitionen verändern (ALTER TABLE)... 72 4.7 Tabellen löschen (DROP TABLE)... 76 4.8 Indices... 78 4.8.1 Was sind Indices?... 78 4.8.2 Index bei der Tabellenanlage definieren... 79 4.8.3 Index nach Tabellendefinition definieren (CREATE INDEX)... 80 4.8.4 Wann sollte ein Index angelegt werden?... 81 4.8.5 Index löschen (DROP INDEX)... 82 5 Datensätze einfügen (INSERT INTO) 83 6 Daten abfragen (SELECT) 87 6.1 Aufbau des SELECT-Befehls... 89 6.1.1 Alle Spalten einer Tabelle ausgeben... 90 6.1.2 Spalten auswählen... 91 6.2 SELECT mit Bedingung (WHERE)... 93 6.2.1 Vergleichsoperatoren... 97 6.3 Ausgabe sortieren (ORDER BY)... 99 6.4 SELECT mit Gruppenbildung (GROUP BY)... 104 6.5 Mengenoperationen (UNION, INTERSECT, EXCEPT/MINUS)... 108 6.6 Funktionen für SELECT-Befehle... 113 6.6.1 Aggregatfunktionen... 113 6.6.2 Mathematische Funktionen... 118 6.6.3 Datumsfunktionen... 122 6.6.4 Typumwandlung... 124 6.6.5 Zeichenkettenfunktionen... 124 6.7 NULL-Werte in Abfragen... 127 7 Daten aus mehreren Tabelle abfragen (JOIN) 129 7.1 Relationenalgebra... 132 7.2 Der innere Verbund (INNER JOIN)... 132 7.2.1 Varianten des INNER JOIN... 135 7.3 Der äußere Verbund (LEFT JOIN/RIGHT JOIN)... 138 6 Inhalt

8 Unterabfragen (Sub-Selects) 141 8.1 Unterabfragen, die eine Zeile zurückgeben... 143 8.2 Unterabfragen, die mehr als eine Zeile zurückgeben... 146 8.3 Regeln für die Verwendung von Unterabfragen... 151 9 Datensätze ändern (UPDATE) 153 9.1 Unterabfragen in UPDATE-Befehlen... 156 10 Datensätze löschen (DELETE FROM) 159 10.1 Unterabfragen in DELETE-Befehlen... 162 11 Datensichten 165 11.1 Datensicht erstellen (CREATE VIEW)... 165 11.2 Verhalten von Datensichten beim Aktualisieren... 168 11.3 Aktualisieren mit Prüfoption... 171 11.4 Views ändern und löschen (DROP VIEW)... 172 12 Transaktionen 175 12.1 Eigenschaften von Transaktionen... 176 12.1.1 Transaktionen mit SQL definieren... 179 12.2 Isolationsebenen bei Transaktionen... 182 13 Routinen und Trigger 185 13.1 Funktionen und Prozeduren... 185 13.1.1 Prozeduren und Funktionen löschen... 189 13.2 Trigger (CREATE TRIGGER)... 189 14 Zeichensätze und Lokalisierung 195 Inhalt 7

15 Benutzer, Privilegien und Sicherheit 201 15.1 Überblick... 201 15.2 Benutzer und Rollen... 202 15.3 Benutzerprivilegien einrichten (GRANT)... 203 15.4 Benutzerrechte und Views... 206 15.5 Benutzerprivilegien löschen (REVOKE)... 206 16 Lösungen zu den Aufgaben 209 17 Beispieldatenbank 231 18 SQL-Syntax gängiger Datenbanken 239 18.1 Die ausgewählten Datenbanken... 239 18.2 Datentypen... 239 18.3 Tabellen anlegen, ändern, löschen... 242 18.4 Domänen anlegen, ändern, löschen... 248 18.5 Indices anlegen, ändern, löschen... 249 18.6 Datensätze einfügen, ändern, löschen... 251 18.7 Daten abfragen (SELECT)... 253 18.8 Datensichten (VIEWS)... 258 18.9 Transaktionen... 259 18.10 Prozeduren/Funktionen/Trigger... 260 18.11 Benutzer, Privilegien, Sicherheit... 264 Index 267 8 Inhalt

1 www.galileocomputing.de - Einstieg in SQL - Leseprobe 1 Vorwort Datenbanken bilden die Grundlage nahezu aller Informationssysteme. Und wer Datenbank sagt, muss SQL sprechen. Dieses Buch unterstützt Sie dabei, den Sprachumfang von SQL zu verstehen, und vermittelt Ihnen das»sprachgefühl«, mit dem Sie das Instrumentarium SQL richtig nutzen können. Wenn man alle Datenbanken gleichzeitig abschaltete, würde auch automatisch ein Großteil des wirtschaftlichen Lebens zusammenbrechen. Inzwischen hängen die meisten Wirtschaftsprozesse direkt oder indirekt mit der Speicherung von Informationen in Datenbanken zusammen. Ohne Datenbanken kann man heute praktisch kein Geld vom Geldautomaten abheben, keine Reise buchen und kein Buch bei der Bücherei ausleihen. Offensichtlich wird die Abhängigkeit von Datenbanken im E-Commerce. ebay, Amazon oder Otto-Online funktionieren ohne Datenbanken, in denen praktisch die gesamte Datenhaltung von der Produktinformation bis zur Bestellabwicklung gespeichert wird. Weitaus am häufigsten sind dabei relationale Datenbanken vertreten, deren Grundprinzip es ist, die Daten in Tabellen mit einzelnen Datensätzen und Feldern zu speichern. Die verbreitesten Produkte wie Oracle, DB2 von IBM, der SQL Server von Microsoft und MySQL gehören in diese Kategorie der relationalen Datenbanken. Relationale Datenbanken existieren bereits seit über 20 Jahren. Sie gehören damit zu den Technologien in der Informationstechnologie, die sich dauerhaft durchgesetzt haben. Und alle diese relationalen Datenbanken verwenden mit der Structured Query Language (SQL) eine in großen Teilen standardisierte Sprache zur Speicherung, Abfrage und Veränderung der Informationen, die in der Datenbank gespeichert sind. Wer also SQL beherrscht, ist auch in der Lage, diese heute so wichtige Datenverwaltung zu beherrschen. 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 Wer SQL erlernen möchte, hat die Aufgabe vor sich, den Sprachumfang von SQL zu verstehen und anwenden zu können. Im Vergleich zu anderen Programmiersprachen wie Basic, Pascal oder C hat aber SQL einen Vorwort 9

geringeren Sprachumfang. Die Hürde, SQL zu beherrschen, ist also geringer als bei Programmiersprachen. Aber wie in anderen Lebensbereichen auch, macht bei SQL auch nur die Übung den Meister. Dieses Buch soll Ihnen eine Hilfestellung sein, SQL zu verstehen, zu üben und anzuwenden. Aus diesem Grund folgen die einzelnen Kapitel folgendem Aufbau: Erläuterung des SQL-Befehls: Im ersten Schritt erfolgt die Erläuterung des SQL-Befehls. Einführendes Beispiel: In einem Einführungsbeispiel können Sie den SQL-Befehl anhand seines praktischen Einsatzes kennenlernen. Syntax des SQL-Befehls: Nachfolgend wird die Syntax des Befehls genauer erläutert. Weiterführende Beispiele: Ein oder mehrere weiterführende Beispiele sollen Ihnen den Umgang mit dem SQL-Befehl weiter erläutern und vertiefen. Übungen: Anhand von Übungsbeispielen können Sie eigenständig die Befehle üben. Damit Sie SQL auch praktisch üben können, liegt diesem Buch eine Übungssoftware bei, die einfach zu installieren ist. Diese Übungssoftware enthält eine komplette SQL-Engine, mit der Sie alle Befehle nachvollziehen, wiederholen und üben können. Bei der SQL-Engine handelt es sich um die Embedded Version von FireBird 1.5. FireBird ist der Open Source-Ableger von Borland InterBase und bietet dadurch zwei Vorteile: Alle Befehle orientieren sich sehr nahe am SQL- Standard, und die Datenbank ist sehr bewährt. 10 Vorwort

1 www.galileocomputing.de - Einstieg in SQL - Leseprobe 2 Einleitung In diesem Kapitel erhalten Sie einen Überblick über die Inhalte dieses Buches. Dabei wird auch das durchgehende Datenbankbeispiel und die eigens für das Buch entwickelte Übungssoftware SQL-Teacher vorgestellt. 2.1 Zielsetzung und Buchaufbau Dieses Buch ist für Leser gedacht, die den Befehlsumfang von SQL erlernen und üben wollen. Das Buch richtet sich sowohl an Anfänger als auch an Leser mit SQL-Erfahrung. Für den Anfänger sind alle Befehle mit einem einfachen Einführungsbeispiel erläutert, um möglichst schnell den jeweiligen Befehl zu verstehen. Für Leser mit SQL-Erfahrung werden die Inhalte durch weiterführende Beispiele vertieft. Die SQL-Befehle sind in der Reihenfolge Ihrer der Besprechung am Ablauf der Arbeit mit einer Datenbank orientiert. Im ersten Schritt werden die Datenbankgrundlagen erläutert, damit Sie verstehen, wie Datenbanken entworfen und Daten in der Datenbank gespeichert werden. Anschließend lernen Sie die Befehle kennen, um Daten zu speichern oder zu verändern. Die folgenden Kapitel bringen Ihnen die umfangreichen Möglichkeiten nahe, Daten aus der Datenbank zu selektieren. Hier werden vom einfachen Selektionsbefehl bis zu komplexen Join-Abfragen und Unterabfragen alle notwendigen Befehle erklärt und anhand von Beispielen gezeigt. Anschließend folgen die fortgeschrittenen Datenbanktechniken wie Transaktionen, Prozeduren und Trigger. Um Ihnen einen möglichst nahen Praxisbezug zu liefern, haben wir im Anhang einen Syntaxvergleich zwischen den Datenbanken Inter- Base/FireBird, DB2, MySQL, MS Access, MaxDB, Oracle und SQL Server aufgelistet. Sie können so sehr schnell die Inhalte dieses Buches auf entsprechende Datenbanksysteme übertragen. 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 2.2 Das durchgehende Datenbankbeispiel Um Ihnen den Inhalt dieses Buches möglichst gut zu vermitteln, sind nahezu alle Beispiele und Übungen an einem durchgängigen Datenbankbeispiel erläutert. So können Sie die verschiedenen Befehle und Beispiele leichter nachvollziehen, weil sich diese immer wieder auf die Zielsetzung und Buchaufbau 11

gleiche Datenstruktur beziehen. Die Datenbank unseres Buchbeispiels bildet ein Vertriebsunternehmen für Hard- und Software nach. Das Datenmodell sieht dabei wie in Abbildung 2.1 aus. Abbildung 2.1 Datenmodell der Beispieldatenbank Im Überblick verfügt die Beispieldatenbank über folgende Strukturen: In der Tabelle mitarbeiter werden alle relevanten Daten wie Name, Adresse und Kontaktdaten zu den Mitarbeitern gespeichert. Jeder Mitarbeiter gehört einer Abteilung an. Diese Abteilungen geben mit Vertrieb, Support, Rechnungswesen, Einkauf und Verwaltung typische Strukturen eines Unternehmens wieder und sind in der Tabelle abteilung gespeichert. Unser Beispielunternehmen vertreibt Hard- und Software. Diese Artikel werden in der Tabelle artikel gespeichert. Jeder Artikel gehört einer Kategorie an (z.b. Monitor, Scanner etc.). Diese verschiedenen Kategorien werden in der Tabelle kategorie gespeichert. Der Vertrieb erfolgt direkt an Kunden, deren Daten in der Tabelle kunde verwaltet werden. Sobald ein Kunde Artikel bestellt, wird eine entsprechende Bestellung erzeugt. Bestellungen werden einzeln mit Bestelldatum und Bestellnummer in der Tabelle bestellung gespeichert. Jede Bestellung besteht aus einzelnen Bestellungsposten (Tabelle posten), die sich aus Artikeln zusammensetzen (Tabelle artikel). 12 Einleitung

1 www.galileocomputing.de - Einstieg in SQL - Leseprobe 2.3 Die SQL-Übungen Am Ende eines Kapitels finden Sie Übungsbeispiele. Hier können Sie den Inhalt des jeweiligen Kapitels noch einmal anhand von Fragestellungen wiederholen und insbesondere überprüfen, ob Sie die Befehle auch eigenständig nachvollziehen können. Die Übungen sind so aufgebaut, dass Sie diese mit den Informationen des Kapitels lösen können. Die Lösungen zu den Aufgaben finden Sie in Kapitel 16. 2.4 Übungssoftware SQL-Teacher Speziell für dieses Buch stellen wir Ihnen mit SQL-Teacher eine Übungssoftware zur Verfügung. Sie können mit dieser Übungssoftware nahezu alle Beispiele und Übungen dieses Buches nachvollziehen. In die Übungssoftware ist eine komplette SQL-Datenbank integriert. Sie haben also so die Möglichkeit, SQL kennen zu lernen, ohne sonst ein Datenbanksystem installiert zu haben. Wenn Sie im Buch am Rand den Hinweis SQL-Teacher sehen, handelt es sich um Schritt-für-Schritt-Beispiele, die Sie mit der Übungssoftware nachvollziehen können. Systemvoraussetzung ist ein Windows-Betriebssystem. Zum Installieren führen Sie bitte das Installationsprogramm aus (sqlteacher_setup.exe). 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 Abbildung 2.2 Die Buchsoftware Die SQL-Übungen 13

Die Übungssoftware hat zwei Tab-Reiter im Hauptfenster. Unter Datenbank haben Sie die Möglichkeit, SQL-Befehle einzugeben und auszuprobieren. Sie geben den gewünschten Befehl in das Eingabefenster unter Datenbank ein und führen den Befehl mit STRG+R oder dem entsprechenden Menübutton aus. Im unteren Fenster der rechten Programmseite werden die Ergebnisse des ausgeführten Befehls angezeigt, soweit der Befehl Informationen zurückgibt (z.b. Selektionsbefehle). Über den Button DDL (für Data Definition Language) können Sie sich die Definition der einzelnen Datenbankobjekte (z.b. Tabellen) ansehen. Auf der linken Seite sehen Sie die Datenbankstruktur. Die Beispieldatenbank ist bereits in die Übungssoftware integriert, so dass Sie nahezu alle Beispiele gleich ausprobieren können, ohne Tabellen anlegen und Daten speichern zu müssen. Um Ihnen die Eingabe von SQL-Befehlen zu erleichtern steht ein Abfrage-Assistent zur Verfügung. Sie finden diesen unter dem Tab-Reiter Abfrage-Assistent. Sie ziehen die gewünschten Tabellen mit gedrückter linker Maustaste aus dem linken Menübaum in das Fenster. Sie können anschließend den Selektionsbefehl einfach zusammenbauen. Felder wählen Sie durch Anklicken der Checkbox links neben dem Feldnamen aus. Im unteren Teil des Fensters können Selektionsbedingungen (WHERE), Gruppierungen (GROUP BY) und Sortierungen (ORDER BY) vorgenommen werden. Verknüpfungen zwischen Tabellen erreichen Sie durch Verbinden der Zielfelder mit gedrückter linker Maustaste. Um einen SQL-Befehl auszuführen, klicken Sie auf den Button SQL einfügen. Der Befehl wird dann in das Abfragefenster übernommen. Unter SQL-Erklärungen finden Sie die wichtigsten Befehle und Inhalte des Buches in Kurzform. Sie können also dort schnell nachschlagen, falls Ihnen ein Befehl entfallen ist. Sie können auch Befehle direkt über die Zwischenablage kopieren, dann in den Tab-Reiter Datenbank wechseln, den Befehl dort einfügen und dann ausführen. Die Übungssoftware basiert auf auf dem Embedded FireBird SQL-Server. FireBird ist der Open-Source-Ableger von Borlands InterBase. Fire- Bird gehört zu den Datenbanken, deren SQL-Befehlsumfang nahe am ANSI-SQL-Standard angelehnt ist. Sie haben dadurch mehrere Vorteile: Die Software ist leicht zu installieren. Die aufwändige Installation eines kompletten Datenbankservers entfällt. Die Befehle und Übungen können an einem ausgereiften und marktgängigen Datenbanksystem erlernt und geübt werden. 14 Einleitung

1 www.galileocomputing.de - Einstieg in SQL - Leseprobe Alle erlernten Inhalte lassen sich leicht auf andere Datenbankserver übertragen. 2 3 4 5 6 7 8 9 10 Abbildung 2.3 Abfrage-Assistent Wenn Sie weitere Informationen zu FireBird suchen, können Sie unter www.firebirdsql.org oder www.ibphoenix.com entsprechende Informationen abrufen. Alle Daten der Beispieldatenbank werden in der Datei teacher.gdb im Unterverzeichnis /data des Installationsverzeichnisses gespeichert. Im gleichen Verzeichnis finden Sie eine Kopie der Datenbank mit dem Namen teacher_org.gdb. Falls Sie den ursprünglichen, von uns eingerichteten Datenbestand der Übungsdatenbank wieder herstellen wollen, gehen Sie wie folgt vor: Schließen Sie den SQL-Teacher. Wechseln Sie in das Datenverzeichnis der Übungssoftware (in der Regel c:\programm\sqlteacher\data). Löschen Sie die Datei teacher.gdb. Kopieren Sie die Datei teacher_org.gdb und benennen Sie die Kopie in teacher.gdb um. Starten Sie den SQL-Teacher wieder. Sie haben jetzt den Ausgangsdatenbestand, den wir mitgeliefert haben. 11 12 13 14 15 16 17 18 Übungssoftware SQL-Teacher 15

2.5 Notationen Im Folgenden sind die in diesem Buch verwendeten Notationen aufgelistet. tabellenname Bezeichnet eine Tabelle mit variablen Namen. spaltenname Bezeichnet einen Spaltennamen mit variablen Namen. Wenn mehrere Spaltennamen in der Syntax benötigt werden, werden diese mit einem Index versehen, z.b. spaltenname1, spaltenname2 usw. Es handelt sich dann um mehrere verschiedene Spaltennamen. spaltenliste Bezeichnet einen oder mehrere variable Spaltennamen in der Form spaltenname1, spaltenname2, spaltenname3 usw. Während spaltenname nur einen bestimmten Spaltennamen benennt, werden mit spaltenliste in der Regel mehrere aneinander gereihte Spalten, die mit Komma getrennt werden, bezeichnet. [...] Bezeichnet optionale Befehlsbestandteile. {...... } Bezeichnet alternative Befehlsbestandteile. SQL kennt als Abschluss eines Befehls das Semikolon. 16 Einleitung

1 www.galileocomputing.de - Einstieg in SQL - Leseprobe SELECT name, vorname, strasse, plz, ort FROM kunde k; SELECT DISTINCT plz FROM kunde; Aliase können nicht nur auf Tabellen, sondern für Spaltennamen verwendet werden. Dies ist praktisch, wenn Sie bei der Ausgabe das Feld umbenennen wollen. Dies wird vor allem dann der Fall sein, wenn Sie Felder bei der Ausgabe durch Funktionen erzeugen. Solche Funktionen werden in Abschnitt 6.6 besprochen. Das folgende Beispiel benennt die Spalte name bei der Ausgabe in Nachname um. SELECT name AS Nachname FROM kunde; Sie können durch die Angabe von DISTINCT identische Zeilen in der Ausgabe zusammenfassen. Zwei Zeilen sind dann identisch, wenn sie in allen Spalten denselben Wert besitzen. Das folgende Beispiel fasst alle gleichen Postleitzahlen aus der Tabelle kunde zusammen: Übungen Fragen Sie aus der Tabelle kunde die Kundennummer (kundennr) und die Zahlungsart (zahlungsart) ab. Listen Sie aus der Tabelle artikel die Bezeichnungen und den Preis aus. Suchen Sie aus der Tabelle mitarbeiter die Namen und die jeweilige Abteilungsnummer heraus. Lassen Sie sich die Namen der Hersteller aus der gleichnamigen Tabelle ausgeben. 6.2 SELECT mit Bedingung (WHERE) Sie werden auch nicht immer alle Datensätze einer Tabelle benötigen. Im Einführungsbeispiel wurden zuerst die Namen und Vornamen aller Kunden angezeigt. Dann haben Sie die Suche auf die Kunden aus Bonn eingeschränkt. Der Befehl bestand zuerst nur aus zwei Zeilen, dem Sie eine weitere hinzugefügt haben. SELECT name, vorname FROM kunde WHERE ort = 'Bonn'; Aliase auf Spaltennamen DISTINCT Übung 6.1 Übung 6.2 Übung 6.3 Übung 6.4 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 SELECT mit Bedingung (WHERE) 93

SQL-Syntax Die Einschränkungen werden an dritter Stelle aufgelistet. SELECT spaltenliste FROM tabellenname WHERE auswahlbedingungen; Das WHERE ist immer das nächste Element nach FROM. Verschiedene Anforderungen können durch AND beziehungsweise OR verknüpft werden. AND (und) sorgt dafür, dass alle so miteinander verknüpften Anweisungen zutreffen müssen. OR (oder) achtet darauf, dass eine der Bedingungen zutrifft. Eine Bedingung kann mit NOT verneint werden, also wird darauf geachtet, dass sie nicht zutrifft, damit die betreffenden Daten ausgegeben werden. Sie können in der Bedingung auf exakte Übereinstimmung oder auf Mindest- beziehungsweise Höchstwerte prüfen. Dabei verwenden Sie die Vergleichsoperatoren (=, >, < und ihre Kombinationen) oder Funktionen, die in den Abschnitten 6.2.1 und 6.6 noch genauer vorgestellt werden. Sie können natürlich auch die Vergleichsoperatoren mit Funktionen kombinieren. Weiterführendes Beispiel Nach weiteren Überlegungen möchte man auch die Kunden in Hamburg erreichen. Die WHERE-Bedingung muss dafür angepasst werden. Um Kunden sowohl aus Hamburg als auch aus Bonn anzuzeigen, werden beide Werte mit OR verknüpft. SELECT name, vorname, strasse, plz, ort FROM kunde WHERE ort = 'Hamburg' OR ort = 'Bonn'; SQL-Teacher Vollziehen Sie das Beispiel in der beiliegenden Datenbank nach. Geben Sie den SELECT-Befehl ein, und führen Sie ihn aus. In der Ausgabe werden die gesuchten Daten aller Kunden, die in Hamburg oder Bonn wohnen, ausgegeben. Da die Firma demnächst 25 Jahre besteht, will die Geschäftsleitung wissen, ob es Kunden gibt, die genauso wie der Firmengründer heißen, um ihnen werbewirksam einen Geschenkgutschein zu übersenden. In diesem Fall werden die Bedingungen nach WHERE mit AND verknüpft, weil sie beide gleichzeitig zutreffen müssen. SELECT name, vorname, strasse, plz, ort FROM kunde WHERE name = 'Kaufmann' AND vorname = 'Andreas'; 94 Daten abfragen (SELECT)

1 www.galileocomputing.de - Einstieg in SQL - Leseprobe 2 3 4 5 6 7 8 9 Abbildung 6.6 Die benötigten Kundendaten bei einer Ausdehnung der Werbeaktion von Bonn auf Hamburg Vollziehen Sie das Beispiel in der beiliegenden Datenbank nach. Geben Sie den SELECT-Befehl ein, und führen Sie ihn aus. Ihnen werden die Kunden aufgelistet, bei denen die Bedingung zutrifft. Sie heißen mit Vornamen Andreas und mit Nachnamen Kaufmann. SQL-Teacher 10 11 12 13 14 15 16 17 18 Abbildung 6.7 Kunden mit dem Vor- und Familiennamen des Firmengründers SELECT mit Bedingung (WHERE) 95

Die Beispielfirma will eine Werbeaktion per E-Mail starten und dabei nur das regionale begrenzte Angebot eines Kölner Kaufhauses bewerben. Die Selektion der Kunden soll folgendermaßen erfolgen: Es sollen nur Kunden selektiert werden, die über eine gespeicherte E-Mail-Adresse verfügen. Es sollen alle Kunden selektiert werden, deren Postleitzahl mit 50 beginnt. Um diese Selektion zu bewerkstelligen, muss überprüft werden, ob im Feld email ein Eintrag vorhanden ist. Hier könnte man im einfachsten Fall prüfen, ob das Feld einen Eintrag enthält, also NOT NULL ist. Die Selektion der Postleitzahlen erfolgt, indem man die ersten beiden Zeichen der Postleitzahl prüft. Der Befehl lautet hierfür bei FireBird und damit bei unserer Übungsdatenbank STARTING WITH. Man prüft also auf den Beginn der Zeichenkette. Der SQL-Befehl lautet wie folgt: SELECT name, vorname, email, strasse, plz, ort FROM kunde WHERE email IS NOT NULL AND plz STARTING WITH '50'; SQL-Teacher Vollziehen Sie das Beispiel in der beiliegenden Datenbank nach. Geben Sie den Befehl ein, und führen Sie ihn aus. In der Ausgabe werden die abgefragten Daten aller Kunden mit E-Mail-Eintrag und einer Postleitzahl, die mit 50 beginnt, aufgeführt. Übungen Übung 6.5 Übung 6.6 Übung 6.7 Übung 6.8 Übung 6.9 Listen Sie alle Artikel der Tabelle artikel auf, deren Nettopreis höher als 100 Euro liegt. Listen Sie alle Mitarbeiter auf, die in der Abteilung 2 beschäftigt sind. Listen Sie alle Artikel auf, die zur Kategorie Grafikkarten (Kategorienummer 3) gehören. Verbinden Sie beide Werbeaktionen der Beispielfirma. Beachten Sie, dass Sie die jeweilige Auswahl in Klammern setzen müssen. Geben Sie alle Kunden aus, deren Kundennummer größer als 50 ist und die nicht in Köln wohnen. 96 Daten abfragen (SELECT)

1 Mit LIKE und NOT LIKE vergleichen Sie einen Wert mit einer Vorgabe, in der Sie für Zeichen Platzhalter verwenden. Sie können somit auch Daten selektieren, deren genauen Wert Sie nicht kennen. Die Datenbanksysteme benutzen unterschiedliche Platzhalter. Aus Windows kenwww.galileocomputing.de - Einstieg in SQL - Leseprobe 2 3 4 5 6 7 8 9 Abbildung 6.8 Die relevanten Daten der Kunden mit E-Mail-Eintrag und einer Postleitzahl, die mit 50 beginnt 6.2.1 Vergleichsoperatoren In der CHECK-Klausel beim Anlegen von Tabellen oder einer Domänendefinition konnten Sie schon Vergleiche durchführen. Vergleichsoperatoren werden Sie auch in Abfragen insbesondere in der WHERE-Bedingung relativ häufig benötigen. Mathematische Operatoren wie gleich (=), größer als (>) und kleiner als (<) mit deren Kombinationen (>= und <=) sowie ungleich (<> oder!=) sind Ihnen wahrscheinlich geläufig. Diese Operatoren können in der WHERE-Bedingung verwendet werden. Wenn Sie z.b. alle Mitarbeiter selektieren wollen, die einen höheren Betrag als 3000 verdienen, lautet der Befehl: SELECT * FROM mitarbeiter WHERE gehalt > 3000; Des weiteren können Sie Vergleiche mit LIKE (ähnlich), IN (in), IS NULL (beinhaltet eine Nullmarke) und BETWEEN (zwischen) durchführen, die mit NOT (nicht) verneint werden können. 10 11 12 13 14 15 16 17 18 SELECT mit Bedingung (WHERE) 97

nen Sie sicher * als Platzhalter für eine beliebig lange Zeichenkette wenn Sie etwa eine Datei suchen, aber nicht den ganzen Namen eingeben wollen. Hier gibt es noch? für genau ein Zeichen. Datenbanken benutzen meist das Prozentzeichen (%) und den Unterstrich (_), so auch die beiliegende Datenbank. Wenn Sie nur Kunden haben wollen, die Meier in allen Variationen heißen, können Sie den betreffenden SELECT-Befehl mit IN ausschreiben, wie Sie es ja schon getan haben. SELECT * FROM kunde WHERE name IN ('Maier', 'Mayer', 'Meier', 'Meyer'); Oder Sie machen es sich etwas kürzer. SELECT * FROM kunde WHERE name LIKE 'M er'; Allerdings würden jetzt auch Herr Maler und Frau Meter aufgenommen. Wenn Sie eine Spalte mit IS NULL oder IS NOT NULL prüfen, können Sie sich die Datensätze ausgeben lassen, die in dieser Spalte keinen bzw. einen Wert enthalten: SELECT * FROM kunde WHERE name IS NOT NULL; Mit BETWEEN und NOT BETWEEN geben Sie zwei Werte an, zwischen denen der untersuchte Wert liegen soll. Wenn Sie alle Mitarbeiter selektieren wollen, die zwischen 2000 und 3000 EUR verdienen, lautet der Befehl SELECT * FROM mitarbeiter WHERE gehalt BETWEEN 2000 AND 3000; Die Bedingung können Sie auch mit > und < aufstellen. SELECT * FROM mitarbeiter WHERE gehalt >= 2000 AND <=3000; BETWEEN können Sie auch auf Zeichenketten anwenden. Um alle Kunden zwischen C und M zu selektieren, würde der folgende Befehl funktionieren: SELECT * FROM kunde WHERE name BETWEEN 'C' AND 'M' ORDER BY name; 98 Daten abfragen (SELECT)

1 www.galileocomputing.de - Einstieg in SQL - Leseprobe Daneben gibt es die logischen Operatoren AND (und), OR (oder) und NOT (nicht). Mit AND verknüpfte Bedingungen müssen beide erfüllt werden, damit die gesamte Bedingung erfüllt wird. Bei OR muss nur eine der verknüpften Bedingungen erfüllt sein. NOT kehrt den Wert um: Eine erfüllte Bedingung gilt als unerfüllt und umgekehrt. Diese Operatoren werden in der Reihenfolge NOT, AND, OR ausgewertet. Wenn Sie Bedingungen in Klammern setzen, so werden die Klammern zuerst ausgewertet. Die Bedingung NOT name = 'Meier' AND nettopreis > 20 OR produzent = 'Tolle Drucker GmbH' wird also folgendermaßen ausgewertet. Zuerst wird name = 'Meier' verneint, dann mit der Bedingung nettopreis > 20 über AND verknüpft. Diese Bedingung ist als Ganzes nur dann erfüllt, wenn der Name nicht Meier lautet und der Nettopreis über 20 Euro liegt. Diese Bedingung wird durch das OR mit produzent = 'Tolle Drucker GmbH' verbunden. Damit wird die gesamte Bedingung auch dann erfüllt, wenn der Name doch Meier und der Nettopreis unter 20 Euro liegt, aber der Produzent die Tolle Drucker GmbH ist. 6.3 Ausgabe sortieren (ORDER BY) Die Daten wurden bisher in der Reihenfolge ausgegeben, in der sie aus der Tabelle ausgelesen wurden. Durch eine Ergänzung des Befehls können Sie sich die Daten geordnet anzeigen lassen. Die Ordnung entspricht dem Datentyp der betroffenen Zeile. Texte werden alphabetisch ausgegeben, Zahlen der Höhe ihrer Werte nach. In der Regel geht das von A bis Z beziehungsweise vom niedrigsten zum höchsten Wert. Aber die Reihenfolge kann umgekehrt werden. Das folgende Einführungsbeispiel sortiert die Kundenliste alphabetisch nach Nachnamen. SELECT name, vorname FROM kunde ORDER BY name; Um eine geordnete Ausgabe zu erreichen, wird an das Ende des SELECT-Befehls das Element ORDER BY gehängt. Einführungsbeispiel SQL-Syntax 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 Ausgabe sortieren (ORDER BY) 99

1 www.galileocomputing.de - Einstieg in SQL - Leseprobe 8 Unterabfragen (Sub-Selects) Unterabfragen bieten die Möglichkeit, in einer Abfrage direkt die Ergebnisse einer anderen Abfrage zu verwenden. Welche Arten von Unterabfragen es gibt und wie sie eingesetzt werden können, zeigt dieses Kapitel. Das folgende Beispiel zeigt das Grundprinzip von Unterabfragen. Wenn Sie z.b. auf Basis der Tabelle mit den Bestellinformationen wissen möchten, welcher Kunde die Bestellung mit dem höchsten Wert aufweist, können Sie folgenden Befehl verwenden: SELECT kundennr, bestelldatum, rechnungsbetrag FROM bestellung WHERE rechnungsbetrag = ( SELECT max(rechnungsbetrag) FROM bestellung ); Sie sehen anhand dieses Beispiels, dass die Unterabfrage einen Wert für den Vergleichsoperator innerhalb der WHERE-Bedingung liefert. Um diesen Wert zu liefern, wird wiederum eine SELECT-Abfrage formuliert, die den bekannten Regeln folgt. Wenn Sie das Beispiel in der Übungssoftware ausführen, erfahren Sie, dass der Kunde mit der Nummer 63 am 25. Januar 2004 mit 4.235,97 Euro die Bestellung mit dem höchsten Wert getätigt hat (siehe Abbildung 8.1). In unserem Einführungsbeispiel wurde eine Unterabfrage formuliert, die genau einen Wert zurückgibt. Sie erhalten als Ergebnis den Datensatz mit dem höchsten Rechnungsbetrag aus der Tabelle bestellungen. Es ist nicht möglich, dieses Ergebnis über eine einfache Abfrage zu erhalten, weil die Aggregatfunktion max(rechnungsbetrag) die Angabe weiterer Felder nur dann zulässt, wenn eine entsprechende Gruppierung für diese Spalten vorhanden ist. Deshalb wird der SQL-Befehl Unter Unterabfragen, häufig auch als Sub-Selects oder Sub-Querys bezeichnet, versteht man die Möglichkeit, innerhalb eines Befehls das Ergebnis einer Abfrage unmittelbar in einer anderen Anweisung zu verwenden. Unterabfragen kommen also immer dann zur Anwendung, wenn eine Abfrage auf das Ergebnis einer anderen Abfrage zurückgreift. Einführungsbeispiel 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 141

SELECT max(rechnungsbetrag), kundennr, bestelldatum, rechnungsbetrag FROM bestellung; als ungültiger Befehl abgelehnt. Die Ergänzung um eine GROUP BY- Klausel macht daraus einen gültigen Befehl, allerdings werden jetzt aufgrund der Gruppierung alle Datensätze ausgegeben, was natürlich nicht das gewünschte Ergebnis darstellt. SELECT max(rechnungsbetrag), kundennr, bestelldatum, rechnungsbetrag FROM bestellung GROUP BY kundennr, bestelldatum, rechnungsbetrag; Abbildung 8.1 Ausführung einer Unterabfrage Die Einschränkung der Datensätze durch die WHERE-Bedingung erfolgt auf Basis einer SELECT-Abfrage, die den entsprechenden Wert bzw. entsprechende Werte für die Einschränkung liefert. Da der Wert für ein bestimmtes Feld geliefert wird, muss natürlich der Rückgabewert logisch zum Selektionskriterium passen. In diesem Fall wird der maximale Rechnungsbetrag zurückgegeben. Eine Unterabfrage ist im Übrigen relativ schnell zu erkennen, weil die gesamte Unterabfrage mit einer Klammer versehen wird und sich damit z.b. von einem Join auch schon optisch unterscheidet.

Der grundsätzliche Aufbau von Unterabfragen kann wie folgt definiert werden: SELECT spaltenliste FROM tabellenname WHERE spaltenname Vergleichsoperator ( SELECT abfrage ); Oft kann man Unterabfragen auch als Join formulieren. Wird zusätzlich eine Programmiersprache verwendet, mit der Ergebnisse von SQL-Befehlen gespeichert werden können, ist es natürlich auch möglich, das Ergebnis einer Abfrage zwischenzuspeichern und in der nächsten Abfrage zu verwenden. Da die Unterabfrage Werte für die Hauptabfrage liefert, können grundsätzlich folgende Varianten unterschieden werden: Unterabfragen, die einen Wert (Zeile) zurückgeben Unterabfragen, die mehrere Werte (Zeilen) zurückgeben Je nach Formulierung der Unterabfrage kann dann noch unterschieden werden, ob die Unterabfrage eigenständig ausgeführt werden kann oder nicht. Als korrelierte Unterabfragen werden dabei Unterabfragen verstanden, die nicht unabhängig von der Hauptabfrage ausgeführt werden können. Unterabfragen lassen sich nicht nur in SELECT-Abfragen verwenden, sondern genauso gut in DELETE-, UPDATE- und INSERT-Anweisungen. Im weiteren Verlauf des Buches finden Sie hierzu entsprechende Beispiele. 8.1 Unterabfragen, die eine Zeile zurückgeben Das oben gezeigte Einführungsbeispiel gehört zu dieser Gruppe der Unterabfragen, die nur einen Wert zurückgeben. Ein anderes Beispiel ist die Selektion eines bestimmten Datensatzes über den Primärschlüssel:»Zeige mir den Kunden mit der Kundennummer 56«. Dabei gelten folgende Bedingungen: Das Ergebnis der Unterabfrage gibt genau einen Wert zurück. Die Unterabfrage gibt genau eine Spalte (Feld) zurück. Diese Art der Unterabfrage erzeugt also nichts anderes als einen Selektionswert für die Hauptabfrage. Aus diesem Grund arbeitet man bei SQL-Syntax 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 Unterabfragen, die eine Zeile zurückgeben 143

dieser Art der Unterabfragen auch mit den bekannten Vergleichsoperatoren wie =, >, >=, < oder <=. Weiterführende Beispiele Das folgende Beispiel gibt einen Kunden zurück, der einer definierten Rechnungsnummer zugeordnet wird. SELECT name FROM kunde WHERE kundennr = ( SELECT kundennr FROM bestellung WHERE bestellnr = 10 ); Das Ergebnis dieser Abfrage sieht dann wie in Abbildung 8.2 aus. Abbildung 8.2 Unterabfrage, die eine Zeile zurückgibt Unterabfragen, die eine Zeile zurückgeben, können, wie bereits erwähnt, häufig auch über normale Joins formuliert werden. In diesem Beispiel kann diese Abfrage auch wie folgt definiert werden: SELECT name FROM kunde INNER JOIN bestellung ON kunde.kundennr = bestellung.kundennr WHERE bestellung.bestellnr = 10; Ob Sie besser eine Unterabfrage oder ein Join verwenden, ist dabei nicht mit einer Empfehlung zu versehen. Im Zweifel sollte der Befehl 144 Unterabfragen (Sub-Selects)

1 www.galileocomputing.de - Einstieg in SQL - Leseprobe verwendet werden, der die bessere Ausführungsgeschwindigkeit aufweist, was unter Umständen nur mit Analysetools des jeweiligen Datenbanksystems zu beantworten ist. Unterabfragen, die einen Wert liefern, sind insbesondere bei Fragestellungen, die berechnete Aggregatfunktionen (MAX, AVG) benötigen, interessant. Hierzu einige Beispiele. Im Folgenden werden alle Bestellungen aufgelistet, die einen überdurchschnittlichen Rechnungsbetrag haben: SELECT bestellnr FROM bestellung WHERE rechnungsbetrag > ( SELECT AVG(rechnungsbetrag) FROM bestellung ); Beispiele 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 Abbildung 8.3 Ausgabe auf Basis des Vergleichs mit einem Mittelwert Falls Sie den durchschnittlichen Rechnungsbetrag ermitteln wollen, können Sie dies mit der alleinigen Ausführung der Unterabfrage tun. SELECT AVG(rechnungsbetrag) FROM bestellung; Ein anderes Beispiel ist die Suche nach dem neuesten Mitarbeiter. Hier suchen wir über den größten Datumswert. 17 18 Unterabfragen, die eine Zeile zurückgeben 145

SELECT name,vorname FROM mitarbeiter WHERE eintrittsdatum = ( SELECT MAX(eintrittsdatum) FROM mitarbeiter ); So kann auch der Mitarbeiter gesucht werden, der zuerst angelegt wurde. Hier wird dann statt der Funktion max() die Funktion min() auf das Anlegedatum verwendet. SELECT name,vorname FROM mitarbeiter WHERE eintrittsdatum = ( SELECT MIN(eintrittsdatum) FROM mitarbeiter ); 8.2 Unterabfragen, die mehr als eine Zeile zurückgeben Eine Unterabfrage kann aber auch mehr als eine Zeile zurückgeben. Ein Beispiel hierfür ist die Selektion aller Bestellungen eines bestimmten Kunden. Wenn eine Unterabfrage mehrere Zeilen zurückgibt, ist der Einsatz von Mengenoperatoren notwendig, weil hier jetzt nicht mehr mit einem Wert verglichen wird, sondern mit allen Werten, die durch die Unterabfrage zurückgegeben werden. Weiterführendes Beispiel Sie haben eine Gehaltstabelle von Mitarbeitern und wollen wissen, ob jemand weniger verdient als derjenige Mitarbeiter mit dem geringsten Gehalt der Abteilung Vertrieb (Abteilung = 5). Der Befehl hierfür lautet dann: SELECT name, gehalt, abteilung FROM mitarbeiter WHERE gehalt < ALL ( SELECT gehalt FROM mitarbeiter WHERE abteilung = 5 ); Die Unterabfrage gibt alle Gehälter der Mitarbeiter der Abteilung Vertrieb aus. Der Mengenoperator ALL vergleicht dann, ob die Bedingung auf alle Zeilen der Unterabfrage zutrifft. In diesem Fall wird geprüft, ob ein Datensatz, der nicht die Abteilung 5 als Attribut trägt, kleiner als jeder Datensatz der Unterabfrage ist. 146 Unterabfragen (Sub-Selects)

1 www.galileocomputing.de - Einstieg in SQL - Leseprobe Als Ergebnis erhalten Sie in der Übungssoftware fünf Mitarbeiter (siehe Abbildung 8.4). 2 3 4 5 6 7 8 9 10 11 Abbildung 8.4 Unterabfrage mit dem Vergleichsoperator < ALL Folgende Mengenoperatoren sind für Unterabfragen, die mehr als einen Datensatz zurückgeben, gültig. 12 13 Mengenoperator vo ALL Beschreibung Prüft, ob die angegebene Bedingung auf alle Datensätze der Unterabfrage zutrifft. ALL wird immer mit einem Vergleichsoperator vo wie >, < >= oder <= verwendet. Mengenoperatoren 14 15 vo ANY Prüft, ob die angegebene Bedingung auf irgendeinen Datensatz der Unterabfrage zutrifft. ANY wird immer mit einem Vergleichsoperator vo wie >, < >= oder <= verwendet. 16 IN Prüft, ob ein Wert in dem Ergebnis der Unterabfrage enthalten ist. 17 EXISTS Prüft, ob die Bedingung auf mindestens einen Datensatz der Unterabfrage zutrifft, also mindestens ein Datensatz selektiert wird. Rückgabe ist TRUE oder FALSE. 18 Anhand von Beispielen werden im Folgenden die verschiedenen Mengenoperatoren besprochen. Unterabfragen, die mehr als eine Zeile zurückgeben 147

ALL Der ALL-Operator wird verwendet, wenn eine Bedingung auf alle Zeilen der Unterabfrage passen soll. Sie suchen z.b. alle Mitarbeiter, die länger dem Unternehmen angehören als der dienstälteste Mitarbeiter der Abteilung Vertrieb (Abteilung = 5). Der Befehl hierfür lautet: SELECT name, eintrittsdatum, abteilung FROM mitarbeiter WHERE eintrittsdatum < ALL ( SELECT eintrittsdatum FROM mitarbeiter WHERE abteilung = 5 ); Die Unterabfrage liefert hier eine Ergebnisliste mit allen Eintrittsdaten der Mitarbeiter der Vertriebsabteilung. In der Hauptabfrage werden alle Datensätze ausgegeben, deren Eintrittsdatum kleiner als alle (ALL) Datensätze der Unterabfrage sind. Im Ergebnis sieht diese Abfrage wie in Abbildung 8.5 gezeigt aus. Abbildung 8.5 Der ALL-Operator in Unterabfragen Natürlich kann es vorkommen, dass die Unterabfrage keinen Wert liefert, also leer ist. In diesem Fall kann die Hauptabfrage nicht erfüllt werden, liefert also falsch zurück. 148 Unterabfragen (Sub-Selects)

Während der Operator ALL bewirkt hat, dass mit allen selektierten Datensätzen der Unterabfrage verglichen wurde, muss bei ANY nur irgendein Datensatz der Unterabfrage mit der Bedingung für die Hauptabfrage gültig sein. Während bei ALL der Vergleich nach dem größten Wert vorgenommen wurde, lautet bei ANY die Fragestellung, welcher Wert der Hauptabfrage größer als ein beliebiger Wert der Unterabfrage ist. Auf das oben gezeigte Gehaltsbeispiel bezogen würde ANY bewirken, dass alle Personen gesucht werden, die weniger verdienen als der höchste Wert der Unterabfrage. SELECT name, gehalt, abteilung FROM mitarbeiter WHERE gehalt < ANY ( SELECT gehalt FROM mitarbeiter WHERE abteilung=5 ); Während bei ANY und ALL mit Vergleichsoperatoren gearbeitet wurde, also Werte, die größer und kleiner als Vergleichswerte aus der Unterabfrage waren, prüft IN auf Übereinstimmung mit dem Ergebnis der Unterabfrage. In der Übungsdatenbank existiert zu der Mitarbeitertabelle noch eine Tabelle, in der gespeichert wird, ob der Mitarbeiter ein Jobticket besitzt. Sie wollen nun wissen, welcher der Mitarbeiter auch ein gültiges Jobticket besitzt. Die Abfrage hierfür lautet dann wie folgt: SELECT name FROM mitarbeiter WHERE mitarbeiternr IN ( SELECT mitarbeiternr FROM jobticket WHERE gueltig_bis > CURRENT_DATE ); Natürlich kann auch mit NOT geprüft werden, ob keine Übereinstimmung mit der Unterabfrage besteht. Wenn Sie also wissen wollen, wer noch kein Jobticket hat, lautet die Abfrage: SELECT name FROM mitarbeiter WHERE mitarbeiternr NOT IN ( SELECT mitarbeiternr FROM jobticket WHERE gueltig_bis > CURRENT_DATE ); ANY IN 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 Unterabfragen, die mehr als eine Zeile zurückgeben 149

Auch an diesem Beispiel lässt sich zeigen, dass man Unterabfragen auch als Joins definieren kann. Die Frage, wer noch kein Jobticket besitzt, könnte auch über folgende Abfrage beantwortet werden: SELECT m.name FROM mitarbeiter m INNER JOIN jobticket j ON m.mitarbeiternr = j.mitarbeiternr WHERE j.gueltig_bis > CURRENT_DATE; An dieser Stelle sei noch einmal angemerkt, dass FireBird/InterBase im Gegensatz zu den meisten anderen Datenbanken kein AS für die Benennung von Aliasen verlangt. EXISTS Während IN geprüft hat, ob ein identischer Vergleichswert für die Hauptabfrage in der Unterabfrage vorhanden ist, und dann auf dieser Basis Datensätze auswählt, prüft EXISTS generell nur, ob ein gültiger Wert in der Unterabfrage für die formulierte Abfrage existiert. Bei EXISTS stellt deshalb keine Vergleichsspalte die Verbindung zwischen Haupt- und Unterabfrage her. Das folgende Beispiel beantwortet die Frage, welche Mitarbeiter aus der Tabelle mitarbeiter auch in der Tabelle jobticket vorhanden sind. SELECT name, abteilung FROM mitarbeiter WHERE EXISTS (SELECT * FROM jobticket WHERE mitarbeiter.mitarbeiternr = jobticket.mitarbeiternr ); Da EXISTS nur prüft, ob ein gültiger Vergleichswert in der Unterabfrage vorhanden ist, ist zwingend notwendig, über mitarbeiter.mitarbeiternr = jobticket.mitarbeiternr die Ausgabe auf korrespondierende Datensätze einzuschränken. Andernfalls würden alle Datensätze ausgegeben werden, weil bereits ein Eintrag in der Tabelle jobticket die Unterabfrage auf gültig setzt und damit dann alle Datensätze der Hauptabfrage ausgibt. Sie können auch hier den Operator NOT verwenden. Wenn Sie also wissen möchten, welche Mitarbeiter kein Jobticket besitzen, lautet die Abfrage: SELECT name, abteilung FROM mitarbeiter 150 Unterabfragen (Sub-Selects)

WHERE NOT EXISTS ( SELECT * FROM jobticket WHERE mitarbeiter.mitarbeiternr = jobticket.mitarbeiternr ); Sie können grundsätzlich auch mehr als eine Unterabfrage in einer Abfrage verwenden. Das weiter oben gezeigte Beispiel der Selektion von überdurchschnittlichen Rechnungsbeträgen, die höher als der Durchschnitt sind, könnte so auch z.b. um die Selektion aller Kunden erweitert werden, die in Hamburg wohnen. SELECT bestellnr FROM bestellung WHERE rechnungsbetrag > ( SELECT AVG(rechnungsbetrag) FROM bestellung ) AND kundennr IN ( SELECT kundennr FROM kunde WHERE ort = 'Hamburg' ); Übungen Geben Sie Bestelldatum und Kundennummer für die Bestellung mit dem höchsten Rechnungsbetrag aus, der jemals gestellt wurde. Aus der Übungsdatenbank sollen alle Bestellungen der Kunden aus Hamburg ausgegeben werden. Formulieren Sie einen SELECT-Befehl mit einer Unterabfrage. Ermitteln Sie alle Mitarbeiter, denen ein überdurchschnittliches Gehalt im Vergleich zum Unternehmensdurchschnitt gezahlt wird. 8.3 Regeln für die Verwendung von Unterabfragen Zusammenfassend werden hier noch einmal die Regeln für die Verwendung von Unterabfragen aufgeführt: Eine Unterabfrage wird als rechtsseitiger Ausdruck als Vergleich oder EXISTS-Bedingung eingesetzt. Die Unterabfrage ist in Klammern zu setzen. Übung 8.1 Übung 8.2 Übung 8.3 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 Regeln für die Verwendung von Unterabfragen 151

Wenn die Unterabfrage einen Datensatz als Ergebnis liefert, kann diese mit den Vergleichsoperatoren >, <, =, <= und >= eingeleitet werden. Ob nur ein Datensatz aus der Unterabfrage hervorgeht, ist unter Umständen durch die Formulierung des Befehls festzulegen. Liefert die Unterabfrage mehr als einen Datensatz, können keine Vergleichsoperatoren mehr eingesetzt werden. Hierfür stehen dann die Mengenoperatoren ALL, ANY, IN und EXISTS zur Verfügung. ORDER BY ist innerhalb einer Unterabfrage nicht zulässig. Innerhalb der Unterabfrage ist UNION nicht zulässig. 152 Unterabfragen (Sub-Selects)

Index A Abfrage s. SELECT Abhängige Tabelle 50 ABS() 120, 256 Absoluter Wert 120 ACID 177 ADD CONSTRAINT 74 Aggregatfunktionen 113 Aktualisierung 171, 172 Aktualisierungsvorgänge 46, 52 Alias 115 Spaltenalias 93 Tabellenalias 92 ALTER 74 ALTER DOMAIN 68, 249 ADD 70 ADD CHECK 69 DROP CONSTRAINT 69 DROP DEFAULT 69 SET 69 ALTER INDEX 250 ALTER TABLE 72, 73, 246 ADD 74 ALTER 74 DROP 74 MODIFY 74 AND 99 AS 114 ASC 100 Atomicity 177 AUTOCOMMIT 179 Autoinkrement 47, 246 AVG() 115, 256 B BEGIN 190, 259 Benutzer 201, 202 Benutzerrechte 203, 206, 264 BETWEEN 97 Beziehung 1 zu 1 22 1 zu n 22 n zu m 22 Beziehungstypen 22 BINARY(n) 241 BIT VARYING(n) 43, 241 BIT(n) 43, 241 BLOB 44, 241 BOOLEAN 44, 242 C CASE-Tool 21 CAST() 124, 132, 256 CHAR(n) 37, 240 CHAR_LENGTH() 121, 256 CHARACTER LARGE OBJECT(n) 39, 240 CHARACTER SET 197 CHARACTER VARYING(n) 37 CHARACTER(n) 37, 240 CHARACTER_LENGTH() 121, 256 CHECK 57, 63 CLOB 240, 241 COLLATE 197 COMMIT 177, 178, 179, 180, 182, 232, 259 Condition Join 135 Consistency 177 Constraint 74 CONTAINING 67 COUNT() 104, 115, 256 CREATE DATABASE 231 CREATE DOMAIN 65, 248 CREATE FUNCTION 188 CREATE INDEX 80, 249 CREATE PROCEDURE 185, 188 CREATE ROLE 202 CREATE TABLE 242 Syntax 45 CREATE TRIGGER 190 CREATE VIEW 258 Syntax 167 WITH CHECK OPTION 171 CURRENCY 240 CURRENT_DATE() 62, 123, 257 CURRENT_TIME() 123, 257 CURRENT_TIMESTAMP() 123, 257 D Data Definition Language s. DDL DATE 41, 241 Datenbankadministrator 201 Index 267

Datenbankentwurf 20 Datenbankkonsistenz siehe auch Referenzielle Integrietät 185 Datenbankmanagementsystem 20 Datendefinitionssprache s. DDL Datenmanipulationssprache s. DML Datenmodell 20 objektorientiertes 21 relationales 21 Datensicht s. View Datentyp BINARY(n) 241 BIT VARYING(n) 241 BIT(n) 43, 241 BLOB 44, 241 BOOLEAN 44, 242 CHARACTER LARGE OBJECT(n) 39, 240 CHARACTER VARYING(n) 37, 240 CHARACTER(n) 37, 240 CLOB 240, 241 CURRENCY 240 DATE 41, 241 DATETIME 241 DECIMAL(n, m) 41, 240 DOUBLE PRECISION 41, 240 FIXED(n, m) 240 FLOAT(n) 41, 240 IMAGE 241 INTEGER 40, 240 INTERVAL DAY 43 INTERVAL DAY TO HOUR 43 INTERVAL DAY TO MINUTE 43 INTERVAL MINUTE TO SECOND 43 INTERVAL YEAR 42 INTERVAL YEAR TO MONTH 42 LONG 240 LONGBLOB 241 LONGTEXT 240 MEDIUMBLOB 241 MEDIUMTEXT 240 MEMO 240 NATIONAL CHARACTER VARYING(n) 38, 240 NATIONAL CHARACTER(n) 38, 240 NCHAR VARYING(n) 240 NCHAR(n) 240 NTEXT 240 NUMERIC(n, m) 40, 240 NVARCHAR(n) 240 REAL 41, 240 SINGLE 240 SMALLDATETIME 241 SMALLINTEGER 40, 240 TEXT 240 TIME 42, 241 TIME(n) WITH TIME ZONE 42 TIMESTAMP 42, 241 TIMESTAMP(n) WITH TIME ZONE 42 TINYBLOB 241 VARBINARY(n) 241 VARCHAR(n) 37, 240 DATETIME 241 Datumsfunktionen 113, 257 DAY() 256 DB2 239 DBMS s. Datenbankmanagementsystem DDL 17, 20 DECIMAL(n, m) 41 DEFAULT 62 DELETE 143, 159, 202, 205, 207, 232, 252 DESC 100 Dirty Read 180 DISTINCT 93, 253 DML 17, 20 Domäne 63 DOUBLE PRECISION 41 DROP 77 DROP CONSTRAINT 74 DROP DOMAIN 70, 249 DROP INDEX 82, 250 DROP TABLE 76, 248 DROP TRIGGER 194 DROP VIEW 172, 259 CASCADE 172 RESTRICT 172 Dubletten 111 Durability 177 E END 190 Entität 21 Entitätstyp 21 268 Index

Entity-Relationship-Modell s. ER- Modell ER-Modell 22 EXCEPT 109, 255 EXISTS 147 EXTRACT() 121, 256 F FIXED(n, m) 240 Fließkommazahl 41 FLOAT 41, 240 FOREIGN KEY 49 CASCADE 52 DEFAULT 52 Definition 24 NO ACTION 52 SET NULL 52 Fremdschlüssel s. FOREIGN KEY G GETDATE() 257 GETUTCDATE() 257 GRANT 203, 264 Greenwich Mean Time 42 GROUP BY 104, 105 Gruppierung s. GROUP BY H HAVING 106 HOUR() 256 I IMAGE 241 IN 97 INDEX 78 Inner Join 132 INSERT INTO 83, 251 INSTR() 256 INTEGER 40, 240 InterBase 239 INTERSECT 109, 255 INTERVAL DAY 43 INTERVAL DAY TO HOUR 43 INTERVAL DAY TO MINUTE 43 INTERVAL MINUTE TO SECOND 43 INTERVAL YEAR 42 INTERVAL YEAR TO MONTH 42 IS NOT NULL 98 IS NULL 97 ISO8859 197 Isolation 177 Isolationsebene 182 Isolationsphänome 180 J JOIN Column Name Join 135 Cross Join 137 FULL OUTER JOIN 138 INNER JOIN 133 LEFT JOIN 138 Natural Join 136 Old style 129 Outer Join 138 RIGHT JOIN 138 Self Join 136 K Korrelierte Unterabfrage 143 Kreuzprodukt s. Cross Join L LEN() 256 LENGTH() 256 LIKE 97 LOCATE() 256 LONG 240 LONGBLOB 241 LONGTEXT 240 Lost Update 180 LTRIM() 258 M Mathematische Funktionen 113 MAX() 115, 256 MEDIUMBLOB 241 MEDIUMTEXT 240 Mehrbenutzerbetrieb 175, 183 Mehrfelderschlüssel 47 MEMO 240 MID() 258 MIN() 116, 256 MINUS 109, 255 MINUTE() 256 MOD() 119, 122, 256 MODIFY 74 Index 269

MONTH() 256 MS Access 239 Multi-Column-Index 79, 80 MySQL 239 N NATIONAL CHARACTER VARYING(n) 38 NATIONAL CHARACTER(n) 38, 240 NCHAR VARYING(n) 240 NCHAR(n) 240 Non-repeatable Read 181 Normalform 27 Normalisierung 26 NOT 97, 99 NOT BETWEEN 98 NOT LIKE 97 NOT NULL 46 NOW() 257 NTEXT 240 NULL 127 Nullmarken 127 NUMERIC(n, m) 40, 240 NVARCHAR(n) 240 O ON DELETE 52, 242 ON UPDATE 53, 242 Operatoren Arithmetische Operatoren 18 Logische Operatoren 18 Vergleichsoperatoren 18 Verknüpfungsoperatoren 19 OR 99 Oracle 239 ORDER BY 99 OVERLAY() 125 P Phantom 181 Platzhalter 97 POSITION() 122, 256 Primärschlüssel 24, 46, 47, 49 PRIMARY KEY s. Primärschlüssel Privilegien s. GRANT R Read Uncommited 182 REAL 41, 240 Referenzielle Integrität CASCADE 25 Definition 25 SET NULL 26 Relation, Definition 23 Relationales Datenmodell 23 Relationenalgebra 132 Reverse engineering 21 REVOKE 206, 264 ROLLBACK 177, 259 Rolle 202 RTRIM() 258 S SAPDB 239 Schlüssel 22 SECOND() 256 SELECT 87, 89, 253 Alle Spalten ausgeben 90 Spalten auswählen 91 SET 154 SINGLE 240 SMALLDATETIME 241 SMALLINTEGER 40, 240 SQL Server 239 Standardwert 61, 62 Sub-Selects s. Unterabfragen SUBSTR() 258 SUBSTRING() 125, 258 SUM() 115, 256 SYSDATE() 257 T Tabelle 17 TEXT 240 TIME 42, 241 TIME(n) WITH TIME ZONE 42 TIMESTAMP(n) 42 TIMESTAMP(n) WITH TIME ZONE 42 TINYBLOB 241 Transaktion Definition 175 Trigger 189 TRIM() 126, 258 Tupel 23 270 Index

U UDF 185, 261 Unicode 196 UNION 108, 255 UNION ALL 111 UNIQUE 56 Unterabfragen ALL 148 ANY 149 EXISTS 150 IN 149 in DELETE-Befehlen 162 in UPDATE-Befehlen 156 Join als Alternative 144, 150 korrelierte 143 Mengenoperatoren 147 mit einem Wert 143 mit mehreren Werten 146 UPDATE 153, 154, 251 UPPER() 126, 257 Use Case 20 USING 135 V VALUE 67 VARBINARY(n) 241 VARCHAR(n) 37, 240 Vatertabelle 50 Vergleichsoperatoren 97 View 167 Read-only 170 W WHERE 94 Y YEAR() 256 Z Zeichenkettenfunktionen 113 Zeichenverkettung 125, 257 Zusammengesetzter Index 79 Index 271