SQL Lehrgang

Werbung
Bernhard Bausch
Datenbanken und Informationssysteme
08.01.11
Technikerschule TS
Kursunterlagen
Datenbanksysteme
SQL
Autor:
Bernhard Bausch
Versionsverzeichnis
Version:
Version 1.0
Version 1.1
Version 1.2
Version 1.3
Datenbank_SQL1.3.doc
Datum:
28.05.01
08.09.01
20.04.02
01.07.02
Revisionsgrund:
Erste Ausgabe
Ergänzung SQL-Befehlsübersicht
Semesterkorrekturen
Semesterkorrektur
Seite 1/37
Bernhard Bausch
Schulungsunterlagen Datenbanken
Inhalt
1
SQL-Befehlsübersicht ..............................................................................................................................4
2
Mit SQL-Anweisungen Daten definieren, eingeben und verwalten .....................................................5
2.1 Datenbank anlegen, öffnen, schliessen und löschen ....................................................................5
2.1.1
2.1.2
2.2
Tabellen erstellen und löschen ......................................................................................................6
2.2.1
2.2.2
2.3
3.5
3.6
3.7
3.8
Operatoren............................................................................................................................................. 11
Spalten mit NULL-Werten Abfragen ...................................................................................................... 11
Zeilen mit verbundenen Bedingungen suchen und anzeigen ................................................................ 11
Logische Operatoren ............................................................................................................................. 12
Aggregatfunktionen ......................................................................................................................13
Rechenoperationen durchführen .................................................................................................14
Mit Funktionen arbeiten ...............................................................................................................15
3.7.1
3.7.2
3.7.3
3.7.4
Numerische Funktionen ......................................................................................................................... 15
Datumsoperatoren und Datumsfunktionen ............................................................................................ 15
Zeichenketten-, Umwandlungs- und anderer Funktionen ...................................................................... 15
Umwandlungsfuntionen .................................................................... Fehler! Textmarke nicht definiert.
Prädikate ......................................................................................................................................15
3.8.1
3.8.2
3.8.3
Operator LIKE ........................................................................................................................................ 16
Operator BETWEEN .............................................................................................................................. 16
Operator IN ............................................................................................................................................ 16
Daten aus mehreren Tabellen abfragen (Joins) ..................................................................................17
4.1 Kartesisches Produkt aus zwei Tabellen bilden ..........................................................................17
4.2 Logische Verbingungen mit Equi-Join herstellen.........................................................................17
4.3 Andersnamen bzw. Alias-Bezeichner für Tabellen vereinbaren ..................................................17
4.3.1
4.3.2
4.4
Synonyme Tabellen-Bezeichner ............................................................................................................ 17
Alias-Bezeichner definieren ................................................................................................................... 18
OUTER- oder LEFT-, RIGHT-Join ...............................................................................................18
4.4.1
5
Neue Spalte mit ADD einfügen ................................................................................................................ 9
Vorhandene Spalten mit MODIFY ändern ............................................................................................... 9
Vorhandene Spalten mit DROP löschen .................................................................................................. 9
Tabellen- und Spaltennamen ändern....................................................................................................... 9
Der SELECT-Befehl im SQL ...................................................................................................................10
3.1 Alle Zeilen einer Tabelle anzeigen ...............................................................................................10
3.2 Spalten auswählen .......................................................................................................................10
3.3 Inhaltlich gleiche Zeilen von der Ausgabe ausschliessen ...........................................................10
3.4 Zeilen mit Bedingungen auswählen .............................................................................................10
3.4.1
3.4.2
3.4.3
3.4.4
4
Eine Tabellenzeile vollständig eingeben .................................................................................................. 7
Werte in bestimmte Spalten einer Datenzeile eingeben .......................................................................... 7
Daten aktualisieren ........................................................................................................................8
Daten löschen ................................................................................................................................8
Ein Tabellenfeld nachträglich einfügen, ändern oder löschen. ......................................................9
2.6.1
2.6.2
2.6.3
2.6.4
3
Tabellen erstellen .................................................................................................................................... 6
Tabellen löschen...................................................................................................................................... 6
Daten in Tabellen eingeben (neuer Datensatz) .............................................................................7
2.3.1
2.3.2
2.4
2.5
2.6
Datenbank anlegen.................................................................................................................................. 5
Datenbank löschen .................................................................................................................................. 5
Verknüpfungen innerhalb der gleichen Tabelle (Self-Joins)................................................................... 19
Bedingungen in SELECT-Unterabfragen formulieren (Subqueries) ................................................21
5.1 Regeln für den Einsatz von Unterabfragen ..................................................................................21
5.2 Unterabfragen mit relationale Operatoren ...................................................................................21
5.3 Unterabfrage mit ALL und ANY ...................................................................................................22
5.3.1
5.3.2
5.4
Operator ALL ......................................................................................................................................... 22
Operator ANY ........................................................................................................................................ 23
Unterabfragen mit IN und EXISTS ...............................................................................................23
Datenbank_SQL1.3.doc
Seite 2/37
Bernhard Bausch
5.4.1
5.4.2
5.5
5.6
5.7
Schulungsunterlagen Datenbanken
Operator IN ............................................................................................................................................ 23
Operator EXISTS ................................................................................................................................... 23
Synchronisierte Unterabfragen ....................................................................................................24
Unterabfragen im Befehl INSERT ................................................................................................24
Unterabfragen im Befehl UPDATE ..............................................................................................25
5.7.1
5.7.2
Select-Unterabfrage in der WHERE-Klausel.......................................................................................... 25
SELECT-Unterabfrage in der SET-Klausel ............................................................................................ 25
6
Daten sortieren und gruppieren ............................................................................................................26
6.1 Daten Sortieren ............................................................................................................................26
6.2 Zeilen gruppieren .........................................................................................................................26
6.3 Gruppen bedingungsabhängig auswählen mit HAVING. ............................................................28
7
Ergebnisausgaben verbinden mit UNION, INTERSECT, EXCEPT .....................................................29
7.1 Operator UNION ..........................................................................................................................29
7.2 Operator INTERSECT ................................................................................................................29
7.3 Operator EXCEPT/MINUS ...........................................................................................................29
8
Sichten verwenden .................................................................................................................................30
8.1 VIEW erstellen .............................................................................................................................30
8.2 View ausgeben.............................................................................................................................31
8.3 View löschen ................................................................................................................................31
8.4 Mit VIEWS Daten aktualisieren ....................................................................................................31
9
Datenbank optimieren ............................................................................................................................32
9.1 Einfachindex erstellen. .................................................................................................................32
9.2 Index löschen ...............................................................................................................................32
9.3 Zusammengesetzten Index vereinbaren .....................................................................................32
9.4 Indexeintragungen überprüfen und reparieren ............................................................................33
9.5 Die referentielle Integrität einer Datenbank erhalten ...................................................................33
10
Daten schützen und sichern ..................................................................................................................35
11
Transaktionsorientiert arbeiten .............................................................................................................36
12
ODBC-Schnittstelle zum Zugriff auf Datenbanken einsetzen ............................................................37
Datenbank_SQL1.3.doc
Seite 3/37
Bernhard Bausch
1
Schulungsunterlagen Datenbanken
SQL-Befehlsübersicht
In der Praxis unterscheidet man sowohl bei den hierarchischen (z.B IMS von IBM), den Netzwerk- (z.B. IDMS von Cullinet) als auch bei den relationalen Datenbanksystemen zwei Gruppen
von Datenbankanweisungen.
DDL — Data Definition Language (Definitionssprache)
Dazu zählen alle Datenbankanweisungen, mit denen die logische Struktur der Datenbank
bzw. der Tabellen der Datenbank beschrieben bzw. verändert wird. Hierzu gehören folgende Befehle:
CREATE TABLE:
neue Basistabellen erstellen
CREATE VIEW:
Definieren einer logischen Tabelle
GRANT
Benutzerberechtigungen vergeben
DML — Data Manipulation Language (Datenmanipulationssprache)
Dazu zählen alle Anweisungen an das Datenbanksystem, die dazu dienen, die Daten zu
verarbeiten. Hierzu gehören folgende Befehle:
SELECT:
Daten aus der Datenbank lesen
DELETE:
Zeilen einer Tabelle löschen
UPDATE:
Zeilen einer Tabelle ändern
INSERT:
Zeilen einer Tabelle hinzufügen
Bei den hierarchischen und den Netzwerk-Datenbanken ist der Sprachumfang der DDL und DML
gross. Selbst bei der Erstellung einfacher Anwendungen ist ein relativ grosser Aufwand erforderlich, bis die dazugehörige Datenbank definiert ist und die DML-Programme geschrieben und gestestet sind.
die Sprache SQL dagegen besteht aus nur wenigen einfachen Befehlen, die sowohl den DDL- als
auch den DML-Teil abdecken.
Datenbank_SQL1.3.doc
Seite 4/37
Bernhard Bausch
2
Schulungsunterlagen Datenbanken
Mit SQL-Anweisungen Daten definieren, eingeben und verwalten
Für das Einrichten und Verwalten von Datenbanken und Tabellen werden eine Reihe von Anweisungen benötigt, mit denen Sie:
• Eine Datenbank mit ihren Tabellen anlegen,
• Daten in die Tabellen eingeben und abrufen sowie
• Tabellen ändern und löschen
Die meisten SQL-Anweisungen können in allen SQL-basierten Datenbanksystemen eingesetzt
werden. Trotz Standardisierung besitzt aber jedes Datenbanksystem eigene Ausprägungen von
SQL-Befehlen. Das gleiche gilt auch für die Datentypen, mit denen Spalten definiert werden.
Einige Unterschiede werden kurz erläutert.
2.1 Datenbank anlegen, öffnen, schliessen und löschen
2.1.1 Datenbank anlegen
Der Befehl
CREATE DATABASE Datenbankname
erstellt eine Datenbank mit ihren zugehörigen Systemtabellen. Mit dieser SQL-Anweisung wird
der Rahmen für die spätere Einrichtung der Tabellen geschaffen.
Wenn Sie sich nach der Anweisung CREATE DATABASE das Verzeichnis anschauen, in dem
die Datenbank aufgebaut worden ist, so finden Sie dort bereits eine Vielzahl von Dateien vor. Es
handelt sich um die Systemtabellen, auch Systemkatalog oder Data Dictionary genannt. In ihm
werden alle Informationen über die logische Struktur der Datenbank gesammelt. Er enthält unter
anderem Informationen darüber, welche Tabellen eine Datenbank enthält, wie viel Datensätze
vorhanden sind, wie die Spalten einer Tabelle heissen und mit welchen Datentypen die Spalten
definiert sind. Bei jeder SQL-Anweisung informiert sich das System zunächst in diesen Systemtabellen, bevor es die Anweisung durchführt. Sie können die in den Systemtabellen gespeicherten Informationen jederzeit abrufen und sich damit eine Übersicht über die Inhalte der Datenbank
verschaffen.
In ORACLE wird bei der Installation des Systems für das Data Dictionary eine eigene Datenbank
mit dem Namen oracle angelegt.
2.1.2 Datenbank löschen
Mit dem Befehl
DROP DATABASE Datenbankname
wird dort eine Datenbank gelöscht, wo ein System mehrere Datenbanken verwaltet. Vor dem löschen muss die entsprechende Datenbank mit dem Befehl
CLOSE DATABASE
geschlossen werden.
Das Löschen der Datenbank bedeutet, dass sie mit allen dazugehörigen Objekten entfernt wird.
Bei der Access JET-Datenbank, wo die ganze Datenbank eine einzige Datei ist, muss die entsprechende Datei gelöscht werden.
Datenbank_SQL1.3.doc
Seite 5/37
Bernhard Bausch
Schulungsunterlagen Datenbanken
2.2 Tabellen erstellen und löschen
2.2.1 Tabellen erstellen
Mit der SQL-Anweisung "CREATE TABLE Tabellenname" wird eine neue Tabelle angelegt. Hinter dem Tabellennamen sind in Klammern die Spaltennamen, jeweils mit Datentyp und Längenangabe, zu definieren. Die einzelnen Spaltenbeschreibungen werden mit Kommata getrennt. Die
Liste der Spaltennamen muss von runden Klammern umschlossen sein.
CREATE TABLE Persdat
(
Pd_ID
INTEGER NOT NULL,
Pd_Name
CHAR(25),
Pd_VName
CHAR(25),
Pd_Geschlecht
CHAR(1),
Abt_ID
SMALLINT,
Pd_Eintritt
DATE,
Pd_Gehalt
DOUBLE
)
DOUBLE ist Access-Spezifische; SQL wäre DECIMALE(8,2)
Die Spaltenbedingung NOT NULL weist in diesem Beispiel auf eine Schlüsselspalte hin, legt aber
nur fest, dass unbedingt Werte eingegeben werden müssen. Eine weitere Spaltenbedingung ist
der UNIQUE-Index, welcher überwacht, dass, im Zusammenhang mit Schlüsselspalten, die in der
bezeichneten Datenspalte eingegebenen Werte eindeutig sind.
Dies ist die einfache Form eines CREATE TABLE-Befehls. Die erweiterte Form dieser Anweisung
bezieht sich zum grössten Teil auf die Definition der Integritätsregeln (wie UNIQUE-Index), auf
welche wir später noch eingehen. Die allgemeine Syntax der erweiterten Form dieser Anweisung
ist von System zu System leicht unterschiedlich.
In der Regel bietet eine relationale Datenbank ein Tool an, das die Erstellung der Tabellen mit
SQL-Befehlen hinfällig macht.
Erstellen Sie eine weitere Tabelle:
CREATE TABLE MGehalt
(Pd_ID
INTEGER NOT NULL,
Mg_Jahr
SMALLINT,
Mg_Monat
SMALLINT,
Mg_Gehalt
DOUBLE)
2.2.2 Tabellen löschen
Mit der Anweisung "DROP TABLE Tabellennamen" wird eine Tabelle mit den darin gespeicherten
Daten aus der Datenbank und in den Systemtabellen gelöscht.
Tabelle erstellen:
CREATE TABLE Ueb
(uebnr INTEGER, uebbez CHAR(20))
Tabelle löschen:
DROP TABLE Ueb
Bei verschiedenen Systemen kann man die Tabellen auch auf Betriebssystemebene löschen. Bei
Tabellen einer Datenbank riskieren Sie aber damit, dass die Integrität der Datenbank zerstört
wird.
Datenbank_SQL1.3.doc
Seite 6/37
Bernhard Bausch
Schulungsunterlagen Datenbanken
2.3 Daten in Tabellen eingeben (neuer Datensatz)
Mit der INSERT-Anweisung können Daten in einer Tabelle erfasst werden.
Mit der Anweisung INSERT INTO tabellennamen VALUES() geben Sie Werte zeilenweise ein
2.3.1 Eine Tabellenzeile vollständig eingeben
INSERT INTO Persdat
VALUES ( 99, 'Willemann', 'Hans', 'M', 3, '31.05.2001',4500)
Datumswerte werden von Datenbank zu Datenbank sehr unterschiedlich behandelt.
In der Klammer hinter VALUES werden die Werte in der Reihenfolge der Tabellenstruktur aufgeführt. Dabei ist zu beachten, dass die angegebenen Werte mit den vereinbarten Datentypen in
den Tabellen übereinstimmen. Zeichenketten, Datumswerte und Zeitwerte werden in Hochkommata (') eingeschlossen.
UEBUNG:
Geben Sie folgende Datensätze in die Tabelle Persdat ein:
INSERT INTO Persdat VALUES ( 55, 'Hurter', 'Karl', 'M', 1, '1.1.1980',6800)
INSERT INTO Persdat VALUES ( 56, 'Frauental', 'Heidi', 'W', 2, '1.2.1995',3200)
INSERT INTO Persdat VALUES ( 57, 'Meyer', 'Karl', 'M', 3, '15.7.2000',5200)
INSERT INTO Persdat VALUES ( 58, 'Bolliger', 'Verena', 'W', 3, '31.05.2001',2500)
Legen Sie eine Tabelle Ueb an. Die Tabelle verfügt über die Spalten :
Ub_ID
INTEGER Not Null
Ub_Bez
CHAR(20)
Tragen Sie dann folgende Werte in die Tabelle ein:
3
Katolog
10
Handbuch
15
Sachbuch
2.3.2 Werte in bestimmte Spalten einer Datenzeile eingeben
Wenn Sie Werte nur in bestimmte Spalten einer Tabellenzeile eingeben wollen, müssen Sie hinter dem Tabellennamen zusätzlich die Namen der Spalten benennen, in denen die Daten gespeichert werden sollen.
INSERT INTO Persdat(Pd_Id, Pd_Name)
VALUES(3,'Müller')
So werden in Persdat nur Werte in den Spalten Pd_ID und Pd_Name gespeichert.
Datenbank_SQL1.3.doc
Seite 7/37
Bernhard Bausch
Schulungsunterlagen Datenbanken
2.4 Daten aktualisieren
Mit der Anweisung "UPDATE Tabellennamen SET" werden Daten bedingungsabhängig geändert
UPDATE Ueb
SET Ub_ID = 25,
Ub_Bez = 'Lernfibel'
WHERE Ub_ID = 3
Im Anschluss an das Schlüsselwort UPDATE wird die zu ändernde Tabelle benannt.
Hinter SET werden den zu ändernden Spalten die neuen Werte zugewiesen.
Die Bedingung hinter WHERE definiert die Zeile, in der die Änderung durchgeführt werden soll
.
In diesem Beispiel wird in der Tabelle Ueb, in der Spalte Ub_ID, der Datensatz mit der Ub_ID = 3,
auf 25 verändert und der Inhalt von Feld Ub_bez mit "Lernfibel" überschrieben.
Achtung: Wird bei einem UPDATE-Befehl die WHERE-Bedingung weggelassen, so werden alle
Zeilen der Tabelle geändert.
Uebung:
Werte in einer Spalte können auch erhöht werden. In der Tabelle ueb sollen alle Werte in der
Spalte Ub_ID um 10 erhöht werden.
Ergänzen sie folgenden Eintrag in der Tabelle Persdat:
Alle Eintragungen gelten nur für Pd_ID = 3
Pd_Vname = Claudia
Pd_Geschlecht = W
Abt_ID = 2
Pd_Eintritt = 7.5.1995
Pd_Gehalt = 4500
Erfassen Sie folgende Daten in der Tabelle MGehalt
2.5 Daten löschen
Daten werden mit der Anweisung DELETE FROM Tabellennamen aus einer Tabelle entfernt. Mit
dem Zusatz WHERE erfolgt wiederum die Zeilenauswahl.
DELETE FROM Ueb WHERE Ub_ID = 35
Achtung: Ohne WHERE-Klausel werden alle Daten von Ueb gelöscht.
Datenbank_SQL1.3.doc
Seite 8/37
Bernhard Bausch
Schulungsunterlagen Datenbanken
2.6 Ein Tabellenfeld nachträglich einfügen, ändern oder löschen.
Mit der Anweisung ALTER TABLE Tabellenname werden in vorhandenen Tabellenstrukturen
neue Spalten eingefügt, vorhandene Spalten geändert oder gelöscht.
2.6.1 Neue Spalte mit ADD einfügen
Hinter dem Schlüsselwort ALTER TABLE wird die Tabelle genannt, deren Struktur geändert werden soll. Mit dem Zusatz ADD wird das System angewiesen, eine oder mehrere Spalten einzufügen. Die einzufügenden Spalten werden mit Namen und Datentypen definiert.
Die Tabelle ueb soll um die Tabellenspalte Ub_Menge und Ub_Te ergänzt werden:
Access: Neue Datenfelder müssen einzeln definiert werden
ALTER TABLE Ueb ADD Ub_Menge DOUBLE
ALTER TABLE Ueb ADD Ub_Te Char(20)
DB2/2 In diesen Datenbanken wenden keine Klammern bei Spaltenfunktionen verwendet.
ALTER TABLE Ueb ADD Ub_Menge
Decimal(8,2),
ADD Ub_Te
Char(20)
Oracle/Informix
ALTER TABLE Ueb ADD
(Ub_Menge
Decimal(8,2),
Ub_Te
Char(20))
2.6.2 Vorhandene Spalten mit MODIFY ändern
Mit dem Zusatz MODIFY wird das System angewiesen, einer vorhandenen Spalte einen anderen
Datentyp zuzuweisen. Die Spalte wird mit Ihrem Namen benannt und der neue Datentyp wird danach definiert.
Beispiel: In der Spalte Ub_Menge soll der Datentyp von NUMERIC in SMALLINT geändert werden, Access kennt diesen Befehl nicht:
ALTER TABLE Ueb MODIFY
(Ub_Menge = SMALLINT)
Diese Anweisung läuft nur in Oracle und Informix..
2.6.3 Vorhandene Spalten mit DROP löschen
Mit dem Zusatz DROP wird das System angewiesen, eine vorhandene Spalte zu löschen. Die
Spalte wird mit ihrem Namen angesprochen.
Oracle kennt den Zusatz DROP nicht.
ALTER TABLE Ueb DROP Ub_Menge
2.6.4 Tabellen- und Spaltennamen ändern
In Informix und Oracle können Sie mit dem Datenbankbefehl RENAME Tabellen nachträglich
umbenennen. Access kennt diesen Befehl nicht.
RENAME TABLE Ueb TO Ueb1
In Informix können Sie mit RENAME nachträglich auch Spaltennamen ändern:
RENAME COLUMN Ueb1.Ub_Bez TO Ub_Bezeichnung
Datenbank_SQL1.3.doc
Seite 9/37
Bernhard Bausch
3
Schulungsunterlagen Datenbanken
Der SELECT-Befehl im SQL
Wenn die erforderlichen Daten in einer Datenbank gespeichert sind, können Sie auf verhältnismässig einfache Weise die gewünschten Informationen aus der Datenbank gewinnen. Das Suchen und Anzeigen gespeicherter Werte gehört zu den wichtigsten Fähigkeiten eines Datenbanksystems.
In einer Abfrage muss stets angegeben werden, aus welchen Spalten und aus welcher Tabelle
Daten abgerufen werden sollen.
3.1 Alle Zeilen einer Tabelle anzeigen
SELECT leitet die Anweisung ein, mit der Daten in der Datenbank gesucht und angezeigt werden. Hinter SELECT werden die Namen der auszuwählenden Spalten angegeben. Der Stern *
hinter dem Schlüsselwort veranlasst die Anzeige aller Tabellenspalten in der Reihenfolge, in der
die Spalten mit CREATE TABLE angelegt worden sind. Hinter dem Zusatz FROM wird der Name
der Tabellen genannt, aus der die Daten gewonnen werden sollen.
SELECT * FROM Adressen
3.2 Spalten auswählen
Meistens werden nur die Daten bestimmter Spalten benötigt. Mit der Auflistung der gewünschten
Spaltennamen hinter dem Schlüsselwort SELECT wird die Anzeige auf die namentlich genannten
Spalten beschränkt. Die Ausgabe erfolgt dabei in der Reihenfolge, in der die Spaltennamen hinter
SELECT angeordnet wurden.
SELECT Adr_Vorname, Adr_Nachname FROM Adressen
Mit dem Zusatz AS kann man die einzelnen Spalten benennen. Dies ist dann notwendig, wenn
z.B. in einem Sub-Select eine Spalte zweimal verwendet wird.
SELECT Adr_Vorname AS Vorname, Adr_Nachname AS Name FROM Adressen
3.3 Inhaltlich gleiche Zeilen von der Ausgabe ausschliessen
Manchmal möchte man lediglich wissen, welche Werte überhaupt in einer Spalte stehen, nicht
aber, wie oft sie vorhanden sind. Dazu ergänzt man die SELECT-Anweisung um den Zusatz
DISTINCT. Mit DISTINCT wird die Mehrfachausgabe inhaltlich gleicher Ausgaben unterdrückt.
DISTINCT kann nur eingesetzt werden, wenn sich die Abfrage auf nur eine Spalte bezieht.
SELECT DISTINCT Adr_Anrede From Adressen
3.4 Zeilen mit Bedingungen auswählen
Bei den meisten Abfragen sollen aus der Gesamtzahl der in einer Tabelle vorhandenen Zeilen
nur ganz bestimmte Zeilen gesucht und angezeigt werden. Dazu ist es notwendig, eine Suchbedingung zu vereinbaren.
Die Bedingung wird eingeleitet durch die Klausel WHERE. Darauf folgt der Bedingungsausdruck,
der sich wie folgt aufbaut:
WHERE
Spaltennamen
Vergleichsoperator
Vergleichswert
SELECT Adr_Vorname, Adr_Nachname, ATyp_ID
FROM Adressen
WHERE ATyp_ID = 2
Datenbank_SQL1.3.doc
Seite 10/37
Bernhard Bausch
Schulungsunterlagen Datenbanken
3.4.1 Operatoren
Operatoren sind Symbole für eine auszuführende Operation. Mit SQL können verschiedene Arten
von Operatoren eingesetzt werden. In diesem Abschnitt verwenden wir nur Basisoperatoren, die
auch Vergleichsoperatoren oder relationale Operatoren genannt werden:
Operator
=
<
>
<>
<=
>=
Bedeutung
gleich
kleiner als
grösser als
ungleich
kleiner gleich
grösser gleich
Besteht der Vergleichswert aus einer Zeichenkette oder einem Datum, so muss er in Hochkommata eingeschlossen werden.
Bei Zeichenketten genügt bereits ein Buchstabe, um die Zeilenauswahl zu definieren:
Bitte beide Varianten probieren
SELECT Adr_Nachname FROM Adressen WHERE Adr_Nachname < 'M'
SELECT Adr_Nachname FROM Adressen WHERE Adr_Nachname > 'M'
In dieser Abfrage wird der erste Buchstaben des Namens mit den Textkonstanten verglichen. Der
Vergleichswert gibt somit an, wie viele Stellen des Namens zum Vergleich herangezogen werden.
Ein stellenweises Abfragen ist bei numerischen Spalten und Spalten mit Datumswerten nicht
möglich. Hier wird jeweils der gesamte Wert eines Spaltenfeldes in den Vergleich einbezogen.
Zum Beispiel werden bei "WHERE gehalt > 5000" alle Zeilen mit einem Wert über 5000 angezeigt.
3.4.2 Spalten mit NULL-Werten Abfragen
Tabellenspalten, in denen keine Werte gespeichert sind, haben den Wert NULL. Der Wert NULL
entspricht weder der Zahl 0 noch einer Zeichenfolge mit Leerzeichen. Der Wert NULL kann abgefragt werden.
Bitte beide Varianten probieren
SELECT Adr_Nachname, Adr_Anrede FROM Adressen WHERE Adr_Anrede IS NULL
SELECT Adr_Nachname, Adr_Anrede FROM Adressen WHERE Adr_Anrede IS NOT NULL
3.4.3 Zeilen mit verbundenen Bedingungen suchen und anzeigen
Eine Bedingung kann sich aus mehreren Teilbedingungen zusammensetzen.
Bedingungen können durch die Operatoren UND und ODER zu einem komplexen Bedingungsausdruck verknüpft werden.
UND wird in SQL durch AND, ODER durch OR ausgedrückt.
SELECT Adr_Vorname, Adr_Nachname, Adr_Anrede, ATyp_ID FROM Adressen
WHERE Adr_Anrede = 'Frau' AND ATyp_ID = 2
Versuchen Sie dieselbe Abfrage mir OR und Sie werden sehr unterschiedliche Auswertungen erhalten.
Datenbank_SQL1.3.doc
Seite 11/37
Bernhard Bausch
Schulungsunterlagen Datenbanken
3.4.4 Logische Operatoren
Logischer
Operator
AND
Beispiel
Auswirkung
Anrede = 'Frau' AND
Adresstyp = 2
OR
Anrede = 'Frau' OR
Adresstyp = 2
NOT
NOT Anrede = 'Frau'
Es werden die Datenzeilen angezeigt, in denen beide
Einzelbedingungen erfüllt sind:
Angezeigt werden alle Frauen mit Adresstyp 2
Es werden die Datenzeilen ausgegeben, die entweder
die erste oder die zweite Bedingung erfüllen: Angezeigt werden alle Frauen sowie alle die dem Adresstyp
2 entsprechen (also auch Männer).
Es werden die Datenzeilen ausgegeben, die die Bedingung nicht erfüllen. Hier werden also nur die Männer ausgegeben.
Die Verknüpfung erfolgt nach folgenden Regeln:
AND-Verbindung
Teilbedingung 1
erfüllt
nicht erfüllt
erfüllt
nicht erfüllt
Teilbedingung 2
erfüllt
nicht erfüllt
nicht erfüllt
erfüllt
Gesamtbedingung
erfüllt
nicht erfüllt
nicht erfüllt
nicht erfüllt
OR-Verbindung
Teilbedingung 1
erfüllt
nicht erfüllt
erfüllt
nicht erfüllt
Teilbedingung 2
erfüllt
nicht erfüllt
nicht erfüllt
erfüllt
Gesamtbedingung
erfüllt
nicht erfüllt
erfüllt
erfüllt
Bedeutung von Klammern
Bei zusammengesetzten Bedingungsausdrücken kann die Reihenfolge der Auswertung durch
Klammern beeinflusst werden. Klammerinhalte werden immer zuerst bearbeitet.
Beispiel
1. Bedingung: Die Person muss eine Frau sein und
2. Bedingung: Die Person muss in Bern wohnen oder
3. Bedingung: Die Person muss in Zürich wohnen
Das Bedingungsgefüge ist so formuliert, dass die erste Bedingung unbedingt erfüllt sein muss.
Von der zweiten und dritten Bedingung braucht dagegen nur eine Bedingung erfüllt zu sein. Die
letzteren Bedingungen sind also durch OR zu verknüpfen und in ihrer Gesamtheit durch AND mit
der Geschlechtsbedingung zu verbinden.
Die SQL-Anweisung lautet:
SELECT Adr_Anrede, Adr_Vorname, Adr_Nachname,Adr_Ort FROM Adressen
WHERE Adr_Anrede = 'Frau' AND (Adr_Ort = 'Zürich' Or Adr_Ort = 'Bern')
Geben Sie zum Vergleich die Anweisung wie folgt ein.
SELECT Adr_Anrede, Adr_Vorname, Adr_Nachname,Adr_Ort FROM Adressen
WHERE Adr_Anrede = 'Frau' AND Adr_Ort = 'Zürich' Or Adr_Ort = 'Bern'
SELECT Adr_Anrede, Adr_Vorname, Adr_Nachname,Adr_Ort FROM Adressen
WHERE Adr_Anrede = 'Frau' OR Adr_Ort = 'Zürich' AND Adr_Ort = 'Bern'
Aus diesen Beispielen heraus sehen Sie, dass AND höhere Priorität hat bzw. bindet, gleich wie
eine Multiplikation gegenüber einer Addition.
Datenbank_SQL1.3.doc
Seite 12/37
Bernhard Bausch
Schulungsunterlagen Datenbanken
3.5 Aggregatfunktionen
Aggregatfunktionen (aggregate, deutsch: gesamt), auch Spaltenfunktionen genannt, ermitteln für
eine einzelne Tabellenspalte aus einer Gesamtmenge die Summe, den Minimal- oder Maximalwert, den Mittelwert oder die Anzahl.
Nachstehende Tabelle gibt eine Übersicht über Aggregatfunktionen und deren Ergebnisse:
Funktion:
MIN(spaltenname)
MAX(spaltenname)
COUNT(*)
COUNT(DISTINCT
spaltenname)
SUM(spaltenname)
AVG(spaltenname)
Ergebnis
Minimalwert
Maximalwert
Anzahl aller vorhandenen Zeilen
Anzahl der Zeilen mit unterschiedlichen Werten
Kann mit Access nicht verwendet werden.
Summe
Mittelwert
Der durchschnittliche Gehalt wird also wie folgt berechnet
SELECT AVG(Pd_Gehalt) FROM Persdat
In einer SELECT-Anweisung mit Aggregatfunktionen (und
ohne Gruppenbildung) können keine weiteren Spaltenwerte bzw. Spalten ohne Aggregatfunktionen angezeigt werden.
Folgende Anweisung macht also keinen Sinn
SELECT Pd_Name, MAX(Pd_Gehalt) FROM Persdat
Beispiele mit Aggregatfunktionen:
SELECT MAX(Pd_Name) From Persdat
Bei Zeichenketteninhalten wird der höchste Buchstaben nach dem ASCII-Code ermittelt. Das bedeutet, dass das "z" höher ist als das "a" und Sonderzeichen grösser sind als Kleinbuchstaben.
SELECT MIN(Pd_Eintritt) FROM Persdat
Diese Auswertung wird das Datum der ersten Anstellung hervorbringen. Möchte man den Namen
zu diesem Datum anzeigen, müsste der SELECT wie folgt lauten.
SELECT Pd_name, Pd_Vname, Pd_Eintritt FROM persdat
WHERE Pd_Eintritt = (SELECT MIN(Pd_Eintritt) FROM Persdat)
Hier arbeiten wir mit einem SUB-SELECT. Auf die Bedeutung von SUB-SELECT's gehen wir später ein. Da eine Aggregatfunktion immer nur einen gültigen Wert liefert, wird dieser SELECT auch
nur einen Namen hergeben, ausser es wurden am gleichen Datum mehrere Personen angestellt.
SELECT COUNT(*) As Anzahl_Personen FROM Persdat
Mit COUNT() wird festgestellt, wie viele Einträge vorliegen. Wenn Sie die Funktion COUNT() mit
dem Stern als Klammerinhalt benutzen, werden alle in der Tabelle enthaltenen Zeilen gezählt.
Wenn Sie die Anzahl von Zeilen mit unterschiedlichen Spaltenwerten suchen, müssen Sie in der
Klammer entsprechend verfahren.
SELECT DISTINCT COUNT(Pd_Eintritt) FROM Persdat
In diesem Beispiel werden nur Einträge mit unterschiedlichen Datumswerten gezählt. Weitere
Einschränkungen werden über die WHERE-Klausel geregelt.
Datenbank_SQL1.3.doc
Seite 13/37
Bernhard Bausch
Schulungsunterlagen Datenbanken
In einer einzigen Abfrage können auch mehrere Aggregatfuntionen eingesetzt werden.
SELECT COUNT(*), AVG(Pd_Gehalt) FROM Persdat
WHERE Pd_Geschlecht = "W"
In diesem SELECT wird ermittelt, wie viele Mitarbeiterinnen es gibt und wie hoch ihr Durchschnittsgehalt ist. Beide Aggregatfunktionen beziehen sich auf die gesamte Datenmenge, welche
in diesem Fall über die WHERE-Klausel auf die Mitarbeiterinnen eingeschränkt wurde.
3.6 Rechenoperationen durchführen
Im SELECT-Befehl kann man Ausdrücke für arithmetische Operationen vereinbaren. Die Ausdrücke werden mit den Rechenoperationen +,-,*,/ und mit den Aggregatfunktionen SUM() und AVG()
gebildet.
Tabellenunabhängige Rechenoperationen
Man kann mit SQL-Anweisungen Rechenoperationen wie mit einem Taschenrechner durchführen. Man muss dabei jedoch immer eine in der Datenbank vorhandene Tabelle ansprechen und
wenn man die Ergebnisausgabe auf eine Zeile beschränken will, muss man auch eine WHEREBedingung vereinbaren.
SELECT 4.9 * 1.9 AS Resultat FROM Persdat
WHERE Pd_ID = 3
Ausgabe: 9.31
Mit Werten aus numerischen Spalten rechnen
Mit den Werten aus numerischen Tabellenspalten können auch Additionen, Subtraktionen, Divisionen und Multiplikationen durchgeführt werden.
SELECT Pd_name, Pd_Gehalt * 1.045 AS Neues_Gehalt FROM Persdat
Die Anzeige diese Auswertung würde die Grundgehälter um 4.5% erhöhen.
Es können auch die Ergebnisse von Aggregatfunktionen in Rechenoperationen einbezogen werden. Folgende Anweisungen ermitteln beide mit dem selben Ergebnis das durchschnittliche Monatsgehalt.
SELECT AVG(Pd_Gehalt) FROM Persdat
SELECT SUM(Pd_Gehalt) / COUNT(*) FROM Persdat
Datenbank_SQL1.3.doc
Seite 14/37
Bernhard Bausch
Schulungsunterlagen Datenbanken
3.7 Mit Funktionen arbeiten
In jedem SELECT können Funktionen sowohl in der SELECT-Klausel wie auch in der WHEREKlausel eingesetzt werden. Eine Funktion liefert immer einen Wert, der entweder im SELECT-Teil
angezeigt wird oder im WHERE-Teil als Bedingung verwendet wird.
3.7.1 Numerische Funktionen
Numerische Funktionen sind diverse mathematische Funktionen, die der Manipulation numerischer Werte dienen.
Z.B ABS(zahl)
Absoluter Wert
SQR(zahl)
Quadratwurzel
RND()
Zufallszahl
Weitere Funktionen, die sehr Produktspezifisch sind, gibt es für Cosinus, Sinus,Tangens usw.
3.7.2 Datumsoperatoren und Datumsfunktionen
Die Rechenoperatoren + und – können mit Datumsspalten zum Addieren und Subtrahieren eingesetzt werden. Es gibt auch Funktionen wie MONTH_BETWEEN(datum,datum) (Oracle) wo
man direkt über die Funktion Datumsberechnungen anstellen kann.
Datumsfunktionen gehören nicht zum SQL-Standard. In jedem Datenbanksystem finden Sie deshalb andere Funktionen.
SELECT Format(#2000-3-1# -1,'dd.mm.yyyy') AS Datum
FROM Persdat
WHERE Persdat.Pd_ID=3
Dieses erste Beispiel gibt uns den letzten Tag des Monats Februar bekannt und ist eine Datumsberechnung ohne Einbezug von einem Attribut.
SELECT INT((NOW() - pd_eintritt)) AS Tage FROM Persdat
Dieses zweite Beispiel sagt uns, wie viele Tage alle Mitarbeiter bei der Firma arbeiten. Die Funktion INT() liefert uns Anzahl ganze Tage, weil sie Kommastellen unterdrückt, und die Funktion
NOW() liefert uns das aktuelle Datum.
3.7.3 Zeichenketten-, Umwandlungs- und anderer Funktionen
Mit Zeichenketten werden Strings (Textfelder) bearbeitet.
Beispiele sind
LTRIM() / RTRIM()
Löscht linksstehende bzw. rechtsstehende Leerzeichen.
TRIM()
Wie L- oder RTRIM, löscht leere Zeichen links und rechts.
SUBSTR() / MID()
Definiert Teile einer Zeichenkette. (Oracle / Access)
LENGTH()
Gibt die Anzahl Zeichen eines Strings an.
INSTR()
Nennt die Position eines Zeichens im String
3.7.4 Umwandlungsfunktionen
Eine Umwandlungsfunktion wandelt eine Zeichenkette in eine Zahl oder ein Datum um
und umgekehrt.
VAL(String)
Wandelt einen String in eine Zahl um.
STR(Zahl)
Wandelt eine Zahl in einen String um.
3.8 Prädikate
Ein Prädikat bezeichnet eine logische Bedingung. Folgende Operatoren sind Prädikate:
Alle Vergleichsoperatoren (siehe weiter oben)
LIKE-Operator
BETWEEN-Operator
IN-Operator
NULL-Operator
(Siehe Unterabfragen)
ALL- and ANY-Operator
Dito
EXIST-Funktion
Dito
Datenbank_SQL1.3.doc
Seite 15/37
Bernhard Bausch
Schulungsunterlagen Datenbanken
3.8.1 Operator LIKE
Beim Vergleich eines Textfeldes darf nicht der Operator "=" verwendet werden. Wollte man alle
Namen die mit einem M anfangen Mittels "WHERE Pd_Name = 'M'" abfragen, so würde kein
Namen angezeigt, weil eine Übereinstimmung gesucht würde. Hier muss der Operator LIKE verwendet werden. Ausserdem ist dem System mitzuteilen, dass die übrigen Buchstaben des Textfeldes keine Bedeutung für den Suchvorgang haben. Es müssen Platzhalter bzw. Jokerzeichen
für unbekannte oder unerhebliche Zeichen in das Textmuster einbezogen werden. Man unterscheidet folgende Jokerzeichen:
%
_
steht für eine beliebige Anzahl zeichnen,
(Unterstrich) steht für ein einziges Zeichen.
SELECT Pd_Name FROM Persdat
WHERE Pd_Name LIKE 'M%'
Access: LIKE 'M*'
Dieser Select sucht alle Mitarbeiter die mit M beginnen. Der Platzhalter % steht für beliebig viele
Zeichen hinter dem M.
SELECT Pd_Name FROM Persdat
WHERE Pd_Name LIKE 'Me_er'
Access: LIKE 'Me*er*'
In diesem Fall würden alle Meier und Meyer erscheinen, weil der dritte Buchstaben ein beliebiges
Zeichen sein kann. Dieser SELECT funktioniert in DB2 nicht, weil dort die gesamte CHAR(25)Spalte mit allen Leerzeichen berücksichtigt wird.
3.8.2 Operator BETWEEN
Der Operator BETWEEN wird zur Formulierung von Bereichsabfragen eingesetzt. Er kann bei
Textspalten, Datumsspalten und bei numerischen Spalten verwendet werden. BETWEEN wählt
die Daten aus, die sich zwischen einem unteren und oberen Grenzwert befinden.
SELECT Adr_NachnameFROM Adressen
WHERE Adr_Nachname BETWEEN 'S' AND 'Z'
Dieser SELECT gibt alle Namen ab dem Buchstaben S aus.
SELECT Pd_Name, Pd_Eintritt FROM Persdat
WHERE YEAR(Pd_Eintritt) BETWEEN 1990 AND 2000
In diesem SELECT werden alle Mitarbeiter, die zwischen dem Jahr 1990 und 2000 angestellt
wurden, ausgegeben. Man könnte natürlich auch ohne YEAR()-Funktion arbeiten und direkt ein
Datum eingeben.
3.8.3 Operator IN
Der IN-Operator ist vergleichbar mit der Elementabfrage in der Mengenlehre. Er stellt fest, ob der
Inhalt der befragten Spalte in einer der angegebenen Mengen enthalten ist. Der Operator IN kann
auf Zeichenspalten, Datumsspalten und numerischen Spalten angewendet werden. Hinter dem
Schlüsselwort IN werden in runden Klammern die Suchbegriffe einfach hintereinander aufgelistet.
SELECT Pd_Name, Pd_Eintritt FROM Persdat
WHERE YEAR(Pd_Eintritt) IN (1990, 1995)
Dieser SELECT wird alle Mitarbeiter auswählen, die in den beiden angegebenen Jahren angestellt wurden.
SELECT Pd_Name, Abt_ID FROM Persdat
WHERE Abt_ID IN (2,3)
Hier werden alle Mitarbeiter ausgegeben die in den entsprechenden Abteilungen arbeiten.
Datenbank_SQL1.3.doc
Seite 16/37
Bernhard Bausch
4
Schulungsunterlagen Datenbanken
Daten aus mehreren Tabellen abfragen (Joins)
4.1 Kartesisches Produkt aus zwei Tabellen bilden
Bei normalisierten Datenbanken müssen häufig zwei und mehr Tabellen abgefragt werden, um
die gewünschte Information zu erhalten. Dabei tritt das Problem auf, die an der Abfrage beteiligten Tabellen logisch in der richtigen Weise miteinander zu verknüpfen. Werden Tabellen ohne eine Verknüpfungsvorschrift in einer Abfrage verbunden, so wird bei der Ausführung der Abfrage
das kartesische Produkt gebildet. Dabei wird jede nur mögliche Kombination der verschiedenen
Zeilen in den Tabellen dargestellt. Das führt dazu, dass Tabellen mit wenigen Records bereits
tausende von Datensätze liefern.
4.2 Logische Verbingungen mit Equi-Join herstellen
Eine Verknüpfung von Tabellen kann nur dann gelingen, wenn bereits beim Entwurf darauf geachtet wurde, dass sie sich über Schlüsselspalten miteinander verbinden lassen. Dies wird über
die Vererbung eines Hauptschlüssels (Primary-Key) in eine andere Tabelle als Fremdschlüssel
(Secondary-Key) erreicht.
Man bezeichnet diese Verbindung auch als Equi-Join. Abkürzung Equi steht für "Gleichheit" und
Join ist mit "Verknüpfung" zu übersetzen. Die Namen der Schlüsselspalten in beiden Tabellen
müssen nicht gleich sein. Sind sie gleich, muss der Spaltennamen Qualifiziert werden. Dies geschieht, indem man den Tabellennamen dem Spaltennamen voranstellt.
Das folgende Beispiel soll diese Verknüpfung demonstrieren:
SELECT Adressen.Adr_ID, Adr_Vorname, Adr_Nachname,US_Stao_Buero, US_Tel_Int
FROM Adressen,Userinfo
WHERE Adressen.Adr_ID = Userinfo.Adr_ID
Als Bindeglied wird die Spalte Adr_ID verwendet, die in beiden Tabellen vorkommt. Da das System so nicht feststellen kann, in welcher Tabelle der Wert gesucht werden soll, muss die Redundanz des Spaltennamens durch Hinzufügen des Tabellennamens aufgehoben werden; der Spaltennamen Adr_ID muss qualifiziert werden.
Die Tabellennamen der zu verknüpfenden Tabellen werden alle hinter der FROM-Klausel aufgelistet.
Die Equi-Join-Bedingung in der WHERE-Klausel besagt, dass jene Zeilen auszwählen sind, deren Adr_ID's gleich sind.
4.3 Andersnamen bzw. Alias-Bezeichner für Tabellen vereinbaren
Bei der Eingabe einer Abfrage kann es lästig werden, wenn man immer wieder lange Tabellennamen wie "fmitglieder" eintasten muss. Deshalb arbeitet man in Joins gerne mit TabellenKurznamen, Andersnamen oder Alternativnamen. Alternativnamen werden auch benötigt, wenn
Tabellen auf sich selber zu beziehen sind.
Alternativnamen können synonyme Namen oder Alias-Namen sein.
4.3.1 Synonyme Tabellen-Bezeichner
Synonyme Bezeichnungen müssen mit folgender SQL-Anweisung derfiniert werden.
CREATE SYNONYM p FOR Persdat
Nach erfolgter Eingabe dieses SYNONYM-Befehls können Sie die Daten der Tabelle persdat alternativ wie folgt ansprechen:
SELECT * FROM p
Die Löschung von Synonymen erfolgt durch die Anweisung:
DROP SYNONYM p
In der Access wird die synonyme Tabellenbezeichnung nicht unterstützt.
Datenbank_SQL1.3.doc
Seite 17/37
Bernhard Bausch
Schulungsunterlagen Datenbanken
4.3.2 Alias-Bezeichner definieren
Es gibt auch die Möglichkeit, Kurzbezeichnungen nur für die Dauer einer Befehlsausführung zu
definieren. Wir nennen diese Bezeichner Alias-Bezeichner.
Alias-Namen werden in dem FROM-Zusatz des SELECT-Befehls vereinbart. Zwischen dem Tabellennamen und der nachgestellten Alias-Bezeichnung steht nur ein Leerzeichen. Sie können in
allen Datenbanksystemen eingesetzt werden.
Das weiter oben verwendete Beispiel für einen Equi-Join sieht mit Alias-Bezeichnungen wie folgt
aus:
SELECT A.Adr_ID, Adr_Vorname, Adr_Nachname,US_Stao_Buero, US_Tel_Int
FROM Adressen A,Userinfo U
WHERE A.Adr_ID = U.Adr_ID
4.4 OUTER- oder LEFT-, RIGHT-Join
Mit einem Inner-Equi-Join sind nicht alle Informationswünsche zu erfüllen. In ihm werden aus einer Tabelle sämtliche Records ausgegeben, denen aus einer anderen Tabelle Records aufgrund
übereinstimmender Schlüsselwerte zugeordnet werden.
In einem Equi-Join werden also nur Daten die gleiche Werte haben ausgegeben.
Nun gibt zusätzlich die Möglichkeit, dass von einer Tabelle sämtliche Records ausgegeben werden und von einer verbundenen Tabelle nur jene Records, wo eine Übereinstimmungen vorhanden ist. Eine solche Verbindung die uns das ermöglicht nennt man OUTER-Join.
Beim OUTER-Join ist zwischen der Haupttabelle und der nachgeordneten Tabelle zu unterscheiden. Jene ist die Haupttabelle, aus der sämtliche Records in die Ausgabe übernommen werden
sollen und von der nachgeordneten Tabelle werden nur jene Records übernommen die den gleichen Schlüsselwert haben.
Beispiel:
Im oben bereits erwähnten Beispiel sprechen wir zwei Tabellen an mit unterschiedlichen Daten.
In der Tabelle Adressen sind sämtliche Adressen gespeichert die im System vorhanden sind.
In der Tabelle Userinfo sind nur jene Adressen vorhanden (Schlüsselwert), die als Mitarbeiteradresse definiert wurde (Adresstyp = 1)
In unserem Beispiel ist also Adressen die Haupttabelle und Userinfo ist die nachgeordnete Tabelle. In der OUTER-Join-Abfrage muss nun die nachgeordnete Tabelle als solche kenntlich gemacht werden.
Left- und Right-Join sind Access-Speziefische Outer-Joins die definieren, ob die linke oder die
rechte Tabelle die nachgeordnete Tabelle ist.
Die verschiedenen Datenbanksysteme sind unterschiedlich in der Anwendung des OUTER-Join,
deshalb werden hier die wichtigsten vorgestellt.
INFORMIX
In INFORMIX wird in der FROM-Klausel die Tabelle durch ein vorangestelltes OUTER als nachgeordnete Tabelle gekennzeichnet. Der Outer-Join-Operator darf in einer Anweisung nur einmal
verwendet werden.
SELECT A.Adr_ID, Adr_Vorname, Adr_Nachname,US_Stao_Buero, US_Tel_Int
FROM Adressen A, OUTER Userinfo U
WHERE A.Adr_ID = U.Adr_ID
Datenbank_SQL1.3.doc
Seite 18/37
Bernhard Bausch
Schulungsunterlagen Datenbanken
ORACLE
In ORACLE wird in der WHERE-Klausel die Outer-Join-Spalte der nachgeordneten Tabelle durch
ein nachgestelltes (+) markiert. Gleich wie in INFORMIX darf der Equi-Join-Operator in einer Anweisung nur einmal verwendet werden.
SELECT A.Adr_ID, Adr_Vorname, Adr_Nachname,US_Stao_Buero, US_Tel_Int
FROM Adressen A, Userinfo U
WHERE A.Adr_ID = U.Adr_ID(+)
JET-Datenbank (Access)
In der JET-Datenbank können Sie JOIN-Operationen mit den Operatoren INNER JOIN, LEFT
JOIN und RIGHT JOIN erstellen. INNER JOIN entspricht dem normalen Equi-Join. LEFT JOIN
bewirkt, dass aus der links von LEFT JOIN genannten Tabelle auch jene Datensätze angezeigt
werden, denen kein Schlüsselwert aus der rechts genannten Tabelle entspricht. Bei RIGHTJOIN
ist es die Tabelle auf der rechten Seite.
Beispiele:
SELECT Adressen.Adr_Firma, Adressen.Adr_Vorname, Adressen.Adr_Nachname,
Userinfo.Us_Stao_Buero, Userinfo.Us_Tel_Int
FROM Adressen INNER JOIN Userinfo ON Adressen.Adr_ID = Userinfo.Adr_ID;
SELECT Adressen.Adr_Firma, Adressen.Adr_Vorname, Adressen.Adr_Nachname,
Userifo.Us_Stao_Buero, Userinfo.Us_Tel_Int
FROM Adressen LEFT JOIN Userinfo ON Adressen.Adr_ID = Userinfo.Adr_ID
Dieses letzte Beispiel macht zwar kein Sinn, weil es in Userinfo weniger Datensätze hat wie in
Adressen. Es soll nur den RIHGT JOIN darstellen.
SELECT Adressen.Adr_Firma, Adressen.Adr_Vorname, Userinfo.Us_Tel_Int,
Userinfo.Us_Stao_Buero, Adressen.Adr_Nachname
FROM Adressen RIGHT JOIN Userinfo ON Adressen.Adr_ID = Userinfo.Adr_ID
4.4.1 Verknüpfungen innerhalb der gleichen Tabelle (Self-Joins)
Logische Verknüpfung von Zeilen innerhalb der gleichen Tabelle nennt man Self-Joins oder AutoJoins. Vor der Verknüpfung spaltet man die Tabelle mit Alias-Bezeichnungen auf. Self-Joins laufen nicht in der Access Jet-Datenbank.
Beispiel: Wir wollen von der Tabelle Persdat wissen, welche männlichen Mitarbeiter das gleiche
Gehalt beziehen wie weibliche Mitarbeiter.
SELECT ma.Pd_Gehalt, ma.Pd_name, ma.Pd_Geschlecht, frau.Pd_Name, frau.Pd_Gehalt
FROM Persdat ma, Persdat frau
WHERE ma.Pd_Geschlecht = 'M' AND
frau.Pd_Geschlecht = 'W' AND
ma.Pd_Gehalt = frau.Pd_Gehalt
Die Join-Analyse zeigt, dass alle Infromationen in der Tabelle Persdat stehen. Deshalb wird die
Tabelle durch folgende Angabe in der FROM-Klausel in zwei Untertabellen aufgeteilt:
FROM Persdat ma, persdat frau
Die logische Zuordnung der Tabellenzeilen zu den Untertabellen erfolgt mit Zuordnungsbedingungen:
ma.Pd_Geschlecht = 'M'
frau.Pd_Geschlecht = 'W'
Datenbank_SQL1.3.doc
Seite 19/37
Bernhard Bausch
Schulungsunterlagen Datenbanken
Übung 1
Erstellen Sie ein Liste der vorhandenen Kundenadressen, mit den dazugehörigen Kontaktpersonen.
Attributte:
Relationen:
Adr_Firma, Adr_Adresse1, Adr_Plz, Adr_Ort, Kop_Name, Kop_Tel_intern
Adressen, Kontaktperson
Tip:
Kunden sind mit dem Adresstyp 3 definiert
Übung 2
Erstellen Sie eine Liste, welche pro Person alle zugeordneten Applikationen auflistet.
Attributte:
Relationen:
Adr_Name, Adr_Vname, Ap_Bez
Adressen, Applikationen, Appl_zu_User
Tips:
Namen und Applikation wurden über die Tabelle Appl_zu_User verknüpft
Übung 3
Erstellen Sie ein Inventar, das besagt, welche Person in welchem Büro besitzt was für Material.
Attributte:
Relationen:
Adr_Name, Adr_Vname, Ma_Bez, Us_Stao_Buero
Adressen, Userinfo, Mat_Detail, Mat_Art
Tips:
Mat_Detail ist die Verbindung zu Mat_Art
Datenbank_SQL1.3.doc
Seite 20/37
Bernhard Bausch
5
Schulungsunterlagen Datenbanken
Bedingungen in SELECT-Unterabfragen formulieren
(Subqueries)
Die Unterabfrage ist eine in Klammer eingeschlossene SELECT-Anweisung innerhalb der WHERE-Klausel einer anderen SELECT-Anweisung. Da die Unterabfragen innerhalb einer SELECTAbfrage angeordnet werden, nennt man sie auch nested queries. Man benötigt sie in den Fällen,
in denen die Suchbedingung vom Ergebnis einer anderen Abfrage abhängt.
Der Einsatz von Operatoren wie ALL, ANY, IN und EXISTS in Unterabfragen hat den Vorteil,
dass die zu suchenden Wert schneller geliefert werden, weil die Unterabfrage nur einmal ausgeführt werden muss. Wenn man einfache Vergleichsoperatoren verwendet muss eine Unterabfrage für jeden Record neu ausgeführt werden.
5.1 Regeln für den Einsatz von Unterabfragen
1. Wenn das Ergebnis einer Unterabfrage eine einzige Ergebnisreihe ist, kann die Unterabfrage
mit relationalen Operatoren eingeleitet werden.
2. Führt die Unterabfrage zu mehr als einer Ergebnisreihe, dann müssen die Operatoren ALL,
ANY, IN oder EXISTS eingesetzt werden
3. Wenn in der Unterabfrage nur geprüft werden soll, ob eine Tabellenzeile die gewünschte Bedingung erfüllt, wird der Operator EXISTS verwendet.
4. Unterabfragen werden in der Regel im Befehl SELECT eingesetzt. Sie können aber auch mit
den Befehlen INSERT und UPDATE verwendet werden.
5.2 Unterabfragen mit relationale Operatoren
Unterabfragen können in mehreren Ebenen geschachtelt sein. Sie werden in umgekehrter Reihenfolge der Ebenen abgearbeitet, die Unterabfrage auf der untersten Ebene immer zuerst. In
Unterabfragen können alle im Zugriff befindlichen Tabellen angesprochen werden, also auch die
Tabelle der Hauptabfrage. Ausser beim Einsatz des Operators EXISTS bezieht sich eine Unterabfrage stets nur auf eine Spalte.
Beispiel:
Wir wollen wissen, welche Mitarbeiter weniger als das durchschnittliche Gehalt beziehen.
Um diese Information zu erhalten sind zwei Schritte erforderlich
Schritt 1
SELECT AVG(Pd_Gehalt) FROM Persdat
Liefert als Ergebnis das Durchschnittsgehalt.
Schritt 2
SELECT Pd_Name, Pd_Gehalt FROM Persdat
WHERE Pd_Gehalt < (Ergebnis Schritt 1)
Unter Verwendung einer SELECT-Unterabfrage lautet die SQL-Anweisung wie folgt:
SELECT Pd_Name, Pd_Gehalt FROM Persdat
WHERE Pd_Gehalt <
(SELECT AVG(Pd_Gehalt) FROM Persdat)
Der Vergleichswert wird nicht mehr unmittelbar angegeben. Vielmehr wird er durch die eingeschachtelte Unterabfrage geliefert.
Beispiel:
SELECT Pd_Name, Pd_Vname, Pd_Gehalt FROM Persdat
WHERE Pd_Gehalt > (SELECT MAX(Pd_Gehalt) FROM Persdat
WHERE Abt_ID = 3)
Dieses Beispiel zeigt, welche Mitarbeiter mehr verdienen als jener mit dem höchsten Gehalt der
Abteilung 3.
Datenbank_SQL1.3.doc
Seite 21/37
Bernhard Bausch
Schulungsunterlagen Datenbanken
5.3 Unterabfrage mit ALL und ANY
Ist eine Unterabfrage einzuleiten, die einen oder mehrere Werte liefert, so sind die Operatoren
ALL und ANY, zusammen mit den relationalen Operatoren (<;<=;>;>=), zu verwenden.
Die hinter der WHERE-Bedingung des Haupt-SELECTs eingesetzte Vergleichsspalte, muss auch
in der Unterabfrage als Vergleichsspaltenname verwendet werden.
5.3.1 Operator ALL
Mit ALL (englisch: alle) wird in der Unterabfrage ein Vergleichswert aus einer Gruppe abgefragt.
Eine Gruppe in Persdat könnten z.B. die Mitarbeiter der Abteilung 3 sein und der Vergleichswert
könnte das Gehalt sein.
SELECT Pd_Name, Abt_ID, Pd_Gehalt FROM Persdat
WHERE Pd_Gehalt >= ALL
(SELECT Pd_Gehalt FROM Persdat
WHERE Abt_ID = 3)
In dieser Unterabfrage ermittelt der ALL-Operator aus allen vorhandenen Gehälter aus der Abteilung 3 das Höchste und gibt diesen Wert an die Hauptabfrage zurück. Ist das höchste Gehalt der
Abteilung 3 5200, dann wir jede Zeile mit "WHERE Pd_Gehalt >= 5200" ausgewertet.
Eine Unterabfrage darf sich auch auf eine Spalte beziehen, die in der Hauptabfrage angesprochen wird. Diese Form der Unterabfrage nennt man abhängige, korrelierte Unterabfrage.
Folgendes Beispiel soll das Dokumentieren:
SELECT p.Pd_ID, Pd_Name FROM Persdat p
WHERE 4000 < ALL
(SELECT Mg_Gehalt FROM Mgehalt_Daten g
WHERE p.Pd_ID = g.Pd_ID AND
Mg_Jahr = 01 AND
Mg_Monat = 2)
Dieses Beispiel zeigt, welche Mitarbeiter im Februar 2001 mehr als Fr. 4000 verdienen. Die in
der Unterabfrage enthaltene JOIN-Verknüpfung der beiden Tabellen Persdat und MGehalt wird
über eine Spalte der Hauptabfrage gesteuert.
Die relationalen Operatoren bestimmen beim ALL-Operator ob jeweils der höchste oder der niedrigste Wert der selectionierten Datenmenge aus der Unterabfrage zum tragen kommt
Operator
> ALL
>= ALL
< ALL
<= ALL
Auswahl in der
Vergleichsgruppe
höchster Wert
höchster Wert
kleinster Wert
kleinster Wert
Anzeige mit der Hauptabfrage:
Alle Zeilen mit ...
grösseren Vergleichswerten
grösser oder gleichen Vergleichswerten
geringeren Vergleichswerten
geringeren oder gleichen Vergleichswerten
Zeichenfelder als Vergleichsspalte:
Bei Zeichenfeldern kommt an die Stelle grösserer und kleinerer numerischer Werte die Sortierung
im ASCII-Code zum Tragen.
Datumsfeld als Vergleichsspalte
Bei Datumsfelder wird das grössere oder kleinere Datum verglichen.
Beispiel für eine Auswertung der geringeren Vergleichswerte mit Datum.
SELECT Pd_Name, Pd_Eintritt FROM persdat
WHERE Pd_Eintritt < ALL
(SELECT Pd_Eintritt FROM Persdat
WHERE Abt_ID = 3)
Diese Auswertung wird alle Mitarbeiter ausgeben, die früher als der Mitarbeiter mit dem niedrigsten Eintrittdatum aus der Abteilung 3 eingetreten ist.
Datenbank_SQL1.3.doc
Seite 22/37
Bernhard Bausch
Schulungsunterlagen Datenbanken
5.3.2 Operator ANY
Der Operator ANY (englisch: irgendeiner) fragt bei > ANY in der Unterabfrage ab, welcher Wert
grösser ist als irgendein Wert in der Vergleichsgruppe. Das ist jeder Wert der grösser ist als der
kleinste Gruppenwert.
Bei < ANY lautet die Frage: Welcher Wert ist kleiner als irgendein Wert in der Vergleichsgruppe?
Das ist jeder Wert, der kleiner ist als der grösste Gruppenwert.
Auch der ANY-Operator kann mit Zeichen- und Datumsfeldern kombiniert werden.
Die folgende Übersicht zeigt die Wirkungsweise der relationalen Operatoren mit ANY allgemein
an:
Operator Auswahl in der
Anzeige mit der Hauptabfrage:
Vergleichsgruppe Alle Zeilen mit ...
> ANY
kleinster Wert
grösseren Vergleichswerten
>= ANY
kleinster Wert
grösser oder gleichen Vergleichswerten
< ANY
grösster Wert
geringeren Vergleichswerten
<= ANY
grösster Wert
geringeren oder gleichen Vergleichswerten
Beispiel:
SELECT Pd_Name, Abt_ID, Pd_Gehalt FROM Persdat
WHERE Pd_Gehalt > ANY
(SELECT Pd_Gehalt FROM Persdat
WHERE Abt_ID = 3)
Dieser SELECT bringt jene Mitarbeiter, deren Gehalt grösser ist als das kleinste Gehalt der Abteilung 3.
5.4 Unterabfragen mit IN und EXISTS
Die Operatoren IN und EXIST prüfen in der Unterabfrage, ob eine in der Hauptabfrage gestellte
Bedingung erfüllt wird.
5.4.1 Operator IN
Der Operator IN wird in der Regel zur Suche in anderen Tabellen eingesetzt. Er prüft nacheinander für jeden Wert aus der Vergleichsspalte der Haupttabelle, ob dieser Wert in der Vergleichsspalte der Untertabelle steht, bei NOT IN, ob er nicht darin steht. Die Namen der Vergleichsspalten in der Hauptabfrage und in der Unterabfrage müssen gleich sein.
Die Hauptabfrage kann sich auf mehrere Tabellen beziehen. In der Unterabfrage ist auch eine
WHERE-Klausel zulässig.
Beispiel:
SELECT Pd_ID, Pd_Name, Pd_Vname FROM Persdat p
WHERE Pd_ID NOT IN
(SELECT Pd_ID FROM Familienmitglieder f
WHERE p.Pd_ID = f.Pd_ID)
In diesem Beispiel will man wissen, welche Mitarbeiter keine Familienmitglieder haben.
5.4.2 Operator EXISTS
Wenn in der Unterabfrage nur geprüft werden soll, ob die darin gültigen Vergleichswerte, im aktuellen Wert der Hauptaufgabe existieren, so wird der Operator EXISTS verwendet
Beispiel:
SELECT Pd_ID, Pd_Name FROM Persdat p
WHERE EXISTS
(SELECT * FROM Familienmitglieder f
WHERE p.Pd_ID = f.Pd_ID)
Datenbank_SQL1.3.doc
Seite 23/37
Bernhard Bausch
Schulungsunterlagen Datenbanken
In der Untertabelle darf hinter FROM nur eine einzige Tabelle aufgeführt werden, weil der
EXISTS-Operator keine Join-Bedingungen zulässt. Vor dem EXISTS-Operator wird kein definitiver Spaltennamen eingesetzt.
Mit NOT EXISTS wird die Komplementärmenge der Tabelle angezeigt. Die Unterabfrage mit
EXISTS wird in der Regel mit SELECT * eingeleitet. An die Stelle des Sterns kann auch irgendein
Spaltennamen aus der Haupttabelle treten.
Da bei EXISTS keine Vergleichsspalte die Verbindung zwischen Haupt- und Unterabfrage herstellt, muss die Verknüpfung in der WHERE-Bedingung der Unterabfrage vereinbart werden.
5.5 Synchronisierte Unterabfragen
In synchronisierten Abfragen wird in der Unterabfrage dieselbe Tabelle wie in der Hauptabfrage
angesprochen. Um Vergleichsfelder in der Haupt- und in der Unterabfrage ansprechen zu können, wird die Tabelle aufgeteilt, indem der Tabelle in der Haupt- oder Unterabfrage oder in beiden
ein Alias-Bezeichner zugeordnet wird.
SELECT Pd_ID, Abt_ID, PD_Gehalt FROM Persdat a
WHERE Pd_Gehalt >
(SELECT AVG(Pd_Gehalt) FROM Persdat
WHERE Abt_ID = a.Abt_ID)
In diesem Beispiel werden jene Gehälter angezeigt, welche grösser als die Durchschnittsgehälter
der Mitarbeiter in der selben Abteilung sind.
In dieser Abfrage reicht es nicht aus, dass die Unterabfrage nur einmal ausgeführt wird. Es muss
jedem Gehalt aus der Hauptabfrage das Durchschnittsgehalt der zutreffenden Abteilung gegenübergestellt werden. Dazu wird die Hauptabfrage die Alias-Bezeichnung a zugeordnet, damit
über die Spalte Abt_ID die Verknüpfung innerhalb der gleichen Tabelle definiert werden kann.
Die Unterabfrage wird für jede Zeile der Hauptabfrage durchgeführt.
5.6 Unterabfragen im Befehl INSERT
Die SELECT-Unterabfrage im INSERT-Befehl überträgt Daten aus einer oder mehreren Quelltabellen in eine Zieltabelle, die bereits angelegt sein muss.
Die Anweisung INSERT SELECT gestattet die Übertragung aller oder ausgewählter Zeilen und
Spalten der Quelltabellen in die Zieltabelle. Die Spalten der Zieltabelle müssen im Typ und in der
Grösse genau den Spalten der Quelltabellen entsprechen. Eine Übereinstimmung der Spaltennamen kann mit dem Zusatz AS erfolgen.
Beispiel: Löschen Sie zuerst die Tabelle Ueb
Erstellen Sie mit CREATE TABLE die Tabelle ueb neu:
CREATE TABLE Ueb
(Pd_ID LONG, Ue_Gehaltfzu NUMERIC, Ue_Pdeckung NUMERIC)
INSERT INTO Ueb
SELECT Pd_ID, Pd_Gehalt as Ue_Gehaltfzu , Pd_Gehalt * 3.6 AS Ue_Pdeckung
FROM Persdat
In der neuen Tabelle ueb, werden aus der Tabelle persdat die Personalnummer (Pd_ID) und das
mit dem Faktor 3.6 multiplizierte Gehalt übertragen.
Übung:
Kopieren sie alle Daten aus der Tabelle MGehalt_Daten in die Tabelle MGehalt
Datenbank_SQL1.3.doc
Seite 24/37
Bernhard Bausch
Schulungsunterlagen Datenbanken
5.7 Unterabfragen im Befehl UPDATE
SELECT-Unterabfragen können bei der UPDATE-Anweisung sowohl in der WHERE-Klausel als
auch in der SET-Klausel eingesetzt werden.
5.7.1 Select-Unterabfrage in der WHERE-Klausel
Mit der SELECT-Unterabfrage in der WHERE-Klausel des UPDATE-Befehls werden die Zeilen
und die Spalten definiert, in denen Aktualisierungen erfolgen sollen.
UPDATE ueb
SET Ue_Gehaltfzu = Ue_Gehaltfzu + 99
WHERE Pd_ID IN
(SELECT Pd_ID FROM MGehalt_Daten
WHERE
Mg_Jahr
=1
AND
Mg_Monat = 1
AND
Mg_Gehalt < 3000)
Im Beispiel wird das Gehalt in der Spalte Ue_Gehaltfzu der Tabelle Ueb um Fr. 99.— für die Mitarbeiter, die im Januar 2001 weniger als Fr. 3000.— verdient haben, erhöht.
In der SET-Klausel der UPDATE-Anweisung wird mit dem Ausdruck Ue_Gehaltfzu + 99 die Erhöhung vereinbart. In der SELECT-Unterabfrage wird definiert, dass nur die Zeilen in der Tabelle
ueb berüchsichtigt werden dürfen, in denen im Januar des Jahres 2001 (1) die Spalte Mg_Gehalt
der Tabelle MGehalt_Daten einen Betrag unter Fr. 3000 ausweist
5.7.2 SELECT-Unterabfrage in der SET-Klausel
Mit dem SELECT-Befehl direkt hinter SET wird der Wert definiert, der in die Spalte hineingeschrieben werden soll (läuft nicht in Access).
UPDATE Ueb
SET Ue_Gehaltfzu =
(SELECT SUM(FM_Zuschlag) + Ue_Gehaltfzu
FROM FMitglieder f
WHERE f.Pd_ID = Ueb.Pd_ID)
WHERE Pd_Id IN
(SELECT Pd_ID FROM FMitglieder)
In diesem Beispiel soll in der Tabelle Ueb, in die Spalte Ue_Gehaltfzu, die Familienzuschussbeträge aus der Tabelle FMitglieder addiert werden. Das können mehrere Einträge pro Mitarbeiter
sein, z.B. Kinderzulage. Familienzulage erhalten nur die Mitarbeiter, die in der Tabelle FMitglieder
auch einen Eintrag und somit Anspruch haben.
Der erste SUB-SELECT liefert den Betrag der geändert werden soll und ist mit der Tabelle Ueb
verbunden.
Der zweite SUB-SELECT beschränkt die Daten in der WHERE-Klausel auf die Einträge der Mitarbeiter, die Familienmitglieder haben. Ohne diese Einschränkung würden alle Gehälter der Mitarbeiter die keine Familienmitglieder haben auf 0 gesetzt. Das deshalb, weil ohne WHEREKlausel der UPDATE-Befehl für alle Datensätze gilt.
Datenbank_SQL1.3.doc
Seite 25/37
Bernhard Bausch
6
Schulungsunterlagen Datenbanken
Daten sortieren und gruppieren
Daten lassen sich leichter auswerten, wenn sie sortiert oder in Gruppen zusammengefasst werden. Im SELECT-Befehl gibt es für das Sortieren den Zusatz ORDER BY und für das Gruppieren
die Klausel GROUP BY.
6.1 Daten Sortieren
Beim Sortieren wird eine bestimmte Reihenfolge für die Ausgabe der Ergebniszeilen festgelegt.
Dabei können die Werte jeder Spalte als Sortierkriterium vereinbart werden.
Sortiert werden Ziffern und Zeichenfolgen nach dem ASCII-Code. Das bedeutet bei Zeichenketten, dass Ziffern vor Grossbuchstaben, Grossbuchstaben vor Kleinbuchstaben und Kleinbuchstaben vor Sonderzeichen angeordnet werden.
SELECT Pd_ID, Pd_Name, Pd_Vname FROM Persdat
WHERE Pd_Geschlecht = 'W'
ORDER BY Pd_Name DESC
Die Sortierung wird durch die ORDER-BY-Klausel veranlasst.
Die aufsteigende Sortierung ASC (ascending = aufsteigend) ist die Voreinstellung der ORDERBY-Klausel. Nur wenn absteigend DESC (descending = absteigend) sortiert werden soll, muss
dies im ORDER-Zusatz ausdrücklich vermerkt werden.
Sortiert wird nur, wenn der hinter ORDER BY genannte Spaltenname auch in der SELECTKlausel angegeben ist. Es genügt allerdings auch, wenn man zur Spaltenauswahl das Zeichen *
einsetzt. Die ORDER-BY-Klausel muss innerhalb der SELECT-Anweisung immer die letzte
Klausel sein. Man kann in der ORDER-BY-Struktur anstelle von Spaltennamen auch Spaltennummern einsetzen.
SELECT Pd_ID, Pd_Name, Pd_Vname FROM Persdat
WHERE Pd_Geschlecht = 'W'
ORDER BY 2 DESC
Die Reihenfolge, in der man hinter SELECT die Spaltennamen einsetzt, bestimmt die Spaltennummer. Pd_ID = 1, Pd_Name = 2, Pd_Vname = 3.
Es können mehrere Spalten benannt werden, nach denen die Sortierung durchgeführt werden
soll. Die Sortierung erfolgt dann hierarchisch so, dass die Sortierung nach dem zweiten Spaltennamen innerhalb der Sortierung nach dem ersten Spaltennamen erfolgt, die Sortierung nach dem
dritten Spaltennamen innerhalb der Sortierung nach dem zweiten Spaltennamen usw.
SELECT Pd_ID, Pd_Name, Pd_Vname, Abt_ID FROM Persdat
WHERE Pd_Geschlecht = 'W'
ORDER BY 4, 2 DESC, 3
Die Zeilen dieses Beispiels werden zuerst nach Abteilung sortiert und innerhalb der Abteilung
nach Namen (absteigend) und dann nach Vornamen.
Die Sortierklausel ist unabhängig davon, ob Joins eingesetzt werden oder nicht. Sie steht allein
im Zusammenhang mit der SELECT-Klausel.
6.2 Zeilen gruppieren
Eine Vielzahl von Informationswünschen bezieht sich auf Gruppen von Daten. So können Leistungen von verschiedenen Aufträgen in Gruppen zusammengefasst werden. Die Leistungen pro
Auftrag stellen in diesem Zusammenhang eine Gruppe dar.
Gruppieren heisst somit, dass solche Zeilen zu einer Ausgabe zusammengefasst werden, die die
Gleichen Werte haben. Ein Gruppenwechsel finden immer dann statt, wenn sich der Wert der
Gruppenspalte ändert.
Datenbank_SQL1.3.doc
Seite 26/37
Bernhard Bausch
Schulungsunterlagen Datenbanken
Als Gruppenspalte könnte z.B. die Spalte Pd_Geschlecht in Persdat eingesetzt werden.
SELECT Pd_Geschlecht, Count(*) FROM Persdat
GROUP BY Pd_Geschlecht
Dieser SELECT würde zwei Zeilen ausgeben, je mit der Anzahl weiblicher und männlicher Angestellter.
In Verbindung mit GROUP-BY können in der SELECT-Klausel, zusätzlich zu den Aggregatfunktionen, Attribute verwendet werden.
Der GROUP-BY-Zusatz steht hinter der SELECT-Anweisung nach den Zusätzen FROM und
WHERE und vor der ORDER-BY-Klausel. Der Gruppenbegriff wird, durch eine Leerstelle getrennt, hinter die GROUP-BY-Klausel geschrieben.
SELECT A.Abt_ID, Abt_Bez, SUM(Pd_Gehalt) FROM Persdat P, Abteilung A
WHERE P.Abt_ID = A.Abt_ID and
P.Abt_ID BETWEEN 1 AND 3
GROUP BY A.Abt_ID, Abt_Bez
ORDER BY A.Abt_Bez
Dieser SELECT gibt die Lohnsumme der Abteilung 1, 2 und 3 aus. Die Gruppierung bezieht sich
eigentlich nur auf die Abt_ID, erfolgt aber auch auf Abt_Bez. Das ist aus folgendem Grund erforderlich:
Alle hinter einem SELECT angegebenen Spalten müssen auch hinter der GROUP-BY-Klausel
aufgeführt werden müssen.
Lediglich Aggregatfunktionen werden nicht in der GROUP-BY-Klausel aufgeführt.
Bitte beachten Sie auch in diesem Beispiel, dass Abt_Id aus der gleichen Tabelle stammen muss
wie die Aggregatfunktion. Versuchen Sie die gleiche Aufgabe mit der Abt_ID von Persdat.
Bei der obigen Aufgabenstellung handelt es sich um einen einstufigen Gruppenwechsel. Die
Gruppenwechsel können aber auch mehrstufig erfolgen.
SELECT P.Abt_ID, MG.Mg_Jahr, SUM(Mg_Gehalt) AS 'Total Jahr'
FROM Persdat P, MGehalt MG
WHERE P.Pd_ID=MG.Pd_ID
GROUP BY P.Abt_ID, MG.Mg_Jahr
ORDER BY P.Abt_ID, MG.Mg_Jahr
Bei dieser Abfrage handelt es sich um einen zweistufigen Gruppenwechsel. Die Abteilung
(Abt_ID) stellt die Obergruppe dar und das Jahr (Mg_Jahr) aus MGehalt stellt die Untergruppe
dar. Die Reihenfolge erfolgt durch die Reihenfolge der Einträge hinter der GROUP-BY-Klausel.
Zuerst wird die Abteilung bestimmt und dann innerhalb der Abteilung für jedes Jahr eine Gesamtlohnsumme berechnet.
Gruppierung in Unterabfragen
Gruppierungen können auch in verschachtelten Abfragen eingebracht werden.
Das unten stehende Beispiel soll nur verdeutlichen wie komplex verfahren werden kann.
Ansonst ist das Beispiel ohne Beschreibung.
SELECT p.Pd_ID, Pd_Name, p.Abt_Bez FROM Perdat p, Abteilung a
WHERE p.Pd_ID = a.Pd_ID AND
p.Pd_ID IN (Select Pd_ID FROM TPosten
WHERE TP_ID IN (SELECT Ta_ID FROM Tarten
WHERE Ta_Bez LIKE 'Kalkulation') AND
TP_AufNr = 1111
GROUP BY Pd_ID)
Datenbank_SQL1.3.doc
Seite 27/37
Bernhard Bausch
Schulungsunterlagen Datenbanken
6.3 Gruppen bedingungsabhängig auswählen mit HAVING.
Bei der gruppenorientierten Auswertung interessieren oftmals nur die Gruppen, bei denen eine
bestimmte Bedingung erfüllt ist. Mit der HAVING-Klausel kann man eine Bedingung vereinbaren,
unter der ein Gruppenergebnis ausgegeben wird.
SELECT Abt_ID, COUNT(*) FROM persdat
GROUP BY Abt_ID
HAVING COUNT(*) > 2
In diesem Ergebnis werden nur die Abteilungen angezeigt, in denen mehr als 2 Mitarbeiter beschäftigt sind oder anders definiert, die HAVING-Klausel verlangt, dass mindestens 3 Datensätze
pro Abteilung verlangt werden um zur Anzeige zu gelangen.
Die HAVING-Klausel kann nur zusammen mit und für den Befehlsteil GROUP BY verwendet
werden. Für die Formulierung der Bedingung hinter HAVING gelten die gleichen Regeln wie bei
der WHERE-Klausel, mit der die Zeilenauswahl aus einer Tabelle vereinbart wird. Es können alle
Operatoren genutzt sowie Unterabfragen eingeleitet werden. Es gibt jedoch eine wichtige Einschränkung. Ausser den Aggregatfunktionen SUM(), AVG(), MIN(), MAX() und COUNT(), können
keine Funktionen in der HAVING-Bedingung eingesetzt werden.
SELECT Mg_Monat, Pd_Name, Pd_Geschlecht, SUM(Mg_Gehalt)
FROM Persdat p, MGehalt m
WHERE p.Pd_ID = m.Pd_ID
GROUP BY Mg_Monat, Pd_Name, Pd_Geschlecht
HAVING SUM(Mg_Gehalt) > 5000
ORDER BY Mg_Monat
In dieser Anweisung erfolgt die Gruppenbildung nach Massgabe des Monats, des Mitarbeiternamens sowie des Geschlechtes. Hier wird das Gehalt jeder Zeile als Summe definiert. So ist es
möglich, im Zusammenspiel mit GROUP BY, einzelne Attribute zusammen mit einer Aggregatfunktion darzustellen. Mit der HAVING-Klausel wird festgelegt, dass nur solche Zeilen anzuzeigen
sind, in denen das Gehalt den Betrag von 5000 übersteigt. In der WHERE-Klausel könnte noch
der Monat eingeschränkt werden.
Datenbank_SQL1.3.doc
Seite 28/37
Bernhard Bausch
7
Schulungsunterlagen Datenbanken
Ergebnisausgaben verbinden mit UNION, INTERSECT, EXCEPT
7.1 Operator UNION
Mit UNION können SELECT-Abfragen verbunden werden. Die Ergebnisausgabe des Verbundes
enthält sämtliche Ergebniszeilen der verbundenen Einzelabfragen. In der Sprache der Mengenlehre ausgedrückt, bewirkt der UNION-Operator die Vereinigung von Mengen.
Voraussetzung für die UNION-Klausel ist, dass die in der Spaltenauswahl genannten Spalten in
Typ und Grösse in beiden SELECT-Anweisungen übereinstimmen. Eine Namensübereinstimmung ist nicht erforderlich.
Die Übereinstimmung der Spaltentypen und Spaltengrössen kann auch mit Ersatzspalten hergestellt werden. Für ein Textfeld kann im zweiten SELECT eine Leerzeichenkette ("
") oder
für ein numerisches Feld eine (0) definiert werden. Dies ist allerdings von Datenbank zu Datenbank unterschiedlich.
SELECT 'Abt.Leiter: ', p.Pd_ID, Pd_Name, p.Abt_ID
FROM persdat p, Abteilungsleiter a
WHERE p.Pd_ID = a.Pd_ID AND
a.Abt_ID = 3
UNION
SELECT 'Mitarbeiter: ', Pd_ID, Pd_Name, Abt_ID
FROM persdat
WHERE Abt_ID = 3 AND
Pd_ID NOT IN (SELECT Pd_ID FROM Abteilungsleiter)
In diesem Beispiel gehen wir davon aus, dass wir eine Tabelle Abteilungsleiter haben, wo für
jede Abteilung einen Abteilungsleiter definiert ist.
Dieser SELECT gibt uns folgende Auswertung:
Abt.Leiter:
Mitarbeiter
Mitarbeiter
Pd_ID
57
58
99
Pd_Name
Meyer
3
Bolliger
Willemann
Abt_ID
3
3
Der erste SELECT ermittelt den Abteilungsleiter der Abteilung 3, wobei wir davon ausgehen,
dass die Tabelle Abteilungsleiter mind. die Attribute Pd_ID und Abt_ID und so als Verbindungstabelle fungiert. Um den Namen darzustellen muss die Tabelle Abteilungsleiter mit der Tabelle
Persdat verbunden werden.
Im zweiten SELECT werden die Mitarbeiter der Abteilung 3 hinzugefügt. Um zu verhindern, dass
der Abteilungsleiter zweimal erscheint, muss er in der Tabelle Persdat unterdrückt werden, weil
der Abteilungsleiter dort als Mitarbeiter der Abteilung 3 definiert ist.
Übung:
Fügen Sie diesem Beispiel noch den Abteilungsname (Abteilung.Abt_Bez) hinzu.
7.2 Operator INTERSECT
Der INTERSECT-Operator besteht aus der Schnittmenge zweier Mengen A und B und liefert uns
alle Elemente, die sowohl in der Menge A als auch in der Menge B enthalten sind.
Es werden aus zwei SELECT-Ergebnissen jene Zeilen aus der ersten SELECT-Abfrage angezeigt, die auch in der Ausgabe der zweiten Abfrage enthalten sind.
7.3 Operator EXCEPT/MINUS
Der EXCEPT Operator besteht aus der Differenzmenge zweier Mengen A und B. Es werden aus
der Menge A nur jene Element geliefert, die nicht auch zu Menge B gehören
Es werden aus zwei SELECT-Ergebnissen jene Zeilen aus der ersten SELECT-Abfrage angezeigt, die nicht in der zweiten Abfrage vorhanden sind.
Datenbank_SQL1.3.doc
Seite 29/37
Bernhard Bausch
8
Schulungsunterlagen Datenbanken
Sichten verwenden
Mit SELECT-Anweisungen werden Daten entsprechend einer gewünschten Sichtweise aus einer
oder mehreren Tabellen zusammengestellt. Solche Sichtweisen auf die Daten können mit der
Anweisung CREATE VIEW gespeichert werden. Gespeicherte Sichtweisen nennt man Views
(deutsch: Ansichten). Views enthalten keine Daten, sonden "Zeiger". Die Zeiger weisen auf die
Datenspalten in den Basistabellen. Views charakterisiert man deshalb auch als virtuelle oder
imaginäre Tabellen.
Mit Einschränkungen kann man mit Views in der gleichen Weise arbeiten wie mit Basistabellen.
Änderungen in Views bewirken gleichzeitig Änderungen in den echten Tabellen und umgekehrt.
Dies gilt jedoch nur, wenn sich die Sicht in der FROM-Klausel auf nur eine einzige Tabelle bezieht und die Spalten keine Funktionen oder arithmetischen Operationen enthalten.
Man kann sie mit:
- SELECT abfragen,
- INSERT ergänzen,
- UPDATE ändern und mit
- DELETE Daten löschen.
8.1 VIEW erstellen
Beim erstellen einer VIEW wird also eine virtuelle Tabelle erzeugt. Unter dem Namen, mit welchem man die View erstellt, wird in den Systemtabellen, in einer speziellen Viewtabelle, der zugehörige SELECT hinterlegt. Bei Datenabfragen mit Views werden zuerst die Anweisungen in der
Viewtabelle ausgeführt. Erst danach kann auf die Daten in den Basistabellen zugegriffen werden.
Views benötigen deshalb längere Laufzeiten und legen im Ablauf der Befehlsdurchführung mehrere temporäre Tabellen an. Das kann sogar dazu führen, dass fehlenden Speicherplatztes wegen eine Anweisung nicht ordnungsgemäss ausgeführt werden kann.
CREATE VIEW Gehalt1 AS
SELECT p.Pd_ID, Pd_Name, Abt_Bez, Mg_Gehalt
FROM Persdat p, Abteilung a, MGehalt m
WHERE p.Pd_ID = m.Pd_ID
AND
p.Abt_ID = a.Abt_ID
AND
Mg_Jahr = 99
AND
Mg_Monat = 1
Access kennt keine Views, es arbeitet mit Abfragen.
Hier werden die Werte der Spalten Pd_ID und Pd_Name aus der Tabelle Persdat, der Abteilungsname aus der Tabelle Abteilung und die Januargehälter aus der Tabelle MGehalt in die
View Gehalt1 übertragen.
Der erste Teil der CREATE-VIEW-Anweisung dient der Festlegung des View-Namens. Da keine
Angaben zu Spaltennamen gemacht wurden, übernimmt das System die Spaltennamen der Basistabellen.
Der zweite Teil der CREATE-VIEW-Anweisung – die AS-SELECT-Anweisung – definiert die
Auswahl in den Basistabellen.
ORDER-BY- und UNION-Klausel können in Views nicht eingesetzt werden.
CREATE VIEW Auftrab (TP_ID, Kosten) AS
SELECT TP_AufNr, SUM(TP_Std * TT_Preis)
FROM TPosten tp, Tarten ta
WHERE tp.TT_ID = ta.TT_ID
GROUP BY TP_AufNr
Beispiel ohne Beschreibung.
Werden im SELECT-Teil der View-Anweisung SQL-Funktionen und arithmetische Operationen
verwendet, so müssen die View-Spalten ausdrücklich hinter dem View-Namen in runden Klammern definiert werden. Ausnahme Access. In Access muss der Aliasnamen für Spalten in der
SELECT-Klausel definiert werden.
Datenbank_SQL1.3.doc
Seite 30/37
Bernhard Bausch
Schulungsunterlagen Datenbanken
8.2 View ausgeben
Daten aus einer View werden wie Daten aus Basistabellen, mit dem SELECT-Befehl, angezeigt.
SELECT * FROM Gehalt1
8.3 View löschen
Mit der Anweisung DROP VIEW wird eine View wieder gelöscht.
DROP VIEW Auftrab
Access: DROP TABLE Auftrab
8.4 Mit VIEWS Daten aktualisieren
Aktualisieren ohne Prüfoption
Mit Views können die Daten in Basistabellen aktualisiert werden.
CREATE VIEW Maenner AS
SELECT Pd_ID, Pd_Name, Pd_Geschlecht
FROM Persdat
WHERE Geschlecht = 'M'
Diese View erlaubt nur eine Sicht auf alle männlichen Mitarbeiter.
INSERT INTO Maenner
VALUES(50, 'Frauenfelder', 'M'
Durch diese Anweisung wird ein neuer Datensatz in der Tabelle Persdat eingefügt.
UPDATE Maenner
SET Pd_Name = 'Braun'
WHERE Pd_ID = 50
Der Name Frauenfelder wird in den Wert Braun geändert.
In den vorliegenden Beispielen konnte UPDATE und INSERT verwendet werden, weil sich die
View auf nur eine Tabelle bezieht und keine SQL-Funktion beinhaltet.
Aktualisierung mit Prüfoption
Durch einen INSERT kann über eine View ein Datensatz in die Basistabelle eingebracht werden,
der über die View nicht mehr ausgegeben werden kann. Z.B. in der View Maenner können auch
Frauen erfasst werden. Durch die WITH-CHECK-OPTION-Ergänzung kann das verhindert werden. Die WITH-CHECK-OPTION läuft nicht in Access.
CREATE VIEW Frauen AS
SELECT Pd_ID, Pd_Name, Pd_Geschlecht
FROM Persdat
WHERE Geschlecht = 'F'
WITH CHECK OPTION
In dieser View können keine Männer mehr erfasst werden.
Datenbank_SQL1.3.doc
Seite 31/37
Bernhard Bausch
9
Schulungsunterlagen Datenbanken
Datenbank optimieren
Der Zugriff auf Daten der Datenbank kann beschleunigt werden, wenn die Werte der Suchspalte
in sortierter Form vorliegen. Das Erstellen eines sortierten Schlüssels für Spalten einer Tabelle
nennt man Indexieren. Bei Tabellen, die mit einem zusätzlichen Index ausgestattet sind, kann eine schnelle Suchmethode wie beispielsweise das binäre Suchen eingesetzt werden.
Beim binären Suchen wird ein Datensatz schneller gefunden als beim sequentiellen Suchen, bei
dem die Datensätze der Reihe nach gelesen werden. Bei 1024 Zeilen beispielsweise wird beim
binären Suchen die gewünschte Information spätestens beim 10. Zugriff gefunden, bei 2048 Zeilen beim 11. Zugriff. Beim sequenziellen Suchen müssten dagegen durchschnittlich 512 bzw.
1024 Sätze gelesen werden, um den gesuchten Datensatz zu erhalten.
Welche Spalten der Tabellen sollte man indexieren? Es ist keineswegs zweckmässig, alle Spalten einer Tabelle zu indexieren. Die Indexierungsreihenfolge werden nämlich in der Datenbank
gespeichert. Wenn in einer Tabelle mit den Befehlen INSERT, UPDATE oder DELETE die Sortierfolge einer Tabelle verändert wird, muss auch der Index neu angepasst werden. Diese Aktualisierungen kosten natürlich Zeit. Man kann deshalb sagen, dass das Indexieren das Suchen beschleunigt, aber das Aktualisieren verlangsamt.
Für das Indexieren gelten folgende Empfehlungen:
Spalten mit Primärschlüssel sollten mit dem UNIQUE-Zusatz indexiert werden.
Sind Reihen aus mehreren Tabellen logisch zu verknüpfen, so sollten die Bezugsschlüsselspalten (Fremdschlüssel) indexiert werden.
In grossen Tabellen sollten die Spalten indexiert werden, die häufig in WHERE-,
GROUP-BY- oder ORDER-BY-Klauseln eingesetzt werden.
Nicht mehr benötigte Indexierungen sollten gelöscht werden.
Spalten, welche für Suchoptionen verwendet werden, sollten Indexiert werden.
9.1 Einfachindex erstellen.
Der Indexierungsbefehl lautet allgemein:
CREATE [UNIQE] INDEX Indexname
ON Tabellenname
(Spaltenname [ASC/DESC],
Spaltenname [ASC/DESC],….])
Mit CREATE UNIQUE INDEX wird verhindert, dass in eine Spalte doppelte Werte eingegeben
werden können. Will man also einen eindeutigen Schlüssel definieren, z.B. Primary-Key, dann
muss man für dieses Schlüsselattribut einen Index anlegen.
CREATE UNIQUE INDEX In_Pd_ID
ON persdat (Pd_ID)
Für die Bildung von Indexnamen gelten die gleichen Regeln wie für Tabellenamen.
9.2 Index löschen
Ein Index kann jederzeit gelöscht werden. Der Befehl dazu lautet:
SQL =
DROP INDEX Indexname
Access =
DROP INDEX Indexname ON Tabellenname
9.3 Zusammengesetzten Index vereinbaren
Wenn der Primärschlüssel einer Tabelle aus zwei und mehr Spalten besteht, sollte dafür ein zusammengesetzter Index vereinbart werden.
CREATE UNIQUE INDEX I_PdID_FamNr
ON Familienmitglieder (Pd_ID, PD_FamNr)
Datenbank_SQL1.3.doc
Seite 32/37
Bernhard Bausch
Schulungsunterlagen Datenbanken
9.4 Indexeintragungen überprüfen und reparieren
Es ist nicht auszuschliessen, dass ein angelegter Index beschädigt wird. Das kann zum Beispiel
passieren, wenn während der Bearbeitung der Datenbank der Strom ausfällt oder das System
nicht korrekt heruntergefahren wird. Zerstörte Indexeintragungen führen dann bei Suchprozessen
zu fehlerhaften Ergebnissen. Aus diesem Grund gibt es in den Datenbanksystemen Befehle, mit
denen beschäftigte Indexeintragungen festgestellt und repariert werden können. Befehle für solche Aktionen sind von Datenbank zu Datenbank unterschiedlich.
9.5 Die referentielle Integrität einer Datenbank erhalten
Um die referentielle Integrität vom System verwalten zu lassen, muss man bei der Erstellung von
Tabellen mit ihren Strukturen mit CREATE TABLE oder mit ALTER, die Zusätze PRIMARY KEY,
FOREIGN KEY und REFERENCES einsetzen. Bei Oracle und Access ist zusätzlich die
CONSTRAINT-Klausel zu verwenden. CONSTRAINTs (deutsch: zwangsweise Bindung) können
für einzelne Spalten und auf Tabellenebene vereinbart werden.
Nachfolgend ein paar Beispiele die diesen Vorgang dokumentieren sollen.
ORACLE
CREATE TABLE Abteilung
(Abt_ID
SMALLINT NOT NULL,
Abt_Bez
Char(20),
CONSTRAINT PkAbtID PRIMARY KEY (Abt_ID))
Hier wird also ein Primary-Key erzeugt, der mit einem Index, mit dem Namen PKAbtID, verbunden ist.
In INFORMIX ab Version 5.0 läuft die gleiche Anweisung wie folgt:
INFORMIX
CREATE TABLE Abteilung
(Abt_ID
SMALLINT NOT NULL,
Abt_Bez
Char(20),
PRIMARY KEY (Abt_ID))
ACCESS
CREATE TABLE Abteilung_Test
(Abt_ID SMALLINT CONSTRAINT PkAbtID PRIMARY KEY NOT NULL,
Abt_Bez Char(20))
Dependent-Tabellen (Dependend = abhängig) mit FOREIGN KEY und Referenzierung
erstellen
Im nachfolgenden Beispiel wird die Tabelle Persdat mit dem Zusatz FOREIGN KEY und einer
Referenzierung zur Tabelle Abteilung erstellt. Ausserdem wird die DELETE-Regel ON DELETE
RESTRICT eingesetzt. Dieses Beispiel soll die Zusammenhänge darstellen, Abweichungen von
Datenbank zu Datenbank müssen entsprechend berücksichtigt werden:
CREATE TABLE Persdat
(Pd_ID
SMALLINT NOT NULL,
Pd_Name
CHAR(20),
Pd_Vname
CHAR(20),
Pd_Geschlecht CHAR()
Abt_ID
SMALLINT NOT NULL,
CONSTRAINT PkPdID PRIMARY KEY (Pd_ID),
CONSTRAINT FKAbtID FOREIGN KEY (Abt_ID)
REFERENCES Abteilung (Abt_ID) ON DELETE RESTRICT
Datenbank_SQL1.3.doc
Seite 33/37
Bernhard Bausch
Schulungsunterlagen Datenbanken
Zeilen mit Delete löschen
Im Zusatz REFERENCES kann eine von drei DELETE-Regeln eingesetzt werden:
ON
DELETE RESTRICT
DELETE CASCADE
DELETE SET NULL
Datenbank_SQL1.3.doc
In der Tabelle Abteilung können so lange keine Zeilen gelöscht werden, wie in der Tabelle Persdat Zeilen mit der gleichen Abt_ID stehen.
Beim Löschen einer Zeile in der übergeordneten Tabelle Abteilung
werden automatisch alle Zeilen mit der gleichen Abt_ID glöscht.
Beim Löschen einer Zeile in der übergeordneten Tabelle werden in
der abhängigen Tabelle in Zeilen mit gleichem Referenzwert die Werte NULL gesetzt.
Seite 34/37
Bernhard Bausch
Schulungsunterlagen Datenbanken
10 Daten schützen und sichern
Wenn die in der Datenbank gespeicherten Informationen mehreren Benutzern zur Verfügung stehen, muss der Datenbank-Administrator durch geeignete Massnahmen den Zugriff nichtautorisierter Personen verhindern. Um die Gefahr des Datenverlustes, der Fälschung und des Datenmissbrauchs einzuschränken, erteilt er Benutzern Zugangsberechtigungen (subjektbezogener
Datenschutz) und Zugriffsberechtigungen (objektbezogener Datenschutz).
Die Zugangsstufen werden mit dem SQL-Befehl GRANT-Zugriffsstufe erteilt.
Benutzerkennungen und Passwörter
Den Zugang zu dem Datenbanksystem erhalten Benutzer mit der Eingabe ihrer Benutzerkennung
(User-Identifikation, User_ID) und der Eingabe des Passwortes. Die Benutzerkennung identifiziert
den Benutzer. Sie muss eindeutig sein. Das Passwort enthält keine Hinweise auf den Benutzer.
Zugangsstufen CONNECT, RESOURCE und DBA
Datenbanken sind mit Zugangsstufen ausgestattet. Der Administrator koppelt sie an die Benutzerkennung. die drei Datenbankzugriffsrechte CONNECT, RESOURCE und DBA haben unterschiedliche Rechte, die in der nachstehenden Tabelle skizziert werden.
Aus der nachstehenden Graphik wird die Hierarchie der Zugriffsberechtigung deutlich. CONNECT steht auf der niedrigsten Stufe, die DBA-Berechtigung berechtigt zu allen legalen Datenbankoperationen.
DBA
-
Vergeben und entziehen von Tabellenzugriffsrechten.
Tabellen, Indizes und Views für andere Benutzer erzeugen und löschen.
Datenbank löschen.
Datenbankzugriffsrechte gewähren und entziehen.
RESOURCE
- Basistabellen erstellen, ändern und löschen.
- Index erstellen, ändern und löschen.
- Recht auf Tabellenzugriff gewähren und entziehen.
CONNECT
- Bestehende Tabellen abfragen, ändern und löschen, sofern das
erforderliche Tabellenzugriffsrecht eingeräumt wurde.
- Erstellen, ändern und löschen von Views.
Datenbank_SQL1.3.doc
Seite 35/37
Bernhard Bausch
Schulungsunterlagen Datenbanken
11 Transaktionsorientiert arbeiten
Eine Datenbank muss sich stets in einem konsistenten Zustand befinden. Eine Datenbank ist
konsistent, wenn die Daten inhaltlich richtig sind (semantische Integrität). Bei Änderungen im Datenbestand kann es zu Inkonsistenzen kommen, wenn eine Aktion nicht ordnungsgemäss abgeschlossen werden kann.
Bei der Bearbeitung von einzelnen Feldern besteht die Gefahr nicht, weil die Datenbank immer
beim Verlassen eines Feldes den Inhalt in der Datenbank speichert.
Tritt aber bei einer Änderungsaktion mehrer SQL-Anweisungen eine Störung infolge eines Plattenfehlers oder einer Fehlbedienung auf, könnte sich die Datenbank in einem inkonsistenten Zustand befinden. Ein Teil der Änderungen wurden vorgenommen und der andere Teil nicht. Die
daraus resultierende Inkosistenz hat zur Folge, dass die Daten danach nicht mehr kongruent
(übereinstimmend) sind.
Um sicherzustellen, dass Änderungen im Datenbestand nicht zu Inkonsistenzen führen, können
die Änderungsanweisungen in Form einer Transaktion ausgeführt werden. Unter einer Transaktion versteht man eine Folge von SQL-Anweisungen, die logisch zusammengehören. Bei einer
transaktionsorientierten Verarbeitung wird nach dem Alles-oder-nichts-Prinzip dafür Sorge getragen, dass die Anweisungsfolge komplett oder gar nicht ausgeführt wird. Eine Ausführung nur einzelner Anweisungen wird verhindert.
Die Transaktion wird vor Beginn der Ausführung gestartet und nach korrektem Ablauf oder nach
korrektem Beenden der Anweisungen wird mit einem COMMIT-Kommando die Änderung gespeichert. Treten Fehler auf wird die Verarbeitung mit dem ROLLBACK-Kommando zurück genommen. Treten technische Fehler während der Verarbeitung auf, wird automatisch nicht gespeichert, weil das COMMIT-Kommando nicht ausgeführt wird.
In Access beginnt eine Transaktion mit der Befehlszeile Begin Trans und endet mit CommitTrans
oder eben Rollback. Die Transaktion muss natürlich entsprechend implementiert sein.
Datenbank_SQL1.3.doc
Seite 36/37
Bernhard Bausch
Schulungsunterlagen Datenbanken
12 ODBC-Schnittstelle zum Zugriff auf Datenbanken einsetzen
Zu den wichtigsten Gütern eines Unternehmens zählen die auf unterschiedlichen Medien gespeicherten Informationen über Aufträge, Umsätze, Erträge, Aufwendungen und mehr. Diese Daten
stehen in Datenbanken auf Netzwerkservern oder Mainframes. Das Problem ist, dass die Datenbanken die Daten in unterschiedlichen Formaten aufzeichnen, und dass die unterschiedlichen
Betriebssysteme nicht auf die Daten zugreifen können.
Die ODBC-Programmschnittstelle hebt die Trennung von Anwendung und Datenbank auf:
Die standardisierte ODBC-Verbindungsschnittstelle (Open Database Connectivity) wurde für den
Zugriff auf Datenbanken 1992 von der SQL-Access-Group und Microsoft gemeinsam entwickelt.
Sie macht es möglich, dass von PCs, mit dem Betriebssystem WINDOWS, mit Anwendungen wie
EXCEL, WORD und anderen, auf Daten von Datenbanken, die ODBC unterstützen, zugegriffen
werden kann.
Voraussetzungen für den Einsatz der ODBC-Technik sind:
1.
2.
3.
4.
Ein Anwendungsprogramm, das ODBC unterstützt. Z.B. Office-Applikationen
Ein Treibermanager, der einen für die fremde Datenbank vorliegenden ODBC-Treiber lädt
und nach Abfrageende wieder schliesst (der Treibermanager ist in den WindowsBetriebsystemen enthalten).
ODBC-Treiber; das ist eine DLL-Datei (Dynamic-Link Library), die eine Abfrage in der aktuellen Anwendung in den Dialekt der angesprochenen Datenbank umwandelt.
Ein ODBC-fähiges Datenbankmanagementsystem. Für jedes Datenbanksystem ist ein
eigener Treiber erforderlich. Im Office-Paket sind ODBC-Treiber für ACCESS, DBASE,
FOXPRO, PARADOX, SQL-Server, Textdatenbanken und EXCEL bereitgestellt. Benötigt
man einen Treiber für eine andere Datenbank, muss dieser für WINDOWS verfügbar sein.
ODBC wird heute von den Datenbanken ORACLE, INFORMIX, INGREX, SYBASE, GUPTA und EDA/SQL unterstützt.
Um mit der ODBC-Technik auf die Datenbank zugreifen zu können, muss in WINDOWS für die
Datenbank eine sogenannte Datenquelle, in der Windows-Arbeitsoberfläche
Start Einstellungen Systemsteuerung 32-Bit-ODBC / ODBC,
eingerichtet werden.
Im ODBC-Datenquellen-Administrator wird ab Office 97 zwischen Benutzer-, System- und DateiDatenquellen unterschieden
1.
Benutzer-DSN
Die Benutzerdatenquelle ist auf dem lokalen Computer installiert und kann nur vom Benutzer, für welche sie eingerichtet wurde, verwendet werden. DSN steht für Data Source Name (Name der Datenquelle)
2.
System-DSN
Systemdatenquellen können im Netzwerk eingesetzt werden und stehen allen Anwendern
eines Comuters zur Verfügung.
3.
Datei-DSN
Bei Datei-DSN stehen die Informationen nicht in der WINDOWS-Registrierdatei, sondern in
einer gesonderten DSN-Datei
Im Register ODBC-Treiber finden man eine Liste der bereits installierten ODBC-Treiber. Alle diese von den jeweiligen Datenbanken installierten Treiber stehen zur Installation bzw. Konfiguration
zur Verfügung.
Datenbank_SQL1.3.doc
Seite 37/37
Herunterladen