Galileo Computing < openbook >
Galileo Computing - Professionelle Buecher. Auch fuer Einsteiger.
Galileo Computing - Professionelle Buecher. Auch fuer Einsteiger.


Java ist auch eine Insel von Christian Ullenboom
Buch: Java ist auch eine Insel (Galileo Computing)
gp Kapitel 20 Datenbankmanagement mit JDBC
gp 20.1 Das relationale Modell
gp 20.2 JDBC: der Zugriff auf Datenbanken über Java
gp 20.3 Die Rolle von SQL
gp 20.3.1 Ein Rundgang durch SQL-Anfragen
gp 20.3.2 Datenabfrage mit der Data Query Language (DQL)
gp 20.3.3 Tabellen anlegen mit der Data Definition Language (DDL)
gp 20.4 Datenbanktreiber für den Zugriff
gp 20.4.1 Treibertypen
gp 20.5 Datenbanken und ihre Treiber
gp 20.5.1 Die freie Datenbank MySQL
gp 20.5.2 JDBC-Treiber für MySQL: MySQL Connector/J
gp 20.5.3 Die Datenbank Microsoft Access
gp 20.5.4 Ein Typ-4-Treiber für den Microsoft SQL Server 2000
gp 20.5.5 Die JDBC-ODBC-Bridge
gp 20.5.6 ODBC einrichten und Access damit verwenden
gp 20.5.7 Oracle9i Enterprise Edition
gp 20.5.8 JDBC-Treiber für mobile Endgeräte
gp 20.6 Eine Beispielabfrage
gp 20.7 Mit Java an eine Datenbank andocken
gp 20.7.1 Der Treibermanager
gp 20.7.2 Eine Aufzählung aller Treiber
gp 20.7.3 Log-Informationen
gp 20.7.4 Den Treiber laden
gp 20.7.5 Verbindung zur Datenbank
gp 20.8 Datenbankabfragen
gp 20.8.1 Abfragen über das Statement-Objekt
gp 20.8.2 Ergebnisse einer Abfrage in ResultSet
gp 20.8.3 Unicode in der Spalte korrekt auslesen
gp 20.8.4 wasNull() bei ResultSet
gp 20.8.5 Wie viele Zeilen hat ein ResultSet?
gp 20.9 Java und SQL-Datentypen
gp 20.9.1 Die getXXX()-Methoden
gp 20.10 Transaktionen
gp 20.11 Elemente einer Datenbank hinzufügen und aktualisieren
gp 20.11.1 Batch-Updates
gp 20.12 Vorbereitete Anweisungen (Prepared Statements)
gp 20.12.1 PreparedStatement-Objekte vorbereiten
gp 20.12.2 Werte für die Platzhalter eines PreparedStatement
gp 20.13 Metadaten
gp 20.13.1 Metadaten über die Tabelle
gp 20.13.2 Informationen über die Datenbank
gp 20.14 Die Ausnahmen bei JDBC
gp 20.15 Java Data Objects (JDO)
gp 20.16 XML-Datenbanken
gp 20.16.1 Apache Xindice
gp 20.16.2 eXist und Weitere


Galileo Computing

20.3 Die Rolle von SQLdowntop

SQL ist die bedeutendste Anfragesprache für relationale Datenbanken, in der Benutzer angeben, auf welche Daten sie zugreifen möchten.1 Obgleich die Bezeichnung »Anfragesprache« etwas irreführend klingt, beinhaltet sie auch Befehle zur Datenmanipulation und Datendefinition, um beispielsweise neue Tabellen zu erstellen. Nachdem Anfang der Siebzigerjahre das relationale Modell für Datenbanken populär wurde, entstand im IBM-Forschungslabor San José (jetzt Almaden) ein Datenbanksystem mit dem Namen »System »R«. Das relationale Modell wurde 1970 von Dr. Edgar F. Codd2 entwickelt. System R bot eine Anfragesprache, die SEQUEL (Structured English Query Language) genannt wurde. Später wurde SEQUEL in SQL umbenannt. Da sich relationale Systeme einer großen Beliebtheit erfreuten, wurde 1986 die erste SQL-Norm vom ANSI-Konsortium verabschiedet. 1988 wurde der Standard geändert, und 1992 entstand die zweite Version von SQL (SQL-2 beziehungsweise SQL-92 genannt). Da die wichtigen Datenbanken alle SQL-2 verarbeiten, kann ein Programm über diese Befehle die Datenbank steuern, ohne verschiedene proprietäre Schnittstellen nutzen zu müssen. Dennoch können über SQL die speziellen Leistungen einer Datenbank genutzt werden.


Sprache Entwicklung
SQUARE 1975
SEQUEL 1975, IBM Research Labs San José
SEQUEL2 1976, IBM Research Labs San José
SQL 1982, IBM
ANSI-SQL 1986
ISO-SQL (SQL 89, SQL-1) 1989, drei Sprachen: Level 1, Level 2, +IEF
Firmenstandards IBM SQL, OS/2 SQL, X/Open UNIX SQL ...
SQL-2 (bzw. SQL-92) 1992
SQL-3 (auch SQL-1999) 1999

Tabelle 20.2 Entwicklung von SQL

Damit sich ein Datenbanktreiber JDBC-kompatibel nennen kann, muss er mindestens SQL-92 unterstützen. Das heißt jedoch nicht, dass die existierenden Treiber alle Eigenschaften von SQL-92 implementieren müssen; über Kannst-Du-Funktionen lässt sich der Treiber fragen, ob er Eigenschaften unterstützt oder nicht.


Galileo Computing

20.3.1 Ein Rundgang durch SQL-Anfragendowntop

Da das Wort »Anfragesprache« eine Art Programmiersprache suggeriert, sind wir interessiert an einem Beispiel. Um es vorweg zu sagen: Es gibt nur eine Hand voll wichtiger Befehle, und SELECT, UPDATE und CREATE decken schon einen Großteil ab. Obwohl die Groß-/Kleinschreibung der Befehle unbedeutend ist, sind sie zwecks besserer Lesbarkeit im Folgenden groß geschrieben.


Beispiel Eine einfache Abfrage in SQL
SELECT Lfr_Name
FROM Lieferanten

Tabellen nehmen die Benutzerdaten auf, und mit dem Kommando FROM wählen wir die Tabelle Lieferanten aus, die für die Berechnung erforderlich ist. Die Tabelle Lieferanten enthält drei Attribute (die Spalten), die wir mit SELECT auswählen. In einer Datenbank werden normalerweise mehrere Tabellen verwendet, ein so genanntes Datenbankschema. Jede Tabelle gehört genau zu einem Schema.

SQL-Abfragen sind nah an der Umgangssprache formuliert. Im oberen Beispiel liest sich die Abfrage einfach als: »Wähle die Spalte Lfr_Name aus der Tabelle Lieferanten«. Der Designer einer Datenbank muss sich natürlich vor der Umsetzung der Tabellen und somit der Relationen gründlich Gedanken machen. Denn eine spätere Änderung der Struktur ist teuer. So muss schon am Anfang einkalkuliert werden, welche Daten in welchen Ausprägungen auftreten können. Nach Statistiken des amerikanischen Library of Congress verdoppelt sich insgesamt alle fünf Jahre die Informationsmenge. Was wäre, wenn diese Informationen alles Einträge in einer endlos verzweigten Datenbank wären, und jemand würde feststellen, dass das Tabellenschema ungünstig ist? Eine Datenbank muss also schon enorm leistungsfähig sein, um sich einer solchen Menge stellen zu können. Datenbankdesigner nennen den Vorgang von einem ersten Modell bis zur fertigen Relation Normalisierung.

Bevor wir mit den einzelnen Sprachelementen von SQL fortfahren, an dieser Stelle ein paar Regeln für SQL-Ausdrücke:

gp Die SQL-Anweisungen sind unabhängig von der Groß- und Kleinschreibung. Im Text sind die SQL-Kommandos großgeschrieben, damit die Ausdrücke besser lesbar sind.
gp Leerzeichen, Return und Tabulatoren sind in einer Anfrage bedeutungslos. Im Folgenden werden zur besseren Lesbarkeit Zeilenumbrüche verwendet.
gp SQL-Anweisungen werden mit einer Zeichenkette abgeschlossen. Sie unterscheidet sich aber von Datenbank zu Datenbank. Häufig ist dies ein Semikolon; es kann aber auch ein \go sein. Wir werden die Anweisungen in den Beispielen nicht abschließen, da JDBC diesen Abschluss automatisch vornimmt.

Wir werden uns nun noch intensiver um SQL-Anfragen kümmern. Es wird sich zeigen, dass eine einzelne Anweisung sehr ausdrucksstark sein kann. JDBC hat aber mit dieser Ausdrucksstärke nichts zu schaffen, es weiß noch nicht einmal um ihre Korrektheit. JDBC leitet den SQL-Befehl einfach an den Treiber, und dieser leitet das Kommando dann wiederum an die Datenbank weiter.

SQL gliedert sich in eine Reihe von unterschiedlichen Anfragetypen - die einen sind mehr mit der Modifikation von Daten, die anderen ehr mit der Abfrage von Daten beschäftigt. Die wichtigsten der drei Sprachen sind:

gp DDL (Data Definition Language). Erstellen der Tabellen, Beziehungen (mit Schlüsseln) und Indizes. Typische SQL-Anweisugen sind: CREATE/DROP DATABASE, CREATE/DROP INDEX, CREATE/DROP SYNONYM, CREATE/DROP TABLE, CREATE/DROP VIEW.
gp DML (Data Manipulation Language). Daten hinzufügen und löschen. Typische SQL-Anweisungen sind hier: INSERT, DELETE, UPDATE.
gp DQL (Data Query Language). Daten auswählen und filtern. Die typischste SQL-Anweisung ist SELECT mit den Spezialisierungen ALL, DISTINCT, ORDER BY, GROUP BY, HAVING, Unteranfragen (IN, ANY, ALL, EXISTS), Schnittmengen und Joins.

Galileo Computing

20.3.2 Datenabfrage mit der Data Query Language (DQL)downtop

Unsere ersten Beispiele basieren auf einer existierenden Datenbank mit Pflanzen, Bestellungen und Lieferanten. Interessieren wir uns nun also für Abfragekommandos, um auf die Inhalte zuzugreifen. In SQL steckt auch schon das Wort »Query«, unsere Anfrage. Das wichtigste Element ist hierbei das oben schon genannte SELECT.

SELECT {Feldname, Feldname,..|*} ( * = alle Felder )
FROM Tabelle [, Tabelle, Tabelle....]
[WHERE {Bedingung}]
[ORDER BY Feldname [ASC|DESC]...]
[GROUP BY Feldname [HAVING {Bedingung}]]

Das Angenehme bei SQL ist, dass wir uns nicht um das Wie kümmern müssen, sondern nur um das Was. Wir fragen also etwa »Welche Lieferanten wohnen in Aalen?« und formulieren:

SELECT Lfr_Name
FROM Lieferanten
WHERE Wohnort='Aalen'

Dabei ist es uns egal, wie die Datenbankimplementierung mit dieser Anfrage umgeht. Und hier unterscheiden sich auch die Anbieter in ihrer Leistungsfähigkeit und in den Preisen.

Kümmern wir uns nun um die verschiedenen Schreibweisen von SELECT. Geben wir in SELECT eine Spalte an, so bekommen wir nur die Ergebnisse dieser Spalte zurück. Eine Anfrage, die alle Spalten zurückgibt, wird mit dem »*« geschrieben. Damit wir also nicht nur den Namen des Kunden bekommen, sondern auch noch die anderen Angaben - um ihm gleich einen Auftrag zu geben -, schreiben wir Folgendes, um eine Liste aller Lieferanten in Aalen zu erhalten:

SELECT * FROM Lieferanten WHERE Wohnort='Aalen'

Wir sehen, dass es keinen Unterschied macht, ob die Anfragen in mehrere Zeilen aufgespalten sind oder in einer Zeile stehen. Wir werden jedoch zur besseren Lesbarkeit bei einzelnen Zeilen bleiben.

Zeilen ausfiltern und logische Operatoren

Die SELECT-Anweisung geht über die Spalten, und die WHERE-Angabe filtert Zeilen nach einem Kriterium heraus. Wir haben zunächst mit einer Gleich-Abfrage gearbeitet. SQL kennt die üblichen Vergleichsoperatoren: = gleich, <> ungleich, > größer, < kleiner, >= größer gleich, <= kleiner gleich. Vergleiche werden mit einem einfachen Gleichheitszeichen und nicht durch == formuliert. Die Vergleichsoperatoren lassen sich durch die Operatoren AND, OR und NOT weiter verfeinern. Bei numerischen Daten können wir auch die Rechenoperatoren (+, -, *, /) anwenden. An Stelle vielfacher AND-Anfragen lässt sich mit zwei SQL-Anweisungen auch der Wertebereich noch weiter einschränken. Mit BETWEEN Wert1 AND Wert2 lässt sich testen, ob ein Vergleichswert zwischen Wert1 und Wert2 liegt. Mit IN (Werteliste) wird getestet, ob der Vergleichswert in der angegebenen Werteliste liegt. Für Zeichenketten spielt noch LIKE eine Rolle, da hier ein Mustervergleich vorgenommen werden kann. Mit IS NULL lässt sich mit einem NULL-Wert vergleichen.

Wenn wir diese SQL-Anweisung von der Datenbank ausführen lassen, wollen wir die Daten gerne entsprechend dem Preis sortiert haben. Dazu lässt sich die SELECT-Anweisung mit einem ORDER BY versehen. Dahinter folgt die Spalte, nach der sortiert wird. Jetzt wird die Tabelle aufsteigend sortiert, also der kleinste Wert unten. Wünschen wir die Sortierung absteigend, dann setzen wir noch DESC hinten an.

Wir wollen nun die Informationen mehrerer Tabellen miteinander verbinden. Dazu führen wir eine Tupel-Variable ein. Diese kann eingesetzt werden, wenn sich Attribute nicht eindeutig den Relationen zuordnen lassen. Dies ist genau dann der Fall, wenn zwei Relationen verbunden werden sollen und beide den gleichen Attributnamen besitzen.


Beispiel Die SQL-Anweisung zeigt die Verwendung der Variable, die jedoch hier nicht erforderlich ist, da nur eine Tabelle verwendet wird.
SELECT L.Lfr_Name, L.Wohnort
FROM Lieferanten L
WHERE L.Wohnort = 'Aalen'

Der Buchstabe »L« ist hier nur eine Abkürzung, eine Art Variable. Abkürzungen für Spalten werden in SQL auch mit AS abgetrennt, etwa

FROM Lieferant AS L

Dann lässt sich auf die Spalte Lieferant in der Tabelle Lieferanten kurz mit L zugreifen.

Gruppenfunktionen

Mit Gruppenfunktionen (auch Aggregationsfunktionen) lassen sich zum Beispiel Durchschnittswerte oder Minima über Spalten beziehen. Sie liefern genau einen Wert, beziehen sich jedoch auf mehrere Tabellenzeilen. Die folgende Anfrage liefert alle Anbieter aus Aalen:

SELECT COUNT(*)
FROM Lieferanten
WHERE Wohnort = 'Aalen'

Die Spalten, die die Gruppenfunktion bearbeiten, stehen in Klammern hinter dem Namen. Die SQL-Standardfunktionen (es gibt datenbankabhängig noch viel mehr) sind in der folgenden Tabelle aufgeführt:


AVG Durchschnittswert
COUNT Anzahl aller Einträge
MAX Maximalwert
MIN Minimalwert
SUM Summe aller Einträge in einer Spalte

Tabelle 20.3 Die Standardfunktionen in SQL


Galileo Computing

20.3.3 Tabellen anlegen mit der Data Definition Language (DDL)toptop

Zum Anlegen einer Tabelle (Relation) dient die SQL-Anweisung CRATE TABLE. Sie definiert die Spalten (Attribute) mit ihren Wertebereichen. Optional lassen sich Integritätsbedingungen definieren, etwa, ob eine Spalte mit einem Eintrag belegt sein muss (NOT NULL), oder welcher Fremdschlüssel eingetragen ist.

CREATE TABLE Tabelle
      (Spaltendefinition [,Spaltendefinition] ... 
      [, Primärschlüsseldefinition] 
      [, Fremdschlüsseldefinition 
      [,Fremdschlüsseldefinition] ... ] ) 
      [IN Tabellenspace]
      [INDEX IN Tabellenspace2]
      [LONG IN Tabellenspace3];





1 Bei einer OODB ist dies OQL und bei XML-Datenbanken in der Regel XQuery.

2 1981 erhielt er für seine Arbeit an relationalen Datenbanken den Turing-Award - eine Art Nobelpreis für Informatiker.





Copyright (c) Galileo Press GmbH 2004
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


[Galileo Computing]

Galileo Press GmbH, Gartenstraße 24, 53229 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, info@galileo-press.de