vorheriges KapitelInhaltsverzeichnisIndexInfoseitenächstes Kapitel



2


Abfragen:
Die Anweisung SELECT

Ziele

Hintergrund

Allgemeine Syntaxregeln

Die Grundbausteine der Datenabfrage: SELECT und FROM

Beispiele

Ihre erste Abfrage

Abfragen ohne Wiederholungen

Zusammenfassung

Fragen und Antworten

Workshop



Ziele

Willkommen zum zweiten Tag! Am Ende dieses Tages werden Sie in der Lage sein, ...



Hintergrund

Damit man die Leistung einer relationalen Datenbank nutzen kann, muß man mit der Datenbank kommunizieren. Am einfachsten wäre es, den Computer einzuschalten und ihm zu sagen: »Zeige mir alle linkshändigen, braunäugigen Bohnenzähler, die für diese Firma seit mindestens 10 Jahren arbeiten.« Ein derartiger Dialog mit dem Computer in natürlicher Sprache ist aber momentan noch Zukunftsmusik, so daß wir auf herkömmliche Formen der Kommunikation zurückgreifen müssen, um Informationen aus einer Datenbank abzurufen. Hier kommt das Q aus SQL ins Spiel, das bekanntlich für »Query« (Abfrage) steht.


Wie bereits am ersten Tag erwähnt, beschränkt sich Query im Kontext der Datenbanken nicht nur auf Fragen an die Datenbank. Es lassen sich auch Befehle der folgenden Art realisieren:


Eine Abfrage kann natürlich auch eine einfache Frage an die Datenbank sein. Um dieses leistungsfähige Werkzeug zu nutzen, muß man zunächst wissen, wie eine SQL-Abfrage zu formulieren ist.



Allgemeine Syntaxregeln

Auch wenn die Syntax in SQL ziemlich flexibel ist, sind wie in jeder Programmiersprache bestimmte Regeln zu befolgen. Das folgende Beispiel zeigt die grundlegende Syntax einer SQL-Auswahlanweisung. Achten Sie genau auf Groß-/Kleinschreibung, Leerzeichen und logische Trennung der Komponenten durch SQL-Schlüsselwörter.


SELECT NAME, STARTTERM, ENDTERM
FROM PRESIDENTS
WHERE NAME = 'LINCOLN';


In diesem Beispiel ist alles groß geschrieben, was aber nicht so sein muß. Die obige Abfrage läßt sich auch folgendermaßen schreiben:


select name, startterm, endterm
from presidents
where name = 'LINCOLN';


Beachten Sie, daß LINCOLN in beiden Beispielen durchgängig groß geschrieben ist. Die eigentlichen SQL-Anweisungen sind zwar nicht von der Groß-/Kleinschreibung abhängig, bei den Bezügen auf Daten in einer Datenbank ist die Schreibweise jedoch genau einzuhalten. Beispielsweise speichern viele Firmen die Daten in durchgängiger Großschreibung. Im obigen Beispiel nehmen wir an, daß die Spalte name den Inhalt in Großbuchstaben enthält. Demzufolge führt eine Suche nach 'Lincoln' in der Spalte name nicht zu den gewünschten Daten. Prüfen Sie Ihre Implementierung und/oder die Firmenvorschriften hinsichtlich der Groß-/Kleinschreibung.


In SQL sind Befehle nicht von der Groß-/Kleinschreibung abhängig.

Sehen Sie sich ein weiteres Beispiel an. Sind irgendwelche Besonderheiten bei der Aufteilung der Zeilen oder den Wortabständen zu beachten? Auch hier lautet die Antwort nein. Der folgende Code funktioniert ebenso:


select name, startterm, endterm from presidents where name = 'LINCOLN';


Allerdings lassen sich die Anweisungen besser lesen und in einem größeren Projekt leichter warten, wenn man bestimmte Konventionen für Abstände und Groß-/Kleinschreibung einhält.


Weiterhin ist das Semikolon am Ende des Ausdrucks von Bedeutung. Es teilt dem befehlszeilenorientierten SQL-Programm mit, daß die Abfrage vollständig ist.


Wenn das Wesentliche nicht in der Groß-/Kleinschreibung oder dem Format verborgen ist, welche Elemente sind dann überhaupt von Bedeutung? Die Antwort: Schlüsselwörter - das heißt, die als Teil der Syntax reservierten Wörter in SQL. (Je nach SQL-Anweisung kann ein Schlüsselwort entweder ein erforderliches Element der Anweisung oder ein optionales sein.) Die Schlüsselwörter im Beispiel lauten:


SELECT
FROM
WHERE


Dem Inhaltsverzeichnis können Sie entnehmen, welche Schlüsselwörter an welchen Tagen behandelt werden.



Die Grundbausteine der Datenabfrage: SELECT und FROM

In Ihrer SQL-Praxis werden Sie feststellen, daß Sie die Wörter SELECT und FROM weitaus häufiger als andere Wörter des SQL-Vokabulars eintippen. Diese Schlüsselwörter sind zwar nicht so aufregend wie CREATE oder so erbarmungslos wie DROP, aber sie sind unabdingbar für jede Konversation, die Sie mit Ihrem Computer beim Abrufen von Daten führen. Und hatten Sie nicht die Unmengen von Daten in Ihre teure Datenbank eingetippt, um diese Informationen später abrufen zu können?


Da die meisten Anweisungen mit SELECT beginnen, liegt es nahe, diese Anweisung zuallererst zu besprechen.


Die grundlegende SELECT-Anweisung könnte nicht einfacher sein. Allerdings funktioniert SELECT nicht allein. Wenn man einfach SELECT eingibt, erhält man die folgende Antwort:


SQL> SELECT;


SELECT
*
FEHLER in Zeile 1:
ORA-00936: Ausdruck fehlt


Das Sternchen unter der fehlerhaften Zeile zeigt an, wo Oracle8 den Fehler vermutet. Der fehlende Ausdruck bezieht sich auf die FROM-Klausel:


Die Anweisungen SELECT und FROM bilden gemeinsam das Sesam-öffne-dich für Ihre Datenbank.


An dieser Stelle ein Wort zu den Begriffen Schlüsselwort, Anweisung und Klausel. SQL-Schlüsselwörter beziehen sich auf einzelne SQL-Elemente wie SELECT und FROM. Eine Klausel ist ein Bestandteil einer SQL-Anweisung. Zum Beispiel stellt SELECT Spalte1, Spalte2, ... eine Klausel dar. SQL-Klauseln bilden im Zusammenhang eine vollständige SQL-Anweisung. Beispielsweise kann man eine SELECT-Klausel mit einer FROM-Klausel kombinieren, um eine SQL-Anweisung zu formulieren.

Jede Implementierung von SQL verfügt über eine eigenständige Art der Fehleranzeige. Zum Beispiel sagt Microsoft Query, daß die Abfrage nicht darstellbar ist, und überläßt Ihnen die Suche nach der Ursache. Interbase von Borland (ISQL) öffnet ein Dialogfeld mit dem Fehler. Das im obigen Beispiel verwendete Programm Personal Oracle8 zeigt eine Fehlernummer (so daß man im Handbuch die Einzelheiten nachschlagen kann) und eine kurze Erklärung des Problems.


Beispiele

Zunächst sehen wir uns die Datenbank an, die als Basis für die folgenden Beispiele dient. Anhand dieser Datenbank demonstrieren wir die grundlegenden Funktionen von SELECT und FROM. In der Praxis würde man als erstes die Datenbank mit den in Lektion 8 beschriebenen Techniken aufbauen. Wir gehen aber an dieser Stelle einfach davon aus, daß die Datenbank bereits existiert. Die Beispiele arbeiten mit der Tabelle SCHECKS, die Angaben zu Scheckbetrag und Empfänger enthält.


Die Tabelle SCHECKS sieht folgendermaßen aus:


SCHECK# ZAHL_EMPF BETRAG BEMERKUNGEN
--------- -------------------- --------- --------------------
1 Ma Bell 150 Schmuck
2 Reading R. R. 245,34 Zug nach Chicago
3 Ma Bell 200,32 Mobiltelefon
4 Energieversorgung 98 Gas
5 Joes Stale $ Dent 150 Lebensmittel
6 Bar 25 Nachtclub
7 Joans Gas 25,1 Gas



Ihre erste Abfrage

SQL> select * from schecks;


SCHECK# ZAHL_EMPF BETRAG BEMERKUNGEN
--------- -------------------- --------- --------------------
1 Ma Bell 150 Schmuck
2 Reading R. R. 245,34 Zug nach Chicago
3 Ma Bell 200,32 Mobiltelefon
4 Energieversorgung 98 Gas
5 Joes Stale $ Dent 150 Lebensmittel
6 Bar 25 Nachtclub
7 Joans Gas 25,1 Gas

7 Zeilen ausgewählt.


Die Ausgabe zeigt die im vorherigen Abschnitt vorgestellte Tabelle. Die Spalten 1 und 3 sind nach rechts ausgerichtet, die Spalten 2 und 4 nach links. Dieses Format folgt den Ausrichtungskonventionen, bei denen numerische Datentypen rechtsbündig und Zeichentypen linksbündig ausgerichtet werden. Datentypen behandelt Tag 9.

Das Sternchen (*) in select * weist die Datenbank an, alle Spalten der in der FROM-Klausel genannten Tabelle zurückzugeben. Die Reihenfolge der Spalten in der Ausgabe entspricht der Darstellung in der Datenbank.



Eine SQL-Anweisung abschließen

In manchen Implementierungen von SQL zeigt das Semikolon am Ende der Anweisung dem Interpreter an, daß die Eingabe der Anweisung abgeschlossen ist. Beispielsweise führt SQL*Plus von Oracle die Abfrage erst dann aus, wenn das Semikolon (oder ein Schrägstrich) gefunden wird. In anderen Implementierungen von SQL ist das Semikolon dagegen nicht vorgeschrieben. Beispielsweise erfordern Microsoft Query und ISQL von Borland kein Abschlußzeichen, da die Abfrage in einem Bearbeitungsfeld eingegeben und durch Betätigung einer Schaltfläche ausgeführt wird.



Die Anordnung der Spalten ändern

Das obige Beispiel einer SQL-Anweisung wählt mit dem Sternchen (*) alle Spalten aus einer Tabelle aus, wobei die Reihenfolge in der Ausgabe durch die Datenbank bestimmt wird. Um die Reihenfolge der Spalten festzulegen, kann man auch folgende Anweisung formulieren:


SQL> SELECT zahl_empf, bemerkungen, betrag, scheck# from schecks;


In der SELECT-Klausel ist jetzt jeder Spaltenname aufgeführt. Die Reihenfolge, in der die Spalten genannt sind, entspricht der Reihenfolge, in der sie in der Ausgabe erscheinen. Die Spaltennamen sind durch Kommas zu trennen, wobei aber zwischen dem letzten Spaltennamen und der darauffolgenden Klausel (in diesem Fall FROM) kein Komma stehen darf. Die Ausgabe sieht folgendermaßen aus:


ZAHL_EMPF BEMERKUNGEN BETRAG SCHECK#
-------------------- -------------------- --------- ---------
Ma Bell Schmuck 150 1
Reading R. R. Zug nach Chicago 245,34 2
Ma Bell Mobiltelefon 200,32 3
Energieversorgung Gas 98 4
Joes Stale $ Dent Lebensmittel 150 5
Bar Nachtclub 25 6
Joans Gas Gas 25,1 7

7 Zeilen ausgewählt.


Die gleiche Anweisung läßt sich auch wie folgt schreiben:


SELECT zahl_empf, bemerkungen, betrag, scheck#
FROM schecks;


Die FROM-Klausel steht hier in der zweiten Zeile. Die optische Gestaltung einer Anweisung hängt vom persönlichen Geschmack des Programmierers ab. Die Ausgabe sieht folgendermaßen aus:


ZAHL_EMPF BEMERKUNGEN BETRAG SCHECK#
-------------------- -------------------- --------- ---------
Ma Bell Schmuck 150 1
Reading R. R. Zug nach Chicago 245,34 2
Ma Bell Mobiltelefon 200,32 3
Energieversorgung Gas 98 4
Joes Stale $ Dent Lebensmittel 150 5
Bar Nachtclub 25 6
Joans Gas Gas 25,1 7

7 Zeilen ausgewählt.


Die Ausgabe ist mit der letzten inhaltlich gleich, da sich nur das Format der Anweisung geändert hat. Nachdem Sie nun auf die Reihenfolge der Spalten Einfluß nehmen können, können Sie auch angeben, welche Spalten in der Ausgabe erscheinen sollen.


Individuelle Spalten auswählen

Nehmen wir an, daß Sie nicht alle Spalten in der Datenbank sehen möchten. Mit der Anweisung SELECT * haben Sie ermittelt, welche Informationen überhaupt verfügbar sind. Jetzt konzentrieren Sie sich auf die Schecknummer und den Betrag. Dazu geben Sie folgende Anweisung ein:


SQL> SELECT SCHECK#, betrag FROM Schecks;


Diese Anweisung liefert


SCHECK# BETRAG
--------- ---------
1 150
2 245,34
3 200,32
4 98
5 150
6 25
7 25,1

7 Zeilen ausgewählt.


Jetzt erhalten Sie nur die Spalten, die Sie sehen möchten. Beachten Sie in dieser Abfrage die Groß-/Kleinschreibung. Wie bereits erwähnt, hat die Schreibweise keinen Einfluß auf das Ergebnis.

Wie lassen sich nun Informationen aus einer anderen Tabelle erhalten?



Verschiedene Tabellen auswählen

Nehmen wir eine Tabelle namens EINZAHLUNGEN mit der folgenden Struktur an:


EINZ# EINZAHLER BETRAG BEMERKUNGEN
--------- --------------- --------- --------------------
1 Reicher Onkel 200 Weihnachtsgeschenk
2 Arbeitgeber 1000 Zahltag Juni
3 Bank 500 Darlehen


Man paßt nun einfach die FROM-Klausel an die gewünschte Tabelle an und tippt die folgende Anweisung ein:


SQL> select * from einzahlungen


Als Ergebnis erhält man


EINZ# EINZAHLER BETRAG BEMERKUNGEN
--------- --------------- --------- --------------------
1 Reicher Onkel 200 Weihnachtsgeschenk
2 Arbeitgeber 1000 Zahltag Juni
3 Bank 500 Darlehen


Mit einer einfachen Änderung haben Sie eine neue Datenquelle angesprochen.


Abfragen ohne Wiederholungen

In der weiter oben eingeführten Tabelle SCHECKS sind Wiederholungen bestimmter Daten festzustellen. Holen wir uns zum Beispiel die Spalte BETRAG auf den Bildschirm:


SQL> select Betrag from Schecks;


Das Ergebnis lautet:


BETRAG
---------
150
245,34
200,32
98
150
25
25,1


Beachten Sie, daß der Betrag 150 wiederholt vorkommt. Wie läßt sich erreichen, daß gleiche Werte einer Spalte nur einmal in der Ausgabe erscheinen? Probieren Sie folgende Anweisung aus:


SQL> select DISTINCT betrag from schecks;


Das Ergebnis lautet:


BETRAG
---------
25
25,1
98
150
200,32
245,34

6 Zeilen ausgewählt.


Die Abfrage wählt dieses Mal nur sechs Zeilen aus. Das Schlüsselwort DISTINCT bewirkt, daß doppelt vorhandene Daten nur einmal erscheinen. Das Beispiel liefert also eine Zeile weniger zurück. In der grundlegenden SELECT-Anweisung ist das Schlüsselwort ALL (für alle Datensätze) implizit enthalten. Allerdings wird man dieses Schlüsselwort kaum vorfinden, da SELECT <Tabelle> und SELECT ALL <Tabelle> dasselbe Ergebnis liefern.

Probieren Sie das folgende Beispiel - zum ersten (und einzigen!) Mal in Ihrer SQL-Karriere - aus:


SQL> SELECT ALL BETRAG
2 FROM SCHECKS;


BETRAG
---------
150
245,34
200,32
98
150
25
25,1

7 Zeilen ausgewählt.


Diese Anweisung entspricht völlig der Version SELECT <Spalte>. Auf die überflüssigen Tastenanschläge kann man gut und gerne verzichten.


Zusammenfassung

Das Abrufen von Daten läßt sich in einer Abfrage mit den Schlüsselwörtern SELECT und FROM realisieren. Eine umfassende Ausgabe aller Spalten einer Tabelle erhält man mit der Anweisung SELECT *. Es lassen sich aber auch Spalten einzeln oder in einer abweichenden Reihenfolge abrufen. Das Schlüsselwort DISTINCT schränkt die Ausgabe ein, so daß alle vorkommenden Werte nur einmalig in einer Spalte erscheinen. Morgen lernen Sie, wie man Abfragen mit schärferen Kriterien formuliert.



Fragen und Antworten

Frage:

Woher kommen die Daten, und wie stelle ich eine Verbindung dazu her?

Antwort:

Die Daten wurden mit den in Lektion 8 beschriebenen Methoden erstellt. Die Datenbankverbindung hängt davon ab, wie man SQL einsetzt. Die hier dargestellte Befehlszeilenmethode findet man vor allem bei kommerziellen Datenbanken. Diese Datenbanken gehören traditionell zur Domäne der Mainframes oder Workstations, werden in jüngster Zeit aber auch auf den PC-Bereich übertragen.

Frage:

Wenn ich aber keine dieser Datenbanken verwende, wie kann ich dann SQL-Anweisungen ausführen?

Antwort:

Man kann SQL auch innerhalb einer Programmiersprache verwenden. Eingebettetes SQL ist normalerweise eine Spracherweiterung, die man vor allem in COBOL findet. Hier schreibt man SQL in das Programm und kompiliert die SQL-Anweisungen zusammen mit dem Programmcode. Microsoft hat ein vollständiges API entwickelt, mit dem der Programmierer SQL aus Visual Basic oder C++ heraus verwenden kann. Mit den von Sybase und Oracle angebotenen Bibliotheken kann man SQL ebenfalls in ein Programm einbauen. In Delphi von Borland ist SQL in speziellen Datenbankobjekten verkapselt. Die im Buch vorgestellten Konzepte sind in allen genannten Sprachen realisiert.


Workshop


Kontrollfragen

1. Geben die folgenden Anweisungen gleiche oder unterschiedliche Ausgaben zurück?


SELECT * FROM SCHECKS;
select * from schecks;


2. Die folgenden Abfragen funktionieren nicht. Warum nicht?


a. Select *
b. Select * from schecks
c. Select betrag name zahl_empf FROM schecks;


3. Welche der folgenden SQL-Anweisungen funktioniert?


a. select *
from schecks;
b. select * from schecks;
c. select * from schecks
/



Übungen

1. Schreiben Sie unter Verwendung der heute vorgestellten Tabelle SCHECKS eine Abfrage, um nur die Schecknummern (Spalte SCHECK#) und die Bemerkungen zurückzugeben.


2. Schreiben Sie die Abfrage aus Übung 1 so um, daß die Bemerkungen als erste Spalte in der Ergebnismenge erscheinen.


3. Schreiben Sie auf der Grundlage der Tabelle SCHECKS eine Abfrage, die alle eindeutig unterscheidbaren Bemerkungen zurückgibt.



Ein Imprint des Markt&Technik Buch- und Software-Verlag GmbH.
Elektronische Fassung des Titels: SQL in 21 Tagen, ISBN: 3-8272-2020-3


vorheriges KapitelTop Of PageInhaltsverzeichnisIndexInfoseitenächstes Kapitel