Oracle9i - Hajer / Loney / Koch, ReadingSample - Beck-Shop

Werbung
Oracle9i
Die umfassende Referenz
von
Hans Hajer, Kevin Loney, George Koch
1. Auflage
Oracle9i – Hajer / Loney / Koch
schnell und portofrei erhältlich bei beck-shop.de DIE FACHBUCHHANDLUNG
Hanser München 2003
Verlag C.H. Beck im Internet:
www.beck.de
ISBN 978 3 446 22170 3
Inhaltsverzeichnis: Oracle9i – Hajer / Loney / Koch
CARL HANSER VERLAG
Kevin Loney, George Koch
Oracle9i Die umfassende Referenz
3-446-22170-0
www.hanser.de
3
3
Grundlegende Sprachelemente
von SQL
Mit Hilfe der Structured Query Language bzw. SQL teilen Sie Oracle mit, welche Informationen Sie auswählen (select), einfügen (insert), aktualisieren (update) oder löschen (delete) möchten. Tatsächlich handelt es sich bei diesen Verben um die vier
wichtigsten Wörter, mit denen Sie Oracle Anweisungen erteilen können. Seit Oracle9i
können Sie inserts und updates mit einem einzigen Befehl ausführen: merge.
In Kapitel 1 wurde Ihnen die Bedeutung des Begriffs „relational“ erklärt, wie Tabellen
in Spalten und Zeilen organisiert sind und wie man Oracle instruiert, bestimmte Spalten aus einer Tabelle auszuwählen und die Informationen zeilenweise anzuzeigen. In
diesem und den folgenden Kapiteln erfahren Sie, wie man diese Aktionen für die anderen Datentypen ausführt, die von Oracle unterstützt werden. Darüber hinaus erlernen
Sie auch die Interaktion mit SQL*PLUS, einem leistungsfähigen Oracle-Produkt: Das
Programm überprüft die Richtigkeit der Eingabe, übergibt diese an Oracle und verändert die von Oracle erhaltenen Antworten nach den von Ihnen erhaltenen Vorgaben.
Die Anwendung interagiert mit Ihnen, was bedeutet, dass Sie mit der Applikation „sprechen“ können und sie „antwortet“ Ihnen. Sie können Anweisungen geben, die präzise
befolgt werden. Sollte es Verständigungsprobleme geben, wird Ihnen das mitgeteilt.
Auf den ersten Blick mag es etwas verwirrend sein, dass man zuerst die Funktionsweise
von SQL*PLUS und Oracle kennen lernen muss. Hinzu kommt noch, dass die OracleFehlermeldungen über SQL*PLUS übergeben werden. Aber im Verlauf des Buchs
werden Sie merken, wo die eigentlichen Unterschiede liegen. Für den Anfang können
Sie SQL*PLUS als eine Art Assistenten betrachten, der Ihre Anweisungen befolgt und
Sie bei der schnelleren Erledigung Ihrer Arbeiten unterstützt. Sie interagieren mit diesem Assistenten über die Tastatur.
Wenn Sie die in diesem und den folgenden Kapiteln aufgeführten Beispiele ausführen,
sollten die Antworten der Oracle- und SQL*PLUS-Programme wie die dargestellten
48
3
Grundlegende Sprachelemente von SQL
Antworten aussehen. Sie müssen auf jeden Fall sicherstellen, dass die in diesem Buch
verwendeten Tabellen auch in Ihre Oracle-Datenbank geladen wurden. Sämtliche Definitionen und die dazugehörigen Beispieldaten finden Sie auf der beiliegenden CD.
Wir gehen davon aus, dass dieser Vorgang abgeschlossen ist. Rufen Sie SQL*PLUS auf
und beginnen Sie mit der Arbeit:
sqlplus
(Falls Sie SQL*PLUS auf einem Client-Rechner starten möchten, wählen Sie die
Menüoption für die Oracle-Software, gehen ins Menü Application Development und
selektieren das Programm SQL*Plus). Damit starten Sie SQLPLUS. (Beachten Sie,
dass Sie den * in der Mitte des offiziellen Produktnamens nicht eingeben, ab sofort
schreiben wir SQLPLUS ohne Sternchen). Da Oracle genauestens darauf achtet, wer
auf die gespeicherten Daten zugreifen kann, benötigt man für die Verbindung mit
Oracle immer eine Benutzerkennung und ein Passwort. Oracle zeigt beim Start eine
Copyright-Nachricht an und fragt die Benutzerkennung plus Passwort ab. Um auf die
in diesem Buch beschriebenen Tabellen zugreifen zu können, geben Sie sowohl bei der
Benutzerkennung als auch beim Passwort practice ein. Von SQLPLUS erhalten Sie daraufhin die Meldung, dass Sie mit Oracle verbunden sind. Sie sehen folgende Eingabeaufforderung:
SQL>
Jetzt befinden Sie sich in SQLPLUS, und das Programm wartet auf Ihre Anweisungen.
Scheitert der Befehl, kann dafür einer der folgenden Gründe verantwortlich sein: Oracle ist nicht in Ihren Pfad eingebunden, Sie besitzen nicht die Berechtigung zur Ausführung von SQLPLUS, oder Oracle wurde auf Ihrem Rechner nicht richtig installiert.
Wenn Sie folgende Meldung erhalten:
ERROR: ORA-1017: Benutzername/Kennwort ungültig; Anmeldung abgewiesen
bedeutet dies, dass Sie entweder den Benutzernamen oder das Passwort falsch eingegeben haben, oder dass Ihre Kennung noch nicht eingerichtet wurde. Nach drei erfolglosen Versuchen bricht SQLPLUS die Anmeldungen mit folgender Meldung ab:
Kann nach drei Versuchen keine Verbindung zu Oracle aufbauen, SQL*Plus
wird beendet
Erhalten Sie diese Meldung, informieren Sie den Systemadministrator. Nehmen wir
einmal an, dass alles in Ordnung ist und die Eingabeaufforderung korrekt angezeigt
wird. Dann steht der Arbeit mit SQLPLUS nichts mehr im Wege.
Wenn Sie die Arbeit mit SQLPLUS beenden und das Programm verlassen möchten,
geben Sie diesen Befehl ein:
quit
49
3.1 Die Formate
3.1
Die Formate
Zuerst einige Anmerkungen zu den Formaten. SQLPLUS kümmert sich nicht darum,
ob Sie die Anweisungen in Groß- oder Kleinbuchstaben eingeben. Der Befehl
SeLeCt feaTURE, section, PAGE FROM newsPaPeR;
führt zum gleichen Ergebnis wie
select Feature, Section, Page from NEWSPAPER;
Die Groß- und Kleinschreibung spielt nur dann eine Rolle, wenn Oracle Werte innerhalb der Datenbank auf Gleichheit überprüft. Wenn Sie Oracle anweisen, nach einer
Zeile zu suchen, in der Section = ’f’ ist, aber Section ist gleich ’F’, findet Oracle das Gesuchte unter Umständen nicht (da f und F nicht identisch sind). Andernfalls ist die
Groß- und Kleinschreibung völlig irrelevant. (Nebenbei bemerkt, der hier verwendete
Buchstabe ’F’ wird als Literal bezeichnet. Das bedeutet, Sie möchten Section nach dem
Buchstaben ’F’ und nicht nach einer Spalte namens F durchsuchen lassen. Die einfachen Anführungszeichen auf beiden Seiten des Buchstabens teilen Oracle mit, dass es
sich um ein Literal und nicht um einen Spaltennamen handelt.)
Damit der Text leichter lesbar ist, werden in diesem Buch einige Konventionen eingehalten:
■ select, from, where, order by, having und group by werden immer in Kleinbuchstaben und fett gedruckt dargestellt.
■ Auch die SQLPLUS-Befehle werden immer klein und fett gedruckt dargestellt: column, set, save, ttitle usw.
■ IN, BETWEEN, UPPER und andere SQL-Operatoren und -Funktionen werden in
Großbuchstaben und fett gedruckt dargestellt.
■ Spaltennamen werden am Anfang großgeschrieben: Feature, EastWest, Longitude
usw.
■ Tabellennamen werden durchgängig großgeschrieben: NEWSPAPER,
WEATHER, LOCATION usw.
3.2
Die NEWSPAPER-Tabelle anlegen
Die Beispiele in diesem Buch basieren auf den Tabellen, die von den Skripten aus dem
Web (http://www.hanser.de/buch/2003/3-446-22170-0.htm) angelegt werden. Jede
Tabelle wird mit dem Befehl create table eingerichtet, der die Namen der Spalten in
der Tabelle und die dazugehörigen Charakteristiken definiert. Nachfolgend finden Sie
den create table-Befehl für die NEWSPAPER-Tabelle, die in zahlreichen Beispielen
verwendet wird:
50
3
Create table
Feature
Section
Page
);
Grundlegende Sprachelemente von SQL
NEWSPAPER (
VARCHAR2(15) not null,
CHAR(1),
NUMBER
In späteren Kapiteln erfahren Sie, wie die Klausel dieses Befehls zu interpretieren ist.
Für den Moment soll Folgendes genügen: „Lege eine Tabelle namens NEWSPAPER
ein. Sie besteht aus den drei Spalten namens Feature (einer Spalte mit variabler Länge
und alphanumerischem Inhalt), Section (einer Spalte fixer Länge und alphanumerischem Inhalt) und Page (einer numerischen Spalte). Die Werte in der Feature-Spalte
können bis zu 15 Zeichen lang sein, und jede Zeile muss für Feature mindestens einen
Wert enthalten. Die Werte für Section sind alle 1 Zeichen lang.
In den folgenden Kapiteln werden Sie erfahren, wie man diesen einfachen Befehl erweitert und Integritätsregeln, Indizes und storage-Klauseln einfügt. Jetzt halten wir die
NEWSPAPER-Tabelle betont einfach, damit die Beispiele SQL fokussieren können
3.3
Mit SQL Daten aus Tabellen selektieren
Tabelle 3-1 zeigt die Rubriken einer Zeitung.
Tabelle 3-1: Die Rubriken einer Zeitung.
Beitrag (Feature)
Rubrik (Section)
Seite (Page)
Births
F
7
Bridge
B
2
Business
E
1
Classified
F
8
Comics
C
4
Doctor Is In
F
6
Editorials
A
12
Modern Life
B
1
Movies
B
4
National News
A
1
Obituaries
F
6
51
3.3 Mit SQL Daten aus Tabellen selektieren
Tabelle 3-1: Die Rubriken einer Zeitung. (Fortsetzung)
Beitrag (Feature)
Rubrik (Section)
Seite (Page)
Sports
D
1
Television
B
7
Weather
C
2
Falls es sich um eine Oracle-Tabelle handelt, würde SQL nach der Eingabe des folgenden Befehls dieses Listing ausgeben:
select Feature, Section, Page from NEWSPAPER;
FEATURE
--------------National News
Sports
Editorials
Business
Weather
Television
Births
Classified
Doctor Is In
Modern Life
Comics
Movies
Bridge
Obituaries
S
PAGE
- ---------A
1
D
1
A
12
E
1
C
2
B
7
F
7
F
8
F
6
B
1
C
4
B
4
B
2
F
6
14 rows selected.
Wo liegen nun die Unterschiede zwischen der Tabelle, die Sie anlegten, und der Darstellung in Tabelle 3-1? Beide Tabellen enthalten dieselben Informationen. Der Unterschied ist nur das Format. So sind z.B. die Überschriften über den Spalten unterschiedlich.
In der Spalte namens Section wird als Überschrift nur der Buchstabe 'S' angezeigt, und
obwohl Sie bei der Abfrage Groß- und Kleinbuchstaben verwendet haben,
select Feature, Section, Page from NEWSPAPER;
werden sämtliche Spaltenüberschriften in Großbuchstaben dargestellt.
Diese Änderungen sind das Ergebnis der Annahmen, die SQLPLUS zur Darstellung
der Information trifft. Sie können diese Einstellungen zwar ändern, doch solange Sie
keine anderen Vorgaben machen, ändert SQLPLUS die von Ihnen gemachten Eingaben wie folgt:
52
3
Grundlegende Sprachelemente von SQL
■ Die Spaltenüberschriften werden in Großbuchstaben angezeigt.
■ Die Spalten sind nur so breit, wie sie in Oracle definiert wurden.
■ Wenn die Spaltenüberschrift eine Funktion ist, werden sämtliche Leerstellen unterdrückt (dieses Verhalten wird in Kapitel 7 besprochen).
Der erste Punkt ist offensichtlich. Die Spaltennamen werden in Großbuchstaben umgewandelt. Beim zweiten Punkt können durchaus die ersten Fragen auftauchen. Wie
sind die Spalten in Oracle definiert? Um das herauszufinden, stellen Sie Oracle mit
SQLPLUS eine einfache Abfrage:
describe NEWSPAPER
Name
Null?
------------------------------- -------FEATURE
NOT NULL
SECTION
PAGE
Type
------VARCHAR2(15
CHAR(1)
NUMBER
Dieses Listing ist eine beschreibende Tabelle, in der sämtliche Spalten und deren Definitionen für die NEWSPAPER-Tabelle angezeigt werden. Der describe-Befehl funktioniert bei allen Tabellen.
Die erste Spalte führt die Namen der Spalten auf, die innerhalb der Tabelle beschrieben sind.
Die zweite Spalte, Null?, stellt eine Regel für die Spalte dar, deren Name auf der linken
Seite steht. Wurde diese Spalte mit der Eingabe NOT NULL angelegt, weiß Oracle, dass
niemand irgendwelche Informationen eingeben darf, wenn die Feature-Spalte leer geblieben ist (NULL bedeutet leer). Natürlich hätte es sich in einer Tabelle wie NEWSPAPER vielleicht gelohnt, die gleiche Regel auf alle drei Spalten anzuwenden. Welchen
Sinn hat es, den Titel eines Beitrags zu kennen, wenn man nicht weiß, unter welcher Rubrik und auf welcher Seite er zu finden ist? Aber in diesem Beispiel wurde diese spezielle
Regel nur bei Feature eingesetzt.
Da bei Section und Page die NOT NULL-Anweisung fehlt, dürfen diese Spalten in der
NEWSPAPER-Tabelle leer bleiben.
Die dritte Spalte (Type) sagt etwas über die Natur jeder einzelnen Spalte aus. Feature
ist eine VARCHAR2 (variable length character)-Spalte, die bis zu 15 Zeichen (Buchstaben, Zahlen, Symbole oder Leerzeichen) aufnehmen kann.
Auch Section ist eine Spalte, in der Zeichen abgestellt werden können, wobei sie allerdings nur ein Zeichen lang ist! Beim Anlegen der Tabelle wusste der Anwender bereits,
dass die Rubriken in der lokalen Zeitung lediglich einen Buchstaben lang sind. Deshalb
wurde die Spalte nur so groß wie nötig definiert. Wenn SQLPLUS die Ergebnisse der
folgenden Abfrage darstellt
3.3 Mit SQL Daten aus Tabellen selektieren
53
select Feature, Section, Page from NEWSPAPER;
hat das Programm über Oracle erfahren, dass Section maximal ein Zeichen lang ist.
SQLPLUS geht davon aus, dass Sie zur Anzeige dieser Spalte nicht mehr Platz verschwenden möchten, und zeigt infolgedessen nur ein 'S' an.
Die dritte Spalte in der NEWSPAPER-Tabelle ist Page, die aus einer Zahl besteht. Wie
Sie sicher bemerkt haben, ist die Page-Spalte in der NEWSPAPER-Tabelle 10 Stellen
breit, obwohl es keine Seitenzahl gibt, die mehr als zwei Zahlen aufweist. Der Grund
dafür ist, dass Zahlen üblicherweise ohne maximale Länge definiert werden, deshalb
zeigt SQLPLUS anfangs das Maximum an.
Vielleicht haben Sie auch bemerkt, dass die Überschrift der einzigen Spalte, die nur aus
Zahlen besteht, rechtsbündig formatiert ist. In diesem Fall steht die Überschrift auf der
rechten Seite der Spalte, während die restlichen Überschriften jeweils linksbündig angeordnet sind. Diese Ausrichtung der Spaltenüberschriften ist bei SQLPLUS der Standard. Diese Einstellungen können Sie später (siehe Kapitel 6) nach Belieben verändern.
Schließlich teilt Ihnen Oracle noch mit, wie viele Spalten in der NEWSPAPER-Tabelle
gefunden wurden. (Beachten Sie am Ende der Anzeige die Meldung „14 rows selected“. Diese Meldung bezeichnet man als Feedback. Soll SQLPLUS diese feedback-Option ausschalten, geben Sie folgenden Befehl ein:
set feedback off
Alternativ können Sie eine minimale Anzahl von Zeilen angeben, die vor der Ausgabe
eines Feedbacks vorhanden sein sollen:
set feedback 25
Mit diesem Befehl teilen Sie Oracle mit, dass Sie keine Meldung erhalten möchten, solange nicht mindestens 25 Zeilen vorhanden sind. Geben Sie SQLPLUS keine diesbezüglichen Anweisungen, ist feedback standardmäßig auf 6 eingestellt.
Der set-Befehl ist ein SQLPLUS-Befehl, über den man das Verhalten von SQLPLUS
steuert. In SQLPLUS gibt es eine Reihe von Optionen, die Sie vorgeben können. Einige
dieser Möglichkeiten werden Ihnen in diesem und den folgenden Kapiteln vorgestellt.
Eine vollständige Auflistung aller Optionen finden Sie in der Alphabetischen Referenz.
Für den set-Befehl gibt es ein Gegenstück namens show, mit dem Sie die an SQLPLUS
gegebenen Anweisungen nachvollziehen können. Die Einstellungen für feedback prüfen Sie beispielsweise wie folgt:
show feedback
SQLPLUS antwortet mit:
FEEDBACK ON for 25 or more rows
54
3
Grundlegende Sprachelemente von SQL
Auch die Breite der Darstellung lässt sich mit dem set-Befehl ändern. Die entsprechende Anweisung sieht wie folgt aus:
show numwidth
SQLPLUS antwortet mit:
numwidth 9
Da 9 Stellen für die Anzeige einer Seitenzahl, die niemals länger als zwei Ziffern ist, relativ viel sind, schränken Sie die Anzeige mit folgender Anweisung ein:
set numwidth 5
Diese Anweisung bedeutet jedoch auch, dass alle Zahlenspalten nur fünf Ziffern lang
sind. Wenn Sie wissen, dass manche Zahlen länger sind, muss dieser Wert natürlich
höher liegen. In Kapitel 5 erfahren Sie, wie man die Anzeige der einzelnen Spalten individuell gestaltet. In der Darstellung lassen sich auch individuelle Spalten setzen.
Mehr dazu in Kapitel 6.
3.4
select, from, where und order by
Zur Auswahl von Informationen aus einer Oracle-Tabelle verwenden Sie vier wichtige
Schlüsselwörter: select, from, where und order by. select und from setzen Sie grundsätzlich in jeder Oracle-Abfrage ein.
Das Schlüsselwort select teilt Oracle mit, welche Spalten Sie auswählen möchten, während Sie über from den/die Namen der Tabellen definieren, in denen sich diese Spalten
befinden. Das Beispiel mit der NEWSPAPER-Tabelle zeigte, wie diese Schlüsselwörter
eingesetzt werden. In der ersten Zeile gaben Sie nach jedem Spaltennamen, mit Ausnahme des letzten, ein Komma ein. Sie haben sicher bemerkt, dass sich eine korrekt
eingegebene SQL-Abfrage fast wie ein englischer Satz liest. Eine Abfrage in SQLPLUS
wird stets mit einem Semikolon (auch SQL-Terminator oder SQL-Abschlusszeichen genannt) abgeschlossen. Das Schlüsselwort where teilt Oracle mit, welche Qualifier in
die von Ihnen ausgewählten Informationen einzufügen sind. Ein Beispiel:
select Feature, Section, Page from NEWSPAPER
where Section = ’F’;
FEATURE
--------------Births
Classified
Obituaries
Doctor Is In
S PAGE
- ----F
7
F
8
F
6
F
6
3.4 select, from, where und order by
55
Oracle überprüft vor der Rückgabe jede Zeile in der NEWSPAPER-Tabelle. Die Zeilen,
bei denen in der Section-Spalte kein 'F' steht, werden übergangen, während die anderen zurückgeliefert und von SQLPLUS angezeigt werden.
Über order by teilen Sie Oracle mit, wie die zurückgegebenen Informationen zu sortieren sind. Die Reihenfolge, in der die einzelnen Elemente innerhalb der Anfrage aufgeführt werden, bleibt Ihnen überlassen. Sehen Sie sich dazu die folgenden Beispiele
an:
select Feature, Section, Page from NEWSPAPER
where Section = ’F’
order by Feature;
FEATURE
--------------Births
Classified
Doctor Is In
Obituaries
S PAGE
- ----F
7
F
8
F
6
F
6
Bei der Sortierung über Page wird die Reihenfolge fast umgekehrt:
select Feature, Section, Page from NEWSPAPER
where Section = ’F’
order by Page;
FEATURE
--------------Obituaries
Doctor Is In
Births
Classified
S PAGE
- ----F
6
F
6
F
7
F
8
Im nächsten Beispiel werden die Features über Page sortiert (im letzten Listing wurden
nur die Inhalte über Page sortiert). Durch die Anordnung über Feature steht der Eintrag „Doctor Is In“ jetzt vor „Obituaries“.
select Feature, Section, Page from NEWSPAPER
where Section = ’F’
order by Page, Feature;
FEATURE
--------------Doctor Is In
Obituaries
Births
Classified
S PAGE
- ----F
6
F
6
F
7
F
8
56
3
Grundlegende Sprachelemente von SQL
Mit order by lässt sich die normale Sortierfolge auch umkehren:
select Feature, Section, Page from NEWSPAPER
where Section = ’F’
order by Page desc, Feature;
FEATURE
--------------Classified
Births
Doctor Is In
Obituaries
S PAGE
- ----F
8
F
7
F
6
F
6
Das Schlüsselwort desc steht für absteigend. Da es dem Wort „Page“ in der order byZeile folgt, werden die Seitenzahlen in absteigender Reihenfolge angezeigt. Das gleiche
Ergebnis könnte man auch in der Feature-Spalte erreichen, wenn die order by-Zeile
dem Wort „Feature“ folgen würde.
Beachten Sie, dass die Wörter, die select, from, where und order by folgen, jeweils anders strukturiert werden. Diese Gruppen mit Wörtern und Schlüsselwörtern werden
Klauseln genannt. Beispiele dazu finden Sie in Abbildung 3-1.
Select Feature, Section, Page
<--select clause
from NEWSPAPER
<--from clause
where Section = ‘F'
<--where clause
Abbildung 3-1: Klauseln.
3.5
Logik und Wert
Genau wie die order by-Klausel besteht auch die where-Klausel aus verschiedenen
Elementen, wobei das Ganze bei where sehr viel ausgefeilter ist. Durch die Verwendung von logischen Instruktionen können Sie genau steuern, was Sie von Oracle zurückerhalten. Die Instruktionen werden über mathematische Symbole, so genannte
logische Operatoren, dargestellt. Nachfolgend werden diese Operatoren kurz erklärt.
Eine vollständige Übersicht finden Sie in der Alphabetischen Referenz.
Nachfolgend ein einfaches Beispiel für Logik und Wert, wobei die Werte in der PageSpalte daraufhin überprüft werden, ob sie gleich 6 sind. Jede Zeile, in der diese Bedingung zutrifft, wird an Sie zurückgegeben. Alle anderen Zeilen werden einfach übersprungen (die Zeilen, bei denen Page = 6 nicht zutrifft).
57
3.5 Logik und Wert
select Feature, Section, Page
from NEWSPAPER
where Page = 6;
FEATURE
--------------Obituaries
Doctor Is In
S PAGE
- ----F
6
F
6
Das Gleichheitszeichen ist deshalb ein logischer Operator, weil es einen logischen Vergleich der Werte durchführt, die sich auf beiden Seiten des Operators befinden – in
unserem Fall von Page und dem Wert 6 – und überprüft, ob die Werte gleich sind.
In diesem Beispiel wurden die zu prüfenden Werte nicht in Anführungszeichen gesetzt, da die Spalte, die den zu vergleichenden Wert enthält (die Page-Spalte) als Datentyp NUMBER definiert ist. Numerische Werte benötigen für den Vergleich keine
Anführungszeichen.
3.5.1
Test von Einzelwerten
Zum Test einzelner Werte stehen Ihnen verschiedene logische Operatoren zur Verfügung (siehe Überschrift „Logische Tests auf einzelne Werte“). Sehen Sie sich die Beispiele in dieser Liste an. Sie funktionieren alle ähnlich und können nach Belieben
kombiniert werden. Dennoch sind bestimmte Regeln zu beachten.
Equal, Greater Than, Less Than, Not Equal
Logische Tests können Werte miteinander vergleichen, sowohl auf Gleichheit als auch
auf einen relativen Wert. Hier ein einfaches Beispiel, bei dem alle Sections daraufhin
geprüft werden, ob sie gleich B sind:
select Feature, Section, Page
from NEWSPAPER
where Section = ’B’;
FEATURE
--------------Television
Modern Life
Movies
Bridge
S PAGE
- ----B
7
B
1
B
4
B
2
58
3
Grundlegende Sprachelemente von SQL
Logische Tests auf einzelne Werte
Die folgenden Operatoren funktionieren alle mit Buchstaben, Zahlen, Spalten oder Literalen.
Gleich, größer als, kleiner als, ungleich
Page=
6
Page ist gleich 6
Page>
6
Page ist größer als 6
Page>= 6
Page ist größer oder gleich 6
Page<
Page ist kleiner als 6
6
Page<= 6
Page ist kleiner oder gleich 6
Page!=
6
Page ist ungleich 6
Page^= 6
Page ist ungleich 6
Page<> 6
Page ist ungleich 6
Da bei einigen Tastaturen entweder das Ausrufezeichen (!) oder das Caret-Zeichen
(^) fehlt, stellt Oracle für die Darstellung des Ungleich-Operators drei Möglichkeiten
zur Verfügung. Die letzte Alternative (<>) kann deshalb als Ungleich-Operator verwendet werden, weil nur Zahlen zugelassen werden, die größer oder kleiner (wie in
unserem Beispiel) als 6 sind. Die 6 selbst ist nicht zugelassen.
LIKE
Feature LIKE ’Mo%’
Feature beginnt mit den Buchstaben Mo
Feature LIKE ’_ _ I%’
Feature hat in der dritten Position ein I
Feature LIKE ’%o%o%’
Feature enthält zwei O’s
LIKE führt einen Mustervergleich durch. Ein Unterstrich (_) repräsentiert eine Stelle.
Ein Prozentzeichen (%) repräsentiert beliebig viele Stellen oder Zeichen.
IS NULL, IS NOT NULL
Precipitation IS NULL
„Präzipitation ist unbekannt“
Precipitation IS NOT NULL „Präzipitation ist bekannt“
NULL überprüft, ob in einer Zeile oder Spalte Daten vorhanden sind. Ist eine Spalte
vollkommen leer, wird sie als NULL bezeichnet. Im Zusammenhang mit NULL und
NOT NULL ist das Wort IS einzusetzen: Gleichheitszeichen, „größer als“ oder „kleiner als“ funktionieren in diesem Falle nicht.
Nachfolgend ein Test für alle Seiten, die größer als 4 sind:
select Feature, Section, Page
from NEWSPAPER
where Page > 4;
59
3.5 Logik und Wert
FEATURE
--------------Editorials
Television
Births
Classified
Obituaries
Doctor Is In
S PAGE
- ----A
12
B
7
F
7
F
8
F
6
F
6
Hier werden alle Sections daraufhin geprüft, ob sie größer als B sind (im Alphabet hinter B kommen):
select Feature, Section, Page
from NEWSPAPER
where Section > ’B’;
FEATURE
--------------Sports
Business
Weather
Births
Classified
Comics
Obituaries
Doctor Is In
S PAGE
- ----D
1
E
1
C
2
F
7
F
8
C
4
F
6
F
6
Natürlich können Sie auch einen Test auf „kleiner als“ (in diesem Fall 8) durchführen:
select Feature, Section, Page
from NEWSPAPER
where Page < 8;
FEATURE
--------------National News
Sports
Business
Weather
Television
Births
Modern Life
Comics
Movies
Bridge
Obituaries
Doctor Is In
S
PAGE
- ---------A
1
D
1
E
1
C
2
B
7
F
7
B
1
C
4
B
4
B
2
F
6
F
6
Neben der Gleichheit können Sie auch auf Ungleichheit prüfen:
60
3
Grundlegende Sprachelemente von SQL
select Feature, Section, Page
from NEWSPAPER
where Page <> 1;
FEATURE
--------------Editorials
Weather
Television
Births
Classified
Comics
Movies
Bridge
Obituaries
Doctor Is In
S
PAGE
- ---------A
12
C
2
B
7
F
7
F
8
C
4
B
4
B
2
F
6
F
6
Hinweis:
Beim Einsatz der Operatoren „größer als“ oder“ kleiner als“ für den
Vergleich von Zahlen in Spalten, deren Inhalte als Zeichen definiert
sind, ist Vorsicht geboten. Alle Werte in den VARCHAR2- und
CHAR-Spalten werden beim Vergleich als Zeichen behandelt.
Deshalb werden die in solchen Spalten abgestellten Zahlen wie
alphanumerische Strings behandelt. Wenn der Datentyp der Spalte
NUMBER ist, dann ist 12 größer als 9. Falls Inhalte der gleichen
Spalte als Zeichen definiert sind, ist 9 größer als 12, weil das Zeichen
'9' größer als das Zeichen '1' ist.
3.5.2
LIKE
Eine der leistungsfähigsten logischen SQL-Funktionen ist der Operator LIKE, der für
den Vergleich von Mustern eingesetzt wird. LIKE kann sämtliche Zeilen innerhalb einer Datenbank auf Werte durchsuchen, die wie das beschriebene Muster aussehen.
Zur Definition der gewünschten Übereinstimmung stehen Ihnen zwei Sonderzeichen
zur Verfügung: ein Prozentzeichen wird als Wildcard und ein Unterstrich als Positionsmarker bezeichnet. Um innerhalb der Feature-Spalte nach den Einträgen zu suchen,
die mit den Buchstaben 'Mo' beginnen, verwenden Sie folgende Abfrage:
select Feature, Section, Page from NEWSPAPER
where Feature LIKE ’Mo%’;
FEATURE
--------------Modern Life
Movies
S
PAGE
- ---------B
1
B
4
61
3.5 Logik und Wert
Das Prozentzeichen (%) bedeutet, dass alles akzeptiert wird: ein Zeichen, hundert Zeichen oder keine Zeichen. Wenn die ersten Buchstaben ’Mo’ sind, findet LIKE den entsprechenden Eintrag. Falls man als Suchbedingung stattdessen ’MO%’ verwendet,
liefert Oracle keinen Wert zurück, da beim Vergleich auch die Groß- und Kleinschreibung beachtet wird. Wenn Sie alle Einträge in der Feature-Spalte finden möchten, bei
denen der dritte Buchstabe ein 'i' ist, und es unwichtig ist, wie die beiden vorausgehenden bzw. nachfolgenden Zeichen aussehen, können Sie über zwei Unterstriche (_ _)
festlegen, dass in diesen Positionen jedes Zeichen akzeptiert wird. Wichtig ist, dass auf
der dritten Position ein kleines 'i' steht: das nachgestellte Prozentzeichen besagt, dass
alles OK ist.
select Feature, Section, Page from NEWSPAPER
where Feature LIKE ’__i%’;
FEATURE
--------------Editorials
Bridge
Obituaries
S
PAGE
- ---------A
12
B
2
F
6
Es können auch mehrere Prozentzeichen verwendet werden. Um im Feature-Titel alle
Wörter zu finden, in denen irgendwo zwei kleine 'o's stehen, werden drei Prozentzeichen verwendet:
select Feature, Section, Page from NEWSPAPER
where Feature LIKE ’%o%o%’;
FEATURE
S
PAGE
--------------- - ---------Doctor Is In
F
6
Die folgende Abfrage ähnelt der letzten, mit dem Unterschied, dass in diesem Fall nach
zwei kleinen 'i's gesucht wird:
select Feature, Section, Page from NEWSPAPER
where Feature LIKE ’%i%i%’;
FEATURE
--------------Editorials
Television
Classified
Obituaries
S
PAGE
- ---------A
12
B
7
F
8
F
6
Dieses Leistungsmerkmal für den Mustervergleich ist ein wichtiges Element zur benutzerfreundlichen Gestaltung einer Anwendung. Man vereinfacht damit die Suche
nach Namen, Adressen, Produkten und anderen Dingen, an die man sich zumindest
bruchstückhaft erinnern kann.
62
3
Grundlegende Sprachelemente von SQL
NULL und NOT NULL
Die NEWSPAPER-Tabelle besitzt keine Spalten, die NULL sind, obwohl die Anzeige
über describe zeigt, dass dies sehr wohl möglich wäre. Die nachfolgende COMFORTTabelle enthält neben anderen Daten die Niederschlagsmengen für San Francisco, California, und Keene, New Hampshire, an einigen Tagen im Jahr 2001.
select City, SampleDate, Precipitation
from COMFORT;
CITY
------------SAN FRANCISCO
SAN FRANCISCO
SAN FRANCISCO
SAN FRANCISCO
KEENE
KEENE
KEENE
KEENE
SAMPLEDAT PRECIPITATION
--------- ------------21-MAR-01
.5
22-JUN-01
.1
23-SEP-01
.1
22-DEC-01
2.3
21-MAR-01
4.4
22-JUN-01
1.3
23-SEP-01
22-DEC-01
3.9
Mit der folgenden Abfrage finden Sie die Städte und Daten, bei denen keine Messungen vorgenommen wurden:
select City, SampleDate, Precipitation
from COMFORT
where Precipitation IS NULL;
CITY
SAMPLEDAT PRECIPITATION
------------- --------- ------------KEENE
23-SEP-01
IS NULL bedeutet im Grunde genommen, dass Oracle nach Elementen suchen soll,
bei denen keine Daten vorhanden sind. Sie wissen nicht, ob der Wert für diesen Tag 0,
1 oder 5 Inches sein soll. Deshalb wird der Wert in dieser Spalte nicht auf 0 gesetzt,
sondern sie bleibt einfach leer. Über NOT finden Sie auch die Städte und Datumsangaben, für die irgendwelche Daten vorhanden sind:
select City, SampleDate, Precipitation
from COMFORT
where Precipitation IS NOT NULL;
CITY
------------SAN FRANCISCO
SAN FRANCISCO
SAN FRANCISCO
SAN FRANCISCO
KEENE
KEENE
KEENE
SAMPLEDAT PRECIPITATION
--------- ------------21-MAR-01
.5
22-JUN-01
.1
23-SEP-01
.1
22-DEC-01
2.3
21-MAR-01
4.4
22-JUN-01
1.3
22-DEC-01
3.9
63
3.5 Logik und Wert
Oracle lässt die Verwendung der relationalen Operatoren (=, !=, usw.) mit NULL zu,
aber solche Vergleiche ergeben keine besonders aussagekräftigen Ergebnisse. Um
Werte auf NULL abzuprüfen, sollten Sie mit IS oder IS NOT arbeiten.
3.5.3
Einfache Tests auf Wertelisten
Neben der Möglichkeit, einzelne Werte über logische Operatoren zu testen, können
Sie solche Tests auch mit mehreren Werten durchführen. In der Übersicht „Logische
Tests auf Wertelisten“ finden Sie eine Auswahl solcher Operatoren.
Logische Tests auf Wertelisten
Mit Zahlen:
Page IN (1,2,3)
Page ist in der Liste (1,2,3)
Page NOT IN (1,2,3)
Page ist nicht in der Liste (1,2,3)
Page BETWEEN 6 AND 10
Page ist gleich 6, 10 oder einem Wert, der dazwischen liegt
Page NOT BETWEEN 6 AND 10
Page ist kleiner als 6 oder größer als 10
Mit Buchstaben (oder Zeichen):
Section IN ('A','C','F')
Section ist in der Liste ('A', 'C', 'F')
Section NOT IN ('A', 'C', 'F')
Section ist nicht in der Liste ('A', 'C', 'F')
Section BETWEEN 'B' AND 'D'
liegt (alphabetisch)
Section ist gleich 'B', 'D' oder einem Wert, der dazwischen
Section NOT BETWEEN 'B' AND 'D' Section ist kleiner als 'B' oder größer als 'D' (im Alphabet)
Hier einige Beispiele zum Einsatz dieser Operatoren:
select Feature, Section, Page
from NEWSPAPER
where Section IN (’A’,’B’,’F’);
FEATURE
--------------National News
Editorials
Television
Births
Classified
Modern Life
Movies
Bridge
Obituaries
Doctor Is In
S
PAGE
- ---------A
1
A
12
B
7
F
7
F
8
B
1
B
4
B
2
F
6
F
6
64
3
Grundlegende Sprachelemente von SQL
select Feature, Section, Page
from NEWSPAPER
where Section NOT IN (’A’,’B’,’F’);
FEATURE
--------------Sports
Business
Weather
Comics
S
PAGE
- ---------D
1
E
1
C
2
C
4
select Feature, Section, Page
from NEWSPAPER
where Page BETWEEN 7 and 10;
FEATURE
--------------Television
Births
Classified
S
PAGE
- ---------B
7
F
7
F
8
Diese logischen Tests lassen sich auch kombinieren:
select Feature, Section, Page
from NEWSPAPER
where Section = ’F’
AND Page > 7;
FEATURE
S
PAGE
--------------- - ---------Classified
F
8
Mit dem AND-Befehl wurden zwei logische Ausdrücke kombiniert. Oracle wird gezwungen, in jeder Zeile beide Tests durchzuführen: Damit Sie eine Zeile zurückerhalten, müssen die Bedingungen „Section = 'F'“ und „Page > 7“ erfüllt sein. Alternativ
kann man auch OR einsetzen. In diesem Fall werden alle Zeilen zurückgeliefert, bei denen einer der beiden logischen Ausdrücke zutrifft:
select
from
where
OR
Feature, Section, Page
NEWSPAPER
Section = ’F’
Page > 7;
FEATURE
--------------Editorials
Births
Classified
Obituaries
Doctor Is In
S PAGE
- ----A
12
F
7
F
8
F
6
F
6
65
3.5 Logik und Wert
Es wurden einige Sections ausgegeben, deren Inhalte ungleich ’F’ sind, weil deren Page
größer als 7 ist. Bei anderen Seiten, die kleiner oder gleich 7 sind, wurde eine Übereinstimmung mit 'F' gefunden.
Mit der letzten Abfrage werden die Features in Section 'F' selektiert, deren Seitenzahl
zwischen 7 und 10 liegt:
select
from
where
and
Feature, Section, Page
NEWSPAPER
Section = ’F’
Page BETWEEN 7 AND 10;
FEATURE
--------------Births
Classified
S PAGE
- ----F
7
F
8
Es gibt einige mehrwertige Operatoren, deren Verwendung etwas komplexer ist. Sie
werden in Kapitel 8 besprochen. Weitere Hinweise auf diese Operatoren finden Sie in
der Alphabetischen Referenz.
3.5.4
Logiken kombinieren
Sowohl AND als auch OR folgen der landläufigen Bedeutung des Worts. Sie lassen sich
im Prinzip beliebig kombinieren, wobei etwas Vorsicht geboten ist, da die ANDs und
ORs ineinander verschachtelt sein können.
Angenommen, Sie möchten in der Zeitung die Features finden, die von den Redakteuren eher vernachlässigt werden. Diese Beiträge befinden sich normalerweise auf den
letzten Seiten von Section A oder B. Vielleicht probieren Sie es so:
select Feature, Section, Page
from NEWSPAPER
where Section = ’A’
or Section = ’B’
and Page > 2;
FEATURE
--------------National News
Editorials
Television
Movies
S PAGE
- ----A
1
A
12
B
7
B
4
Das von Oracle zurückgelieferte Ergebnis entspricht nicht Ihren Vorstellungen. Irgendwie ist auch die Seite 1 der Section A hineingerutscht. Was ist passiert? Gibt es
eine Möglichkeit, dass Oracle die korrekte Antwort findet? Obwohl AND und OR beide logische Konnektoren sind, ist AND stärker. Es bindet die logischen Ausdrücke auf
66
3
Grundlegende Sprachelemente von SQL
beiden Seite stärker als Oracle (technisch ausgedrückt, hat AND eine höhere Priorität).
Damit wird die where-Klausel
where Section = ’A’
or Section = ’B’
and Page > 2;
wie folgt interpretiert: „wo Section = 'A', oder wo Section = 'B' und Page > 2“. Wenn
Sie sich das gescheiterte Beispiele etwas genauer ansehen, werden Sie feststellen, wie
diese Interpretation das Ergebnis beeinflusst: AND wird immer als Erstes ausgeführt.
Sie können diese Disposition durch die Verwendung von Klammern durchbrechen.
Sie schließen die Ausdrücke ein, die gemeinsam zu interpretieren sind. Die Klammern
überschreiben die normalen Prioritätsvorgaben:
select Feature, Section, Page
from NEWSPAPER
where Page > 2
and ( Section = ’A’
or Section = ’B’ );
FEATURE
-----------------Editorials
Television
Movies
S PAGE
- ---A
12
B
7
B
42
Das Ergebnis entspricht genau dem, was Sie anfänglich eigentlich wollten. Bei der Eingabe dieser Anweisungen werden Sie feststellen, dass das Ergebnis exakt das Gleiche
ist: die Klammern teilen Oracle mit, was zusammen interpretiert werden muss. Vergleichen Sie das Ergebnis mit den ersten drei Beispielen, bei denen die Klammern nicht
eingesetzt wurden:
select Feature, Section, Page
from NEWSPAPER
where ( Section = ’A’
or Section = ’B’ )
and Page > 2;
FEATURE
--------------Editorials
Television
Movies
S PAGE
- ----A
12
B
7
B
4
3.6 Ein weiteres Einsatzgebiet für where: Unterabfragen
3.6
67
Ein weiteres Einsatzgebiet für where:
Unterabfragen
Was geschieht, wenn die logischen Operatoren unter den Überschriften „Logische
Tests auf einzelne Werte“ und „Logische Tests auf Wertelisten“ nicht nur für die Überprüfung eines einzelnen Literal-Werts (z.B. 'F') oder einer Liste von Werten (z.B. 4,2,7
oder 'A','C','F'), sondern auch für Werte verwendet werden können, die von einer
Oracle-Abfrage zurückgeliefert werden? Tatsächlich handelt es sich hierbei um ein
mächtiges Leistungsmerkmal von SQL.
Angenommen, Sie sind der Autor des Beitrags „Doctor Is In“, und jede Zeitung, die
Ihre Spalte publiziert, gibt gleichzeitig ein Inhaltsverzeichnis heraus, in dem Ihr Beitrag enthalten ist. Natürlich beurteilt jeder Lektor Ihre Wichtigkeit ein wenig anders
und stellt Ihr Werk dementsprechend in einer anderen Rubrik ab. Wie sieht die Abfrage aus, mit der man herausfinden kann, mit welchen anderen Beiträgen Ihr Kommentar platziert wurde? Sie können es wie folgt probieren:
select Section from NEWSPAPER
where Feature = ’Doctor Is In’;
S
F
Das Ergebnis ist 'F'. Damit können Sie die folgende Abfrage stellen:
select FEATURE from NEWSPAPER
where Section = ’F’;
FEATURE
--------------Births
Classified
Obituaries
Doctor Is In
Ihr Beitrag befindet sich unter Geburten, Todesfällen und Kleinanzeigen. Gibt es auch
eine Möglichkeit, um die beiden Abfragen in einer einzigen zusammenzufassen? Natürlich:
select FEATURE from NEWSPAPER
where Section = (select Section from NEWSPAPER
where Feature = ’Doctor Is In’);
68
3
Grundlegende Sprachelemente von SQL
FEATURE
--------------Births
Classified
Obituaries
Doctor Is In
3.6.1
Einzelne Werte aus einer Unterabfrage
Die in Klammern gesetzte select-Anweisung (Unterabfrage genannt) gab einen einzelnen Wert zurück: F. Die Hauptabfrage behandelt das F, als ob es sich um das Literal 'F'
aus der vorherigen Abfrage handelt. Beachten Sie, dass das Gleichheitszeichen ein Test
auf Einzelwerte ist. Hätte Ihre Unterabfrage also mehr als eine Zeile zurückgeliefert,
erhielten Sie eine Fehlermeldung:
select * from NEWSPAPER
where Section = (select Section from NEWSPAPER
where Page = 1);
ERROR: ORA-1427: Unterabfrage für eine Zeile liefert mehr als eine Zeile
Alle logischen Operatoren, die einen einzelnen Wert testen, lassen sich in Unterabfragen verwenden, solange die Unterabfrage nur eine einzige Zeile zurückliefert. So können Sie z.B. alle Beiträge (Features) in der Zeitung abfragen, deren Section kleiner
(innerhalb des Alphabets) als diejenige ist, in der Ihre Spalte enthalten ist. Der Stern in
der select-Anweisung zeigt eine Möglichkeit zur Abfrage aller Spalten innerhalb einer
Tabelle, ohne sie einzeln aufführen zu müssen. Die Spalten werden in der Reihenfolge
angezeigt, in der sie in der Tabelle angelegt wurden.
select * from NEWSPAPER
where Section < (select Section from NEWSPAPER
where Feature = ’Doctor Is In’);
FEATURE
--------------National News
Sports
Editorials
Business
Weather
Television
Modern Life
Comics
Movies
Bridge
S PAGE
- ----A
1
D
1
A
12
E
1
C
2
B
7
B
1
C
4
B
4
B
2
10 rows selected.
Zehn andere Beiträge stehen in dieser Lokalzeitung vor Ihrem medizinischen Rat.
3.6 Ein weiteres Einsatzgebiet für where: Unterabfragen
3.6.2
69
Werteliste aus einer Unterabfrage
In einer Unterabfrage können Sie auch die mehrwertigen Operatoren verwenden.
Wenn eine Unterabfrage mehr als eine Zeile zurückliefert, werden die Spaltenwerte für
jede einzelne Zeile in einer Liste aufgeführt. Angenommen, Sie möchten alle Städte
und Länder wissen, wo es bewölkt ist. Sie besitzen eine Tabelle mit den vollständigen
Wetterinformationen für alle Städte und eine LOCATION-Tabelle, in der alle Städte
und die entsprechenden Länder aufgeführt sind:
select City, Country from LOCATION;
CITY
-------------------------ATHENS
CHICAGO
CONAKRY
LIMA
MADRAS
MANCHESTER
MOSCOW
PARIS
SHENYANG
ROME
TOKYO
SYDNEY
SPARTA
MADRID
COUNTRY
--------------------------GREECE
UNITED STATES
GUINEA
PERU
INDIA
ENGLAND
RUSSIA
FRANCE
CHINA
ITALY
JAPAN
AUSTRALIA
GREECE
SPAIN
select City, Condition from WEATHER;
CITY
----------LIMA
PARIS
MANCHESTER
ATHENS
CHICAGO
SYDNEY
SPARTA
CONDITION
----------RAIN
CLOUDY
FOG
SUNNY
RAIN
SNOW
CLOUDY
Zuerst ermitteln Sie alle Städte, in denen es bewölkt ist:
select City from WEATHER
where Condition = ’CLOUDY’;
CITY
----------PARIS
SPARTA
70
3
Grundlegende Sprachelemente von SQL
Danach bauen Sie aus diesen Städten eine Liste auf und fragen damit die LOCATIONTabelle ab:
select City, Country from LOCATION
where City IN (’PARIS’, ’SPARTA’);
CITY
-------------------------PARIS
SPARTA
COUNTRY
--------------------------FRANCE
GREECE
Dieselbe Aufgabe lässt sich auch mit einer Unterabfrage erledigen, wobei die in Klammern gesetzte select-Anweisung eine Liste mit Städten aufbaut, die vom IN-Operator
getestet wird:
select City, Country from LOCATION
where City IN (select City from WEATHER
where Condition = ’CLOUDY’);
CITY
-------------------------PARIS
SPARTA
COUNTRY
--------------------------FRANCE
GREECE
Die anderen mehrwertigen Operatoren arbeiten ganz ähnlich. Zu den grundlegenden
Aufgaben gehört das Erstellen einer Unterabfrage, mit der eine Liste aufgebaut wird,
die sich logisch testen lässt. Nachfolgend einige relevante Punkte:
■ Die Unterabfrage darf entweder nur eine Spalte haben oder muss die ausgewählten
Spalten mit mehreren, in Klammern gestellten Spalten in der Hauptabfrage vergleichen (siehe Kapitel 12).
■ Die Unterabfrage muss in Klammern stehen.
■ Unterabfragen, die nur eine Zeile produzieren, lassen sich sowohl mit ein- als auch
mit mehrwertigen Operatoren einsetzen.
■ Unterabfragen, die mehr als eine Zeile produzieren, können nur mit mehrwertigen Operatoren einsetzen.
3.7
Tabellen kombinieren
Sobald Sie Ihre Daten normalisiert haben, müssen Sie unter Umständen zwei oder
mehr Tabellen kombinieren, um alle gewünschten Informationen zu erhalten.
Nehmen wir an, Sie wären das Orakel von Delphi. Die Athener möchten sich bei Ihnen
nach den Naturgewalten erkundigen, die Einfluss auf den erwarteten Angriff der Spar-
3.7 Tabellen kombinieren
71
taner haben könnten. Zudem möchten sie wissen, aus welcher Richtung das Unwetter
gegebenenfalls zu erwarten ist:
select City, Condition, Temperature from WEATHER;
CITY
----------LIMA
PARIS
MANCHESTER
ATHENS
CHICAGO
SYDNEY
SPARTA
CONDITION
TEMPERATURE
----------- ----------RAIN
45
CLOUDY
81
FOG
66
SUNNY
97
RAIN
66
SNOW
29
CLOUDY
74
Da Ihre Geografiekenntnisse in den letzten Jahren etwas gelitten haben, fragen Sie die
LOCATION-Tabelle ab:
select City, Longitude, EastWest, Latitude, NorthSouth
from LOCATION;
CITY
LONGITUDE E LATITUDE N
------------------------- --------- - -------- ATHENS
23.43 E
37.58 N
CHICAGO
87.38 W
41.53 N
CONAKRY
13.43 W
9.31 N
LIMA
77.03 W
12.03 S
MADRAS
80.17 E
13.05 N
MANCHESTER
2.15 W
53.3 N
MOSCOW
37.35 E
55.45 N
PARIS
2.2 E
48.52 N
SHENYANG
123.3 E
41.48 N
ROME
12.29 E
41.54 N
TOKYO
139.5 E
35.42 N
SYDNEY
151.1 E
33.52 S
SPARTA
22.27 E
37.05 N
MADRID
3.14 W
40.24 N
Sie haben jetzt zwar mehr Daten erhalten als benötigt, aber leider noch überhaupt keine Wetterinformationen. Allerdings haben die beiden Tabellen WEATHER und LOCATION eine gemeinsame Spalte: City. Deshalb können Sie die Informationen aus
beiden Tabellen zusammenführen. Lediglich über die where-Klausel teilen Sie Oracle
die Gemeinsamkeiten der beiden Tabellen mit (das Beispiel ähnelt dem in Kapitel 1):
select WEATHER.City, Condition, Temperature, Latitude,
NorthSouth, Longitude, EastWest
from WEATHER, LOCATION
where WEATHER.City = LOCATION.City;
72
3
CITY
----------ATHENS
CHICAGO
LIMA
MANCHESTER
PARIS
SPARTA
SYDNEY
Grundlegende Sprachelemente von SQL
CONDITION
TEMPERATURE LATITUDE N LONGITUDE E
----------- ----------- -------- - --------- SUNNY
97
37.58 N
23.43 E
RAIN
66
41.53 N
87.38 W
RAIN
45
12.03 S
77.03 W
FOG
66
53.3 N
2.15 W
CLOUDY
81
48.52 N
2.2 E
CLOUDY
74
37.05 N
22.27 E
SNOW
29
33.52 S
151.1 E
Beachten Sie, dass in dieser kombinierten Tabelle nur Zeilen mit Städten enthalten, die
in beiden Tabellen vorkommen. Die where-Klausel führt Ihre Logik genau wie im Falle
der NEWSPAPER-Tabelle aus. Diese Logik sagt Folgendes: „Wähle in der WEATHERund der LOCATION-Tabelle die Zeilen aus, in denen die Städte gleich sind“. Ist eine
Stadt nur in einer der Tabellen vorhanden, gibt es in der anderen Tabelle keine Übereinstimmung. Die in der select-Anweisung eingesetzte Notation ist „TABLE.SpaltenName“ – in unserem Fall WEATHER.City.
Die select-Klausel hat aus den beiden Tabellen alle Zeilen ausgewählt, die Sie gerne sehen möchten. Andere Zeilen wurden einfach ignoriert. Hätte man in der ersten Zeile
folgende Aussage getroffen
select City, Condition, Temperature, Latitude
wüsste Oracle nicht, auf welche Stadt (City) Sie sich beziehen, in diesem Fall erhalten
Sie von Oracle eine entsprechende Fehlermeldung. Der korrekte Wortlaut in der select-Klausel ist „WEATHER.City“ oder „LOCATION.City“. In unserem Beispiel wäre
es egal, welche dieser beiden Varianten verwendet wird. Sie möchten jedoch die Fälle
herausgreifen, in denen die Auswahl über identisch benannte Spalten erfolgt, die in
zwei oder mehr Tabellen vorkommen und völlig verschiedene Daten enthalten.
Die where-Klausel benötigt außer den Tabellennamen den identischen Spaltennamen,
über den die Tabellen kombiniert werden: „wo weather Punkt city ist gleich location
Punkt city“. Gesucht wird also nach Elementen in der City-Spalte, die in der WEATHER- und der LOCATION-Tabelle identisch sind.
Beachten Sie, dass die Kombination aus beiden Tabellen wie eine einzige Tabelle mit
sieben Spalten und sieben Zeilen aussieht. Ausgeschlossene Elemente werden nicht angezeigt. So fehlt z.B. die Humidity-Spalte, obwohl sie in der WEATHER-Tabelle vorhanden ist. Das Gleiche gilt für die Country-Spalte in der LOCATION-Tabelle. Und
von den 14 Städten in der LOCATION-Tabelle wurden nur solche übernommen, die
auch in der WEATHER-Tabelle vorhanden sind. Ihre where-Klausel sorgte dafür, dass
die anderen Elemente nicht berücksichtigt wurden.
Eine Tabelle, die aus den Spalten einer oder mehrerer Tabellen aufgebaut wurde, bezeichnet man als eine Projektion oder Ergebnistabelle.
73
3.8 Eine View anlegen
3.8
Eine View anlegen
Eine View sieht nicht nur wie eine neue Tabelle aus, Sie können ihr auch einen Namen
geben und sie tatsächlich wie eine Tabelle behandeln. Diesen Vorgang bezeichnet man
als Anlegen einer View. Mit einer View lässt sich die Logik verbergen, mit deren Hilfe
man die angezeigte Tabelle zusammengefügt hat. Das funktioniert so:
create view INVASION AS
select WEATHER.City, Condition, Temperature, Latitude,
NorthSouth, Longitude, EastWest
from WEATHER, LOCATION
where WEATHER.City = LOCATION.City;
View created.
Jetzt können Sie INVASION wie eine normale Tabelle behandeln und sich von Oracle
sogar eine Beschreibung ausgeben lassen:
describe INVASION
Name
Null?
------------------------------- -------CITY
CONDITION
TEMPERATURE
LATITUDE
NORTHSOUTH
LONGITUDE
EASTWEST
Type
---VARCHAR2(11)
VARCHAR2(9)
NUMBER
NUMBER
CHAR(1)
NUMBER
CHAR(1)
Sie können auch eine Abfrage stellen. (Sie müssen nicht angeben, aus welcher Tabelle
die City-Spalten stammen, da die Logik innerhalb der View verborgen bleibt.)
select City, Condition, Temperature, Latitude, NorthSouth,
Longitude, EastWest
from INVASION;
CITY
----------ATHENS
CHICAGO
LIMA
MANCHESTER
PARIS
SPARTA
SYDNEY
CONDITION
TEMPERATURE LATITUDE N LONGITUDE E
----------- ----------- -------- - --------- SUNNY
97
37.58 N
23.43 E
RAIN
66
41.53 N
87.38 W
RAIN
45
12.03 S
77.03 W
FOG
66
53.3 N
2.15 W
CLOUDY
81
48.52 N
2.2 E
CLOUDY
74
37.05 N
22.27 E
SNOW
29
33.52 S
151.1 E
Im Zusammenhang mit einer View können einige, wenn auch wenige Oracle-Funktionen nicht verwendet werden, z.B. solche zum Ändern von Zeilen und zum Indizieren
74
3
Grundlegende Sprachelemente von SQL
von Tabellen. Ansonsten verhält sich eine View wie eine normale Tabelle und kann
entsprechend manipuliert werden.
Hinweis
Views enthalten keine Daten, Tabellen hingegen schon.
Seit Oracle8i können Sie „materialisierte Views“ anlegen,
die Daten enthalten. Sie sind allerdings echte Tabellen,
keine Views.
Angenommen, Sie stellen jetzt fest, dass Sie keine Informationen über Chicago oder
andere Städte außerhalb von Griechenland benötigen. In diesem Fall ändern Sie einfach die Abfrage. Funktioniert die Folgende?
select City, Condition, Temperature, Latitude, NorthSouth,
Longitude, EastWest
from INVASION
where Country = ’GREECE’;
SQLPLUS liefert diese Oracle-Fehlermeldung zurück:
where Country = ’GREECE’
*
ERROR in Zeile 4: ORA-0704:
ungültiger Spaltenname
Warum? Obwohl es sich bei Country um eine Spalte in einer der Tabellen hinter der
INVASION-View handelt, wurde sie beim Aufbau der View nicht in die select-Klausel
aufgenommen. Infolgedessen wird die Spalte behandelt, als sei sie überhaupt nicht
vorhanden. Deshalb müssen Sie die create view-Anweisung ändern und beziehen nur
Griechenland mit ein.
create or replace view INVASION as
select WEATHER.City, Condition, Temperature, Latitude,
NorthSouth, Longitude, EastWest
from WEATHER, LOCATION
where WEATHER.City = LOCATION.City
and Country = ’GREECE’;
View created.
Mit dem Befehl create or replace view erstellen Sie eine neue Version der View, ohne
die alte View zu löschen. Der Befehl erleichtert die Verwaltung der Benutzerberechtigungen für den Zugriff auf die View (siehe Kapitel 19).
Die Logik der where-Klausel wurde so erweitert, dass nun zwei Tabellen zusammengeführt werden und in einer Spalte dieser Tabellen ein Test auf einen Wert durchgeführt wird. Übergeben Sie diese Abfrage an Oracle, erhalten Sie folgende Antwort:
75
3.8 Eine View anlegen
select City, Condition, Temperature, Latitude, NorthSouth,
Longitude, EastWest
from INVASION;
CITY
----------ATHENS
SPARTA
CONDITION
TEMPERATURE LATITUDE N LONGITUDE E
----------- ----------- -------- - --------- SUNNY
97
37.58 N
23.43 E
CLOUDY
74
37.05 N
22.27 E
Damit können Sie die Athener warnen und ihnen mitteilen, dass die Spartaner wahrscheinlich aus Südwesten kommen und vom Marsch überhitzt und müde sein werden.
Mit ein wenig Trigonometrie können Sie Oracle sogar ausrechnen lassen, wie weit die
Truppen marschiert sind. Das alte Orakel von Delphi war hinsichtlich der Vorhersagen immer etwas mehrdeutig, und hätte ungefähr Folgendes gesagt: „Einer wird gewinnen“. Im Gegensatz dazu können Sie wenigstens einige Fakten anbieten.
3.8.1
Die View erweitern
Die Möglichkeit, die Daten innerhalb der Views zu schützen oder zu ändern, kann oft
nützlich sein. Auf der Grundlage von einfachen Views lassen sich sehr komplexe Reports aufbauen, und die Berechtigungen bestimmter Personen oder Gruppen lassen
sich so einschränken, dass sie nur bestimmte Elemente der Tabelle zu sehen bekommen.
Tatsächlich können jegliche Einschränkungen, die im Rahmen einer Abfrage definiert
werden, auch Bestandteil einer View werden. So können Sie beispielsweise definieren,
dass Abteilungsleiter nur Einsicht in ihre eigene Gehaltsabrechnung und die ihrer Mitarbeiter erhalten. Wichtig ist allerdings, Views sind keine Momentaufnahmen zu irgendeinem Zeitpunkt der Vergangenheit. Sie sind dynamisch und geben immer die
aktuellen Daten aus den zu Grunde liegenden Tabellen wieder. Sobald sich die Daten
innerhalb einer Tabelle ändern, werden die mit dieser Tabelle generierten Views sofort
aktualisiert.
Angenommen, Sie haben eine View angelegt, die die Werte auf der Basis von Spaltenwerten einschränkt. Wie nachfolgend gezeigt wird, lässt sich eine Abfrage, die die LOCATION-Tabelle in der Country-Spalte einschränkt, dazu nutzen, die Anzahl der
Zeilen einzuschränken, die über die View sichtbar sind:
create or replace view PERU_LOCATIONS as
select * from LOCATION
where Country = ’PERU’;
Ein Anwender, der eine Abfrage über die PERU_LOCATIONS stellt, kann lediglich die
Zeilen sehen, die sich auf Peru beziehen.
76
3
Grundlegende Sprachelemente von SQL
Die Abfragen zur Definition von Views können auch Pseudospalten referenzieren. Bei
einer Pseudospalte handelt es sich um eine „Spalte“, die einen ausgewählten Wert zurückgibt, aber keine aktuelle Spalte in einer Tabelle ist. So würde die Pseudospalte User
immer den Benutzernamen des Oracle-Anwenders zurückliefern, der die Abfrage ausführt. Wenn also eine Spalte in der Tabelle Benutzernamen enthält, können diese
Werte mit der Pseudospalte User verglichen werden. Damit lässt sich die Anzahl der
Spalten reduzieren (siehe folgendes Listing). In unserem Fall wird die Tabelle NAME
abgefragt. Ist der Wert in der Name-Spalte identisch mit dem Namen des Benutzers,
der die Abfrage stellt, werden diese Zeilen zurückgeliefert:
create or replace view RESTRICTED_NAMES
select * from NAME
where Name = User;
Solche Views sind besonders hilfreich, wenn Anwender auf ausgewählte Zeilen innerhalb einer Tabelle zugreifen möchten. In diesem Zusammenhang lässt sich verhindern, dass Benutzer auf Zeilen zugreifen, die nicht mit ihren Oracle-Benutzernamen
übereinstimmen.
Views sind äußerst leistungsfähige Werkzeuge. Mehr dazu in Kapitel 18.
Mit der where-Klausel lassen sich zwei Tabellen auf der Basis einer gemeinsamen Spalte verknüpfen. Das Ergebnis kann in eine View (mit eigenem Namen) umgewandelt
werden, die wiederum als eigenständige Tabelle behandelt wird. Die eigentliche Stärke
einer View liegt in ihrer Fähigkeit, die Ansicht der Daten für Benutzer zu begrenzen
oder zu ändern, wobei die Daten in den zu Grunde liegenden Tabellen davon nicht berührt werden.
Herunterladen