Datenbanken und Internet

Werbung
Robert Krah
Datenbanken und Internet
Einführung in SQL
Apache-Server
MySQL
PHPMyADMIN
Lehrgang:
Medizinische Dokumentation
Datenbanken und Internet
Robert Krah
Inhaltsverzeichnis
1
Ziele: Was soll vermittelt werden? .................................................................................... 1
2
2.1
2.2
2.2.1
2.2.2
2.3
2.4
2.5
2.6
2.7
2.8
2.9
Einführung in SQL............................................................................................................. 2
Einführung in SQL über Access-Abfragen ...................................................................... 2
Operatoren in Abfragen .................................................................................................. 6
Vergleichsoperatoren ...................................................................................................... 7
Der Operator in ............................................................................................................... 8
Übungen zum Select-Befehl ........................................................................................... 9
Aggregat-Funktionen .................................................................................................... 13
Übungsaufgaben........................................................................................................... 14
Select-Befehl mit Gruppierung ...................................................................................... 15
Die Having-Klausel ....................................................................................................... 17
Daten ändern: update ................................................................................................... 21
Verbindung von Tabellen (Join) .................................................................................... 22
3
3.1
3.2
3.3
Zugriff auf Internet-Datenbanken ...................................................................................... 28
Einsatz des Apache-Servers......................................................................................... 29
WAMP-Installation ........................................................................................................ 29
Passwort für den localhost einstellen............................................................................ 32
Datenbanken und Internet
1 Ziele: Was soll vermittelt werden?
In diesem Skript geht es um Datenbanken und deren Anbindung an das Internet. Die hier
verfolgten Ziele sind:
1. die Beschäftigung mit der standardisierten Datenbank-Sprache SQL = structured
query language
2. der Einsatz von Datenbanken im Internet unter besonderer Berücksichtigung von
MySQL
3. die Installation des Webservers Apache unter Windows
4. die Verwendung von Tools zur Administration von Web-basierten Datenbanken wie
PHPMyADMIN und MySQL-Control Center
5. eine Einführung in die Skriptsprache PHP
6. und schließlich die Erstellung von interaktiven Websites unter Einbeziehung von
MySQL-Datenbanken: Hier fließen die vorher behandelten Themen zusammen: Der
Einsatz einer Datenbank im Internet setzt einen Webserver wie Apache voraus. In
HTML-Dateien werden PHP-Skripte eingefügt, die über MySQL-Funktionen auf eine
Datenbank zugreifen können. Dazu muss man wissen, wie man eine MySQLDatenbank bedient, und wie man lokal erstellte Datenbanken und Tabellen über einen "Dump" zum Provider transferiert. Die Programmierung der Abfragen aus der
Datenbank und das Einfügen von Daten durch Personen, die dazu berechtigt sind,
setzt die Kenntnis von SQL voraus.
Die Einführung in SQL erfolgt zunächst am Beispiel von Access-Datenbanken. Die vertraute
Oberfläche von Access, dessen Kenntnis hier in den Grundzügen vorausgesetzt wird, soll
dazu dienen, den Teil von SQL kennen zu lernen, der zum Erstellen von Abfragen (query)
aus Tabellen dient.
Anschließend erfolgt die WAMP-Installation: Diese Abkürzung steht für Windows-ApacheMySQL-PHP.
Nun kann die Beschäftigung mit SQL fortgesetzt werden. Der Teil von SQL, der mit DDL
abgekürzt wird (data definition language) wird hier zum Erstellen von Datenbanken und Tabellen, zum Einfügen, Löschen und Ändern von Daten verwendet.
Nach dieser Beschäftigung mit der SQL-Befehlssyntax werden Werkzeuge Wie PHPMyAdmin eingesetzt, die in der Regel auch zur Administration der Datenbank beim Provider verwendet werden.
Jetzt fehlt nur noch die Kenntnis der Sprache PHP, um dann Datenbanken im Internet über
HTML-basierte Dokumente anzubinden. Das Ergebnis kann beispielsweise ein Webshop
sein: Kunden rufen Artikeldaten im Internet ab, füllen einen Warenkorb und bestellen dann
die Ware.
1
Einführung in SQL
Abfragen mit select
2 Einführung in SQL
In der standardisierten Datenbank-Abfragesprache SQL werden drei Bereiche unterschieden:
1.
DDL: Data Definition Language
Einrichten von Datenbanken, Tabellen, Indizes, Views usw.
2.
DML: Data Manipulation Language
Manipulation von Daten, Einfügen., Ändern, Auswählen (Select)
3.
DCL: Data Control Language
Steuerung der Vergabe von ZugriffsrechtenDer Teil von SQL, mit dem wir uns zunächst befassen, dient der Syntax des select-Befehls. Damit werden Abfragen erstellt, die
Sie in Access über die grafische Oberfläche kennengelernt haben. Alle Befehle, deren Syntax hier zunächst besprochen wird, sind der zweiten Gruppe der Befehle von SQL (DML)
zuzuordnen.
2.1 Einführung in SQL über Access-Abfragen
Eine einfache Abfrage zur Tabelle Artikel aus der Datenbank Firma, die die Felder Artikelnummer und Bezeichnung auswählt, führt zu folgendem Ergebnis:
Im Entwurfsbildschirm der Abfrage oder auch in der Datenblattansicht können Sie mit dem ersten Symbol links auch zur SQLAnsicht umschalten:
In der SQL-Ansicht sind die Befehle sichtbar,
die der oben gezeigten Abfrage entsprechen:
die Angabe der Tabelle kann an folgenden
Stellen weggelassen werden:
Auf diese Art – im Vergleich der grafisch orientierten Entwurfsansicht mit den SQL-Befehlen –
lassen sich die Grundlagen von SQL relativ leicht erlernen.
Mit dem Select-Befehl werden Daten aus Tabellen ausgewählt. Dies kann mit Bedingungen
und Sortierungen verbunden werden. Zunächst befassen wir uns mit der vereinfachten Syntax des Select-Befehls, bezogen auf nur eine Tabelle.
2
Einführung in SQL
Abfragen mit select
Die sechs Komponenten einer SQL-Abfrage1
SELECT [ALL | DISTINCT] Spaltenausdruck Zeige mir die Werte aus folgenden Spalten …
[, ...]
(Ausgabedaten)
FROM Tabellenbezeichner [, ...]
… aus folgenden Tabelle(n)
[ WHERE Bedingung ]
… schränke die Auswahl wie folgt ein …
[ GROUP BY Spalte [, ... ] ]
Gruppenbildung
Verdichte die Ausgabe von allen Zeilen mit
gleichem Attributwert zu einer einzigen Ausgabezeile
[ HAVING Having-Bedingung
Zusätzliche Auswahlbedingung auf Gruppenebene
[ ORDER BY [ [ASC | DESC ] Spalte [, ...] ]
…
sortiere Ausgabe anhand folgender Spalten
(Default ist ASC)
Wir wählen zunächst nur den ersten Teil des select-Statements:
SELECT {* | <Spaltenliste>}
FROM <Tabellenname>
[WHERE <Ausdruck>]
Wähle aus die Spaltenliste (oder *=alle)
aus der Tabelle
wo folgendes gilt
An den folgenden Beispielen soll dies gezeigt
werden. Um sie auszuprobieren, öffnen Sie
bitte die Datenbank Firma, Tabelle Artikel, und
erzeugen eine leere Abfrage im Entwurfsbildschirm.
Wenn Sie dann zur SQL-Ansicht umschalten,
sehen Sie den Select-Befehl
SELECT FROM ARTIKEL;
1
diese Übersicht über die sechs Komponenten einer Abfrage ist aus:
http://www.oszhdl.be.schule.de/gymnasium/faecher/informatik/datenbanken.htm
3
Einführung in SQL
Abfragen mit select
Aufgabe: Dort können Sie jetzt die folgenden Beispiele testen. Schalten Sie dabei jeweils
von der SQL-Ansicht, testen Sie mit dem roten Ausrufezeichen
(die Befehle müssen nicht mit Grossbuchstaben eingegeben werden)
SELECT *
alle Datensätze der Tabelle Artikel
FROM ARTIKEL
SELECT BEZEICHNUNG
FROM ARTIKEL
das Feld Bezeichnung aller Datensätze
der Tabelle Artikel
SELECT ARTIKELNUMMER, BEZEICHNUNG
FROM ARTIKEL
die beiden Felder Artikelnummer und Bezeichnung aus der Tabelle Artikel
SELECT *
FROM ARTIKEL
WHERE EINKAUFSPREIS <10
alle Datensätze, bei denen der Einkaufspreis
unter 10 € ist
SELECT BEZEICHNUNG, MENGE, MINDESTBESTAND
FROM ARTIKEL
WHERE EINKAUFSPREIS <10
wie oben, aber nur die Felder Bezeichnung,
Menge und Mindestbestand
SELECT BEZEICHNUNG
FROM ARTIKEL
WHERE LIEFERANTENNUMMER=[BITTE LIEFNR EINGEBEN]
wie Parameter-Abfrage:
das Feld Bezeichnung der Tabelle Artikel
nach der Lieferantennummer wird gefragt
SELECT *
FROM ARTIKEL
WHERE EINKAUFSPREIS <10
AND MINDESTBESTAND >50
alle Datensätze, bei denen der Einkaufspreis
unter 10 € ist und der Mindestbestand über
50
SELECT BEZEICHNUNG, VERKAUFSPREIS
FROM ARTIKEL
WHERE ARTIKELNUMMER >200
OR VERKAUFSPREIS >20
die Felder Bezeichnung und Verkaufspreis,
bei denen entweder die Artikelnummer über
200 ist oder der Verkaufspreis über 20 €
SELECT *
FROM ARTIKEL
ORDER BY BEZEICHNUNG
alle Datensätze der Tabelle Artikel, sortiert
nach Bezeichnung
SELECT BEZEICHNUNG
FROM ARTIKEL
ORDER BY ARTIKELNUMMER ASC
das Feld Bezeichnung der Tabelle Artikel,
sortiert nach Artikelnummer
(ASC=ascending=aufsteigend; ohne diese
Angabe wird immer aufsteigend sortiert
SELECT *
FROM ARTIKEL
ORDER BY BEZEICHNUNG DESC
wie oben, aber absteigend
4
Einführung in SQL
Abfragen mit select
SELECT *
FROM ARTIKEL
ORDER BY LIEFERANTENNUMMER, ARTIKELNUMMER
alle Datensätze der Tabelle Artikel, primär
sortiert nach Lieferantennummer, sekundär
nach Artikelnummer
zuerst alle Datensätze der ersten Lieferantennummer, diese nach Art-Nr sortiert, dann
die nächste Lieferantennummer, nach ArtNummern sortiert, usw.
(macht nur Sinn, wenn das erste Sortierfeld
mehrfach vorkommt)
SELECT ARTIKELNUMMER, BEZEICHNUNG,
MENGE
FROM ARTIKEL
ORDER BY 3
die Felder Artikelnummer, Bezeichnung und
Menge, sortiert nach dem an 3. Stelle genannten Feld (Menge)
SELECT BEZEICHNUNG
FROM ARTIKEL
WHERE BEZEICHNUNG LIKE "D*"
die Felder Bezeichnung der Tabelle Artikel,
aber nur die, bei denen die Bezeichnung mit
einem D anfängt
Aufgabe: Öffnen Sie jetzt die Datenbank Biblio. Erstellen Sie eine neue Abfrage in der
Entwurfsansicht. Wählen Sie nur die Tabelle Bücher. Wie lauten die SQLBefehle für folgende Abfragen:
Notieren Sie die SQL-Befehle!
a) die Titel aller Bücher
b) die Titel der Bücher von Christie
c) Titel und Autor der Bücher, die ausgeliehen sind
(logisches Feld: 0 oder –1! )
d) den Vornamen vom Autor namens Chandler
e) wer schrieb das Buch: Volkswirtschaftslehre ?
f)
alle Titel ab der Katalognummer 400
g) die Autoren (Vorname und Name) deren Buch entweder mit einer Katalognummer ab
700 beginnt oder deren Bücher nicht ausgeliehen sind
h) die Nachnamen der Autoren, deren Vorname mit dem Buchstaben J beginnt
5
Einführung in SQL
Abfragen mit select
2.2 Operatoren in Abfragen
In SQL werden verschiedene Typen von Operatoren beschrieben
es gibt arithmetische, Vergleichs- , Zeichen- ,logische, Mengen- und verschiedene Operatoren.
Bei den meisten Beispielen folge ich zum Teil dem sehr ausführlichen Buch: "SQL in 21 Tagen" aus dem Verlag Markt und Technik2. Zum Teil habe ich die Tabellenbeispiele auf
Deutsch übersetzt.
zunächst Beispiele für arithmetische Operatoren:
Artikel Grosshandel
Betrachten Sie dazu die kleine Tabelle Preis
Tomaten
0,34
Sie besteht nur aus den beiden Spalten
Kartoffeln
0,51
Artikel und Grosshandel (=Großhandelspreis) Bananen
0,67
Rueben
0,45
Kaese
0,89
Beim letzten Datensatz (Orangen) fehlt abAepfel
0,23
sichtlich der Preis (s. u.)
Orangen
Wenn Sie die Abfrage eingeben:
SELECT ARTIKEL, GROSSHANDEL,
GROSSHANDEL + 0.15
FROM PREIS;
dann erhalten Sie:
Es wird also eine neue Spalte erzeugt, in der
das Ergebnis der Berechnung zu finden ist
ARTIKEL GROSSHANDEL Expr1002
Tomaten
0,34
0,49
Kartoffeln
0,51
0,66
Bananen
0,67
0,82
Rueben
0,45
0,6
Kaese
0,89
1,04
Aepfel
0,23
0,38
Orangen
Sie können diese neue Spalte aber auch direkt benennen:
SELECT ARTIKEL, GROSSHANDEL,
GROSSHANDEL + 0.15 as Einzelverkaufspreis
FROM PREIS;
dann erhalten Sie eine neue Spaltenüberschrift:
ARTIKEL GROSSHANDEL Einzelverkaufspreis
Tomaten
0,34
0,49
Kartoffeln
0,51
0,66
Bananen
0,67
0,82
Rueben
0,45
0,6
Kaese
0,89
1,04
Aepfel
0,23
0,38
Orangen
Aufgabe: Zur Tabelle Preis soll eine Tabelle
entstehen, die eine neue Spalte namens Sonderpreis anzeigt. Diese
Spalte soll den Wert des halben
Grosshandelspreises haben.
2
SQL in 21 Tagen, ISBN: 3-8272-2020-3
6
artikel Grosshandel Sonderpreis
Tomaten
0,34
0,17
Kartoffeln
0,51
0,255
Bananen
0,67
0,335
Rueben
0,45
0,225
Kaese
0,89
0,445
Aepfel
0,23
0,115
Orangen
Einführung in SQL
Abfragen mit select
Aufgabe: Erstellen Sie eine Abfrage zur Tabelle
Temperatur.
Sie soll folgendes Ergebnis liefern
SQL-BefehL:
Hochtemp Tieftemp Differenz
45
-10
55
48
-5
53
31
-28
59
2.2.1 Vergleichsoperatoren
mit Vergleichsoperatoren hatten Sie es schon zu tun, wenn Sie die where-Klausel verwendet hatten:
Select * from Bücher
(gibt die Bücher von A. Christie aus der Tawhere Autor ="Christie"
belle Bücher aus)
Bisher noch nicht verwendet wurde:
a) Is Null (für nicht vorhanden) Gegenteil: Is not Null
Achtung: In der Entwurfsansicht von Abfragen schreiben Sie: Ist Null, hier engl. Is Null
z. B.: where Preis Is Null (wenn die Artikel gefunden werden sollen, für die kein Preis vorhanden ist). Das Gegenteil: Is not Null heißt in der Entwurfsansicht auf deutsch: Ist nicht
leer
b) between = zwischen
Artikel Grosshandel
Kartoffeln
0,51
Bananen
0,67
select * from Preis
where grosshandel between 0.5 and 0.8
c) <> für ungleich (Oracle: !=)
SELECT *
FROM Preis
where Artikel <>"Tomaten"
d) distinct
Betrachten Sie dazu die kleine Tabelle
Namen_Orte:
die Abfrage:
SELECT Ort
FROM Namen_Orte;
zeigt alle Orte an, auch doppelt:
Schreiben Sie:
SELECT distinct Ort
listet alle Datensätze bis auf Tomaten
gleich:
where not Artikel = "Tomaten"
Name Vorname
Schmitz Regina
Mayer Ludwig
Appel Hans
Mons Gerd
Schmitz Peter
Jordan Gustav
Mayer Claudia
Jordan Hannes
Ort
Köln
Bonn
Bergheim
Troisdorf
Leverkusen
Köln
Bonn
Leverkusen
Ort
Bergheim
Bonn
7
Ort
Köln
Bonn
Bergheim
Troisdorf
Leverkusen
Köln
Bonn
Leverkusen
Einführung in SQL
FROM Namen_Orte;
um keine Orte doppelt zu sehen:
Abfragen mit select
Köln
Leverkusen
Troisdorf
name
Appel
Jordan
Mayer
Mons
Schmitz
Vorsicht bei den Namen:
SELECT distinct name
FROM Namen_Orte;
hier fehlen natürlich tatsächlich Namen!
name ort
Appel Bergheim
Jordan Köln
Jordan Leverkusen
Mayer Bonn
Mons Troisdorf
Schmitz Köln
Schmitz Leverkusen
Wenn die Orte wieder dabei sind, erscheinen
auch die fehlenden Namen (trotz distinct)
wieder:
SELECT distinct name, ort
FROM Namen_Orte;
2.2.2 Der Operator in
Mit in kann man Werte aus Spalten suchen, die verschiedene Kriterien, die auch mit or zu
verbinden wären, entsprechen.
Vergleichen Sie die folgenden Abfragen, die zum gleichen Ergebnis führen:
in
Ergebnis
or
SELECT Name,Ort
SELECT Name,Ort
Name Ort
FROM Namen_Orte
FROM Namen_Orte
Schmitz Köln
where Ort ="Bonn"
Mayer Bonn
where Ort in
Mons Troisdorf
or
("Bonn","Köln","Troisdorf")
Jordan Köln
Ort ="Köln"
Mayer Bonn
or
Ort ="Troisdorf"
Zeichenverkettung
Aufgabe: Testen Sie an der Tabelle Namen_Orte auch die Verbindung
von mehreren Spalten mit dem &-Zeichen:
SELECT Vorname &" "&Name as Gesamtname
FROM Namen_Orte;
zwischen Vorname und Nachname muss dabei ein Leerschritt eingefügt
werden.
In Oracle-Datenbanken müssen Sie statt & ein doppeltes Pipe-Zeichen ||
verwenden.
8
Gesamtname
Regina Schmitz
Ludwig Mayer
Hans Appel
Gerd Mons
Peter Schmitz
Gustav Jordan
Claudia Mayer
Hannes Jordan
Einführung in SQL
Abfragen mit select
2.3 Übungen zum Select-Befehl
Die folgenden Aufgaben sind dem Buch entnommen:
Norbert Michelmann, Rolf Hettwer: Datenbankentwicklung und –anpassung mit
MS Access und SQL, Troisdorf 2001, S. 119/120
Sie beziehen sich auf die Tabelle Mieter in der Datenbank SQL-Beispiele.mdb
Aufgabe: Erstellen Sie die folgenden Abfragen:
a.
Nachnamen und Vornamen aller Mieter
b.
Anreden, Nachnamen, Vornamen und Orte aller Berliner Mieter
c.
Nachnamen, Orte und Mietkosten von Mietern, deren Mietkosten 0 sind
d.
Anreden, Vornamen und Nachnamen der Mieter, deren Vornamensfeld keinen Wert enthält
e.
Nachnamen, Vornamen, Orte - aufsteigend/absteigend sortiert nach Nachnamen
f.
Nachnamen, Orte und Mietkosten - aufsteigend sortiert nach Orten und innerhalb eines
Ortes absteigend nach den Mietkosten
g.
Orte aller Mieter (ohne Redundanz)
h.
Nachnamen und Mietkosten der Mieter ohne Guthaben
i.
Vornamen, Nachnamen, Orte und Mietkosten der Kunden, die in München wohnen oder
kein Guthaben haben
9
Einführung in SQL
Abfragen mit select
j.
Vornamen, Nachnamen, Orte und Mietkosten aller Münchner Kunden, die kein Guthaben besitzen
k.
Anreden, Nachnamen, Vornamen und Mietkosten von Mietern, deren Kontostand zwischen 420 und 0 liegt
l.
Anreden, Nachnamen, Orte aller Mieter, die in Frankfurt wohnen
m. Anreden, Nachnamen, Postleitzahlen und Orte aller süddeutschen Mieter (Postleitzahl
'70000' und höher)
n.
Anreden, Nachnamen, Vornamen und Orte aller Mieter, die keine Firmen sind
o.
Nachnamen und Orte aller Mieter mit einem sechsstelligen Nachnamen, der mit „S"
beginnt
p.
Nachnamen und Orte aller Mieter, deren Nachname mit „S" beginnt
q.
Nachnamen und Orte aller Mieter mit einem „z" ab der 2. Stelle in ihrem Nachnamen
r.
Nachnamen und Orte aller Mieter mit einem „_" in Ihrem Nachnamen
s.
Nachnamen, Postleitzahlen und Orte aller Mieter, die nicht in Stuttgart oder München
wohnen
t.
Nachnamen, Vornamen und Orte aller Mieter, die keinen Vornamen haben.
u.
Nachnamen und Orte aller Mieter, die keine AG sind (nicht auf AG enden)
10
Einführung in SQL
Abfragen mit select
Lösungen zu den Aufgaben S. 9/10
a)
SELECT Nachname,Vorname
FROM Mieter
b)
SELECT Anrede,Nachname,Vorname,Ort
FROM Mieter
where Ort='Berlin'
c)
SELECT Nachname,Ort,Mietkosten
FROM Mieter
where Mietkosten=0
d)
SELECT Anrede, Vorname, Nachname
FROM Mieter
WHERE Vorname Is Null
e)
SELECT Nachname, Vorname, Ort
FROM Mieter
order by Nachname asc | desc
f)
g)
h)
SELECT Nachname, Mietkosten, Ort
FROM Mieter
order by ort asc, mietkosten desc
SELECT distinct Ort
FROM Mieter
SELECT Nachname
FROM Mieter
where mietkosten <0
i)
SELECT vorname, Nachname, Ort, Mietkosten
FROM Mieter
where ort ="München" or mietkosten <0
j)
SELECT vorname, Nachname, Ort, Mietkosten
FROM Mieter
where ort ="München" and mietkosten <0
SELECT anrede, Nachname, Ort
FROM Mieter
where mietkosten between 0 and 420
k)
SELECT anrede, Nachname, Ort
FROM Mieter
where ort like "Frankfurt*"
m) SELECT anrede, Nachname, PLZ, Ort
FROM Mieter
where plz>="70000"
n) SELECT anrede, Nachname, Vorname, Ort
FROM Mieter
where anrede <>"Firma"
l)
o)
Nachname Ort
Schwin
München
Schwan
Frankfurt a. M.
SELECT Nachname, Ort
FROM Mieter
WHERE nachname like "S?????"
11
Einführung in SQL
p)
Abfragen mit select
SELECT Nachname, Ort
FROM Mieter
WHERE nachname like "S*"
SELECT Nachname, Ort
FROM Mieter
WHERE nachname like "*z*"
r)
SELECT Nachname, Ort
FROM Mieter
WHERE nachname like "*_*"
s)
falsch:
SELECT Nachname,PLZ, Ort
FROM Mieter
WHERE ort <>"Stuttgart" or ort
<>"München"
richtig:
SELECT Nachname,PLZ, Ort
FROM Mieter
WHERE ort <>"Stuttgart" and ort
<>"München"
auch:
WHERE ort not like "Stuttgart" and ort not
like "München"
SELECT Nachname,Vorname, Ort
FROM Mieter
WHERE Vorname is NULL
u)
SELECT Nachname, Ort
FROM Mieter
WHERE Nachname not like "*AG"
Ort
Schwin
München
Schwan
Frankfurt a. M.
SOAG
Hamburg
Schneider
Ulm
Soft_KG
Berlin
Nachname Ort
Weitzel
Düsseldorf
q)
t)
Nachname
12
ergibt alle Datensätze, denn jeder Ort ist
entweder ungleich München bzw. Stuttgart
jeder einzelne Ort ist weder Stuttgart noch
München
Einführung in SQL
Abfragen mit select
2.4 Aggregat-Funktionen
Diese Funktionen werden auch Set-Funktionen genannt. Mit ihnen werden Auswertungen
wie Summe, Mittelwert usw. vorgenommen.
a) count
Die einfachste Auswertung dieser Art erhält man mit dem Befehl count (=zählen). Beispiel,
bezogen auf die Tabelle Preis:
Expr1000
SELECT count (*)
Das Ergebnis ist 7, weil sich in der
7
FROM Preis;
Tabelle 7 Datensätze befinden.
ANZAHL
Besser sieht es aus, wenn man einen SELECT Count(*) AS ANZAHL
7
FROM
Preis;
Aliasnamen verwendet
ANZAHL
3
Auch hier ist natürlich die Angabe von SELECT Count(*) AS ANZAHL
FROM Preis
Bedingungen mit where möglich
WHERE Grosshandel>0.5
b) sum
Mit diesem Befehl bildet man die Summe von Feldinhalten. Mit dem folgenden Beispiel wird
die Summe der Grosshandelspreise gebildet
Summe_Grosshandel
3,09
select sum (Grosshandel) as Summe_Grosshandel
from preis
c) min
Das Minimum von Feldinhalten wird mit der Funktion min ermittelt:
Expr1000
-28
SELECT min (Tieftemp)
FROM Temperatur;
auch hier ist es meistens übersichtlicher, wenn mit einem Aliasnamen gearbeitet wird:
"Tiefste Temperatur"
-28
SELECT min (Tieftemp) as "Tiefste Temperatur"
FROM Temperatur;
d) max
Das Maximum ist entsprechend max:
SELECT max (Hochtemp) as "Höchste Temperatur"
FROM Temperatur;
"Höchste Temperatur"
48
e) avg
Das Wort Mittelwert heißt auf englisch "average", deshalb heißt die Funktion avg
SELECT avg (Hochtemp) as "Durchschnitt der Höchstwerte"
FROM Temperatur;
13
"Durchschnitt der
Höchstwerte"
41,3333333333333
Einführung in SQL
Abfragen mit select
2.5 Übungsaufgaben
Alle Aggregat-Funktionen lassen sich mit where-Klauseln verbinden. Verwenden Sie für die
folgenden Übungsbeispiele die Tabelle Getränke:
1)
Zählen Sie in der Getränke-Tabelle, von wievielen Artikeln mehr als 45 Stück auf Lager
sind. Die Zählung soll überschrieben werden mit über 45 auf Lager
2)
Bilden Sie den Mittelwert der Einkaufspreise von den Artikeln, die vom Lieferanten Maisel
bezogen werden. Verwenden Sie als Überschrift Mittelwert der EKpreise von Maisel
3)
Das Maximum im Bestand der Artikel, die als 0.7-Liter-Flaschen gehandelt werden
4)
Die Summe des Bestands der Spirituosen, deren Einkaufspreis zwischen 8,00 und
12,00 liegt
5)
Das Minimum des Bestands der Artikel, die kein Bier sind.
6)
wie Aufg. 5), aber zusätzliche Bedingung: Die Getränke sollen nicht vom Lieferanten
Müller KG sein.
Noch einige Aufgaben zur Tabelle Mieter:
a) den Mittelwert der Mietkosten der Düsseldorfer Mieter, überschrieben: "Mittelwert D-dorf"
b) die Summe der Mietkosten der Privatpersonen
c) das Minimum der Mietkosten bei den Mietern, deren Postleitzahl mit 0, 1, 2, 3 oder 4
beginnt, überschrieben mit "PLZ unter 50000"
d) die Summe der Mietkosten von den Leuten, deren Nachname mit Sch beginnt.
14
Einführung in SQL
Abfragen mit select
Lösungen zu den Aufgaben S. 14
1) SELECT count (*) as 'über_45 auf Lager'
FROM Getränke
where Bestand >45
2) SELECT avg (EKPREIS) as 'Mittelwert der EKpreise von Maisel'
FROM Getränke
where Lieferant ="Maisel"
3) SELECT max (Bestand)
FROM Getränke
where packung ="0.7"
as 'Höchstzahl von Einzelflaschenl'
4) SELECT sum (Bestand) as 'Summe'
FROM Getränke
where Art ="Spirituosen" and ekpreis between 8 and 12
5) SELECT min (Bestand)
FROM Getränke
where Art<>"Bier"
as 'Minimal'
6) SELECT min (Bestand) as 'Minimal'
FROM Getränke
where Art<>"Bier" and not Lieferant ="Müller KG"
a) SELECT avg (Mietkosten) as "Mittelwert D-dorf"
FROM Mieter
where Ort="Düsseldorf";
b) SELECT sum (Mietkosten)
FROM Mieter
where Anrede <>"Firma"
c) select min (Mietkosten) as "PLZ unter 50000"
FROM Mieter
where PLZ <"5"
d) select sum (Mietkosten)
FROM Mieter
where Nachname like "Sch*"
2.6 Select-Befehl mit Gruppierung
mit dem Zusatz: "group by" lassen sich Gruppen von Ergebnissen bilden, z. B. so:
select Ort, sum (Mietkosten) as "Summe
Ort
"Summe Mietkosten"
Mietkosten"
Aachen
0
from Mieter
group by ort
Statt der ursprünglich 15 Zeilen der Tabelle Mieter
werden nur noch 10 Zeilen angezeigt, weil die Mietkosten von Mietern aus gleichen Orten summiert
wurden.
Berlin
Düsseldorf
Frankfurt a. M.
Frankfurt/Oder
Hamburg
Köln
München
Stuttgart
Ulm
-104,75
10750
-265
210,5
-5423,25
0
-45,75
0
2110,9
"Summe Mietkosten"
wichtig ist für eine sinnvolle Ausgabe, dass man in
0
der ersten Zeile auch das Feld aufführt, nach dem
-104,75
gruppiert wird (hier: Ort), denn sonst weiß man in der
10750
Ausgabe nicht, um was es sich handelt:
-265
15
Einführung in SQL
Abfragen mit select
Aufgabe: Erstellen Sie eine SQL-Abfrage zur Tabelle
1
Mieter, die das folgene Ergebnis erzielt:
gruppiert nach dem Feld Anrede (also getrennt für Firmen, Frauen und Männer) soll
der Mittelwert der Mietkosten ermittelt werden.
anrede "Mittelwert der Mietkosten"
Firma
-2869,375
Frau
2433,75
Herr
359,6
Auch mit dem count-Befehl läßt sich in Gruppierungen arbeiten:
SELECT Anrede, count (*) as Anzahl
FROM Mieter
group by anrede;
Anrede Anzahl
Firma
2
Frau
4
Herr
9
Vorsicht: Diese Abfrage führt
zu einer Fehlermeldung:
SELECT Anrede, count (*)
FROM Mieter
group by Ort;
Es ist nicht möglich, nach einem Feld zu gruppieren, das nicht dem select-Ausdruck entspricht.
Aufgabe: Zählen Sie die Anzahl Mieter in den einzelnen
Orten:
2
Aufgabe: Ermitteln Sie den kleinsten Wert (Minimum) der
Mietkosten, nach Orten gruppiert
3
ort Anzahl Mieter
Aachen
1
Berlin
4
Düsseldorf
2
Frankfurt a. M.
2
Frankfurt/Oder
1
Hamburg
1
Köln
1
München
1
Stuttgart
1
Ulm
1
ort "kleinster Wert"
Aachen
0
Berlin
-315,5
Düsseldorf
750
Frankfurt a. M.
-385
Frankfurt/Oder
210,5
Hamburg
-5423,25
Köln
0
München
-45,75
Stuttgart
0
Ulm
2110,9
Öffnen Sie jetzt die Datenbank Getränke.
Aufgabe: Gruppiert nach Lieferanten soll die An4
zahl der Getränkesorten (durch Zählen
der Artikel) ermittelt werden:
Aufgabe: Gruppiert nach Packung soll das Minimum im Bestand herauskommen:
5
16
Lieferant "Anzahl Getränkesorten"
Bolz GmbH
5
Maisel
4
Müller KG
6
Schnaps & Co
1
packung "geringste Bestandsmenge"
0.7
18
Einweg 6*0.33
35
Kasten 0.5*20
30
Kasten 0.7*12
25
Einführung in SQL
Aufgabe: Der geringste Einkaufspreis innerhalb einer Getränke-Art:
6
Abfragen mit select
art "kleinster Einkaufspreis"
Bier
3,85
Spirituosen
5,48
Tonic
1,21
Wasser
2,86
Aufgabe: Gruppierung nach Lieferanten
und dem Mittelwert vom Verkaufspreis
7
Lieferant "mittlerer Verkaufspreis"
Bolz GmbH
8,682
Maisel
6,68
Müller KG
9,93666666666667
Schnaps & Co
16
Aufgabe: Summe des Bestands, gruppiert
Lieferant "Stück auf Lager"
Bolz GmbH
185
Maisel
185
Müller KG
234
Schnaps & Co
28
nach Lieferant:
8
Aufgabe: Zählung der Artikel je nach
Packungseinheit
9
packung "wieviel Einheiten?"
0.7
7
Einweg 6*0.33
1
Kasten 0.5*20
6
Kasten 0.7*12
2
(Lösungen 1-9 auf der nächsten Seite)
2.7 Die Having-Klausel
Einschränkende Bedingungen mittels where-Klausel haben wir bereits besprochen. Das
folgende Beispiel summiert - zunächst ohne Einschränkung – die Mietkosten der MieterTabelle, gruppiert nach Anrede, also getrennt nach Firmen, Frauen und Männern.
SELECT Anrede, sum(mietkosten) as "Mietkosten"
FROM Mieter
group by Anrede
Anrede "Mietkosten"
Firma
-5738,75
Frau
9735
Herr
3236,4
Wenn wir dasselbe Ergenis, jedoch ohne Firmen, erhalten wollen, dann lautet die SQLAbfrage:
SELECT Anrede, sum(mietkosten) as "Mietkosten"
FROM Mieter
where Anrede <>"Firma"
Anrede "Mietkosten"
Frau
9735
Herr
3236,4
group by Anrede
Die where-Klausel lässt sich also zusammen mit Gruppierungen verwenden, allerdings
nicht, wenn innerhalb der where-Klausel Aggregatfunktionen (sum, avg, min, max, count)
verwendet werden.
Sehen Sie dazu als Beispiel die folgende Abfrage an:
SELECT Anrede, sum(mietkosten) AS "Mietkosten"
FROM Mieter
GROUP BY Anrede
where sum(mietkosten)>5000;
Wenn eine rechnerische Auswertung Teil einer Bedingung sein soll, funktioniert die whereKlausel nicht mehr; stattdessen müssen Sie in dem Fall mit having arbeiten.
SELECT Anrede, sum(mietkosten) AS ["Mietkosten"]
FROM Mieter
GROUP BY Anrede
having sum(mietkosten)>5000;
17
Anrede "Mietkosten"
Frau
9735
Einführung in SQL
Abfragen mit select
Lösungen S. 16/17:
1
select anrede, avg (Mietkosten) as "Mittelwert der Mietkosten"
from Mieter
group by anrede;
2
SELECT ort, count (ort) as "Anzahl Mieter"
FROM Mieter
group by Ort;
3
SELECT ort, Min(Mietkosten) as "kleinster Wert"
FROM Mieter
group by Ort;
4
SELECT Lieferant, count (*) as "Anzahl Getränkesorten"
FROM Getränke
group by Lieferant;
5
SELECT packung, min(bestand) as "geringste Bestandsmenge"
FROM Getränke
group by packung;
6
SELECT art, min(ekpreis) as "kleinster Einkaufspreis"
FROM Getränke
group by art;
7
SELECT Lieferant, avg(VKpreis) as "mittlerer Verkaufspreis"
FROM Getränke
group by Lieferant;
8
SELECT Lieferant, sum(bestand) as "Stück auf Lager"
FROM Getränke
group by Lieferant;
9
SELECT packung,count(*) as "wieviel Einheiten?"
FROM Getränke
group by packung;
Fortsetzung Having-Klausel:
Sehen Sie sich dazu die Tabelle Abteilung an:
Name
Abteilung
Groß
Klein
Peters
Müller
Gardner
Lindemann
Kussnacht
Gernegroß
Hünzer
Klinger
Forschung
Marketing
Personal
Forschung
Marketing
Personal
Forschung
Marketing
Personal
Forschung
Gehalt
2.670,00 €
2.890,00 €
2.230,00 €
2.700,00 €
2.480,00 €
2.200,00 €
2.780,00 €
2.300,00 €
3.100,00 €
4.270,00 €
Abschluss
Ausbildung
FH
FH
Uni
Uni
Ausbildung
FH
Ausbildung
Uni
Uni
UrlaubsKrank_Tage Einstelldatum
tage
32
30
28
30
30
28
28
30
29
30
18
10
12
5
0
7
5
0
20
11
10
01.01.90
01.01.93
01.01.97
01.04.95
01.07.97
01.01.98
01.01.93
01.03.92
01.01.96
01.01.95
Datum
Beförderung
01.06.96
01.06.99
01.03.00
01.03.96
01.06.98
01.01.00
01.01.99
Verheiratet
Ja
Nein
Nein
Ja
Ja
Ja
Nein
Ja
Nein
Ja
Einführung in SQL
Abfragen mit select
Abteilung Gehaltssumme
Forschung
12420
Marketing
7670
Personal
7530
SELECT Abteilung, sum(gehalt) as "Summe der Gehälter"
FROM Abteilung
group by abteilung;
Abteilung Gehaltssumme
Forschung
12420
Aufgabe 1: Welche SQL-Abfrage lässt nur die Abteilung mit
einer Gehaltssumme über 8000 herauskommen?
Aufgabe 2: Bilden Sie die Gehaltssumme aller verheirateten bzw. nicht verheirateten Kollegen
verheiratet Gehaltssumme
Ja
16620
Nein
11000
Aufgabe 3: Zeigen Sie den Mittelwert der Krank_tage , grup-
abschluss
Kranktage
Ausbildung 11,6666666666667
piert nach Abschluss, für die Kollegen an, bei
denen der Mittelwert in der Abschlussgruppe über
10 Krankentage liegt:
Aufgabe 4: Ermitteln Sie das höchste Gehalt in
abteilung "höchstes Gehalt"
Forschung
4270
Marketing
2890
Personal
3100
jeder Abteilung:
Aufgabe 5: Wie Aufgabe 4, aber nur für die Abteilungen, wo
abteilung "höchstes Gehalt"
Forschung
4270
Personal
3100
das höchste Gehalt über 3000 € liegt:
Aufgabe 6: In welcher Abteilung liegt das Maximum der
Urlaubstage über 30?
abteilung "am meisten Urlaub"
Forschung
32
Aufgabe 7: Wie hoch ist die Summe der "krankgefeierten" Tage in
der Abteilung, in der – wie bei Aufg. 6) das Maximum
der Urlaubstage über 30 liegt?
Aufgabe 8: Gefragt sind Name und Abteilung von den Mitarbeitern,
die schon einmal befördert wurden
Abteilung befördert wurden
Aufgabe 10: Nur die Anzahl beförderter Kollegen aus der Abteilung
Aufgabe 11: Name und Datum der Beförderung von den
Kollegen, bei denen zwischen Einstellung und
Beförderung weniger als 4 Jahre vergingen
Aufgabe 12: Abteilung und durchschnittl. Urlaubstage der
Abteilung Marketing
19
Name
Groß
Müller
Gardner
Kussnacht
Gernegroß
Hünzer
Klinger
Abteilung
Forschung
Forschung
Marketing
Forschung
Marketing
Personal
Forschung
befördert Abteilung
4 Forschung
2 Marketing
1 Personal
Aufgabe 9: Jetzt soll gezählt werden, wie viele Kollegen je nach
Marketing
abteilung "Krank"
Forschung
20
befördert Abteilung
2 Marketing
name Datum_Beförderung
Gardner
01.03.00
Kussnacht
01.03.96
abteilung "Durchschnitt Urlaub"
Marketing
30
Einführung in SQL
Abfragen mit select
Aufgabe 13: Abschluss und Gehalt der Angestellten mit
Uni-Abschluss
Aufgabe 14: Das geringste Gehalt in jeder nach Abschluss
gebildeten Gruppe
abschluss
Uni
Uni
Uni
Uni
Gehalt
2.700,00 €
2.480,00 €
3.100,00 €
4.270,00 €
abschluss Expr1001
Ausbildung
2200
FH
2230
Uni
2480
Aufgabe 15: Das geringste Gehalt in der Gruppe, die FH-Abschluss hat
Lösungen zu den Aufgaben S. 19
1. SELECT [Abteilung], sum([Gehalt]) AS Gehaltssumme
FROM Abteilung
GROUP BY [Abteilung]
having sum(gehalt) >8000
2. SELECT verheiratet, sum([Gehalt]) AS Gehaltssumme
FROM Abteilung
GROUP BY verheiratet
3. SELECT abschluss, avg(krank_tage) as Kranktage
FROM Abteilung
GROUP BY Abschluss
having avg(krank_tage)>10
4. SELECT abteilung, max(gehalt) as "höchstes Gehalt"
FROM Abteilung
GROUP BY Abteilung
5. wie 4) letzte Zeile: having max(gehalt) >3000
6. SELECT abteilung, max(urlaubstage) as "am meisten Urlaub"
FROM Abteilung
GROUP BY Abteilung
having max(Urlaubstage)>30
7. SELECT abteilung, sum(krank_tage) as "Krank"
FROM Abteilung
GROUP BY Abteilung
having max(Urlaubstage)>30
8. SELECT Name, Abteilung
FROM Abteilung
where Datum_beförderung is not Null;
9. SELECT count(*) as befördert, Abteilung
FROM Abteilung
where Datum_beförderung is not Null
group by abteilung;
20
abschluss Expr1001
FH
2230
Einführung in SQL
Abfragen mit select
10. SELECT count(*) as befördert, Abteilung
FROM Abteilung
where Datum_beförderung is not Null
group by abteilung
having Abteilung="Marketing"
11. SELECT name,Datum_Beförderung
FROM Abteilung
where Datum_beförderung - Einstelldatum <365*4
12. SELECT abteilung, avg(Urlaubstage) as "Durchschnitt Urlaub"
FROM Abteilung
group by abteilung
having abteilung="Marketing"
13. SELECT abschluss, Gehalt
FROM Abteilung
where Abschluss="Uni"
14. SELECT abschluss, min(Gehalt)
FROM Abteilung
group by abschluss
15. SELECT abschluss, min(Gehalt)
FROM Abteilung
group by abschluss
having abschluss="FH"
2.8 Daten ändern: update
Um Änderungen an den Daten vorzunehmen, brauchen Sie den Befehl update.
Die Syntax lautet:
UPDATE Tabellenname
SET Spaltenname1 = Wert1
[, Spaltenname2 = Wert2]...
WHERE Suchbedingung
Beispiel:
In der Tabelle Artikel wird der
UPDATE Artikel
Ekpreis des Artikels mit der
SET Ekpreis = 120
ArtNr 129 auf 120 € erhöht
WHERE ArtNr = 129;
Vorsicht: ohne where-Klausel werden alle Werte ersetzt:
UPDATE Artikel
alle Artikel hätten dann den Wert 500!
SET EKpreis = 500;
Wenn prozentuale Änderungen des bestehenden Wertes vorgenommen werden sollen, dann
muss das Feld mit seinem alten Wert zur Berechnung herangezogen werden:
UPDATE Artikel
SET Ekpreis = Ekpreis *1.1;
In der Tabelle Artikel wird der
Ekpreis aller Artikel um 10 % erhöht
Es kann auch sinnvoll sein, dabei ein Feld in Abhängigkeit von einem anderen Feld zu
bestimmen. Im folgenden Beispiel soll von allen Artikeln der Verkaufspreis das 1,5-fache des
Einkaufspreises betragen:
UPDATE Artikel
SET VKpreis = Ekpreis *1.5;
21
Einführung in SQL
Abfragen mit select
Das letzte Beispiel, aber nur für einen bestimmten Lieferanten:
UPDATE Artikel
SET VKpreis = Ekpreis *1.5;
where LiefNr=350
Aufgabe: Legen Sie die hier abgebildete Tabelle Abteilung zugrunde, um mit dem updateBefehl einige Änderungen durchzuführen:
1. Das Gehalt des Mitarbeiters Lindemann wird um 100 € erhöht.
2. Die Urlaubstage der Leute aus der Abteilung Marketing werden um 2 Tage erhöht.
3. Das Gehalt aller Mitarbeiter steigt um 3 %.
4. Das Gehalt der Leute mit weniger als 30 Urlaubstagen steigt um 75 €.
5. Der Kollege Klinger wird in die Abteilung Marketing versetzt.
2.9 Verbindung von Tabellen (Join)
Die bisher betrachteten Beispiele haben sich jeweils nur auf eine Tabelle bezogen. Im Folgenden geht es um Select-Abfragen, die ihre Ergebnisse aus verschiedenen Tabellen beziehen (s. auch Buch Michelmann/Hettwer ab S. 143).
Eine wichtige Anforderung an relationale Datenbanken ist die Zerlegung der Informationen in
verschiedene Tabellen. Dazu dient der Prozess der Normalisierung (1.-3. Normalstufe).
Durch Abfragen werden die Informationen, die auf verschiedene Tabellen verteilt sind, zusammengeführt.
Bei der Arbeit mit Access haben Sie gesehen, wie die Verbindung der Tabellen durch Beziehungen erfolgt (1:1 und 1:n-Beziehungen); die Tabellen werden über Primär- und Fremdschlüssel miteinander verbunden.
Dass es Primär- und Fremdschlüssel in den Tabellen gibt, ist auch für Abfragen mittels SQL
Vorbedingung. Die Verbindung der Tabellen muss aber durch entsprechende Befehle erfolgen, bzw. innerhalb des Select-Befehls muss dem Datenbanksystem mitgeteilt werden, welche Verbindung zwischen den Tabellen besteht - SQL "weiß" ja nichts vom Beziehungsfenster in Access, in welchem wir bisher die Beziehungen hergestellt und grafisch dokumentiert
haben.
Wenn Tabellen miteinander in Beziehung gesetzt werden, dann gibt es oft dieselben Feldnamen in Tabelle A und Tabelle B. Auch wenn es keine Anforderung an die Verbindung von
Tabellen durch Primär- und Fremdschlüssel ist, dass die Felder, über die man die Verbindung herstellt, den selben Namen haben, dann macht man es oft der Übersichtlichkeit halber.
Um klar zu machen, um welches Feld aus welcher Tabelle es sich handelt, muss dann entweder immer der komplette Tabellenname zusätzlich angegeben werden, abgetrennt durch
einen Punkt, oder (besser) man verwendet Aliasnamen für die Tabellen. In der Regel ver-
22
Einführung in SQL
Abfragen mit select
fährt man dabei so, dass man den Tabellennamen durch einen Buchstaben abkürzt, also
z. B. die Tabelle Artikel durch A. (Beachten Sie den Unterschied: Die Aliasnamen, die wir
bisher verwendet hatten, bezogen sich auf Spaltenüberschriften).
Das folgende Beispiel zeigt dies, zunächst noch nicht auf die Verbindung von Tabellen bezogen. Sie sehen dabei an der linken Spalte mit Alias, dass der Aliasname A für die Tabelle
Artikel erst in der zweiten Zeile vergeben wird, nachdem man ihn schon der ersten Zeile
verwenden konnte!
ohne Aliasname
Verwendung von Aliasname für Tabelle
SELECT Artikel.Bezeichnung
from Artikel;
SELECT A.Bezeichnung
from Artikel A;
Die Verwendung von Aliasnamen spart dann auch Zeit: Die Tabellen bekommen einen
Buchstaben als Alias zugewiesen. Dann kann immer mit dem Buchstaben auf die Tabelle
verwiesen werden, wenn gesagt werden muss, aus welcher Tabelle ein Feld stammt. Vor
allem bei Abfragen, die aus vier, fünf oder mehr Zeilen bestehen (mit where- und havingKlauseln usw.), in denen immer wieder die Feldnamen angesprochen werden müssen, ist
dies wichtig.
Die folgenden Beispiele beziehen sich auf die Datenbank Firma, die mit Access erstellt wurde. Testen Sie dazu zunächst den sogenannten Cross Join, in dem jedes Feld der einen
Tabelle mit der anderen Tabelle verbunden wird (kartesisches Produkt). Das Ergebnis macht
tatsächlich keinen Sinn, weil alles mit jedem verbunden wird:
SELECT A.Bezeichnung, L.Lieferant
from Artikel A,Lieferant L;
usw., 36 Zeilen bei 12 Artikeln und drei Lieferanten
jeder Lieferant steht bei jedem Artikel!
Bezeichnung
Lieferant
Haube für Tastatur Meyer OHG
Haube für Tastatur Computer-Versand
Haube für Tastatur Schmitz AG
Disketten 3 1/2 DD Meyer OHG
Disketten 3 1/2 DD Computer-Versand
Disketten 3 1/2 DD Schmitz AG
Wenn die Gleichsetzung über das Feld, welches in beiden Tabellen vorkommt (Lieferantennummer), gemacht wird, dann ist ein sinnvolles Ergebnis zu sehen. Man nennt es Equi Join:
SELECT A.Bezeichnung, L.Lieferant
from Artikel A, Lieferant L
where A.Lieferantennummer=L.LiefNr;
mit der where-Klausel wird die Gleichsetzung
erzielt:
Die Zeilen werden angezeigt, wo die Liefnummer der Tabelle Lieferant gleich der Lieferantennummer der Tabelle Artikel ist
Bezeichnung
Lieferant
Haube für Tastatur
Meyer OHG
Disketten 3 1/2 DD
Meyer OHG
Maus seriell
Meyer OHG
Monitor VGA
Meyer OHG
Centronics-Kabel
Meyer OHG
Disketten 5 1/4 HD
Computer-Versand
Tastatur deutsch
Computer-Versand
Disketten 3 1/2 HD
Computer-Versand
Motherboard ASUS A7 V3
Schmitz AG
Disketten 5 1/4 DD
Schmitz AG
Farbband AX 35
Schmitz AG
Farbband AX 55
Schmitz AG
Vorsicht: Die einschränkende Bedingung durch die where-Klausel reicht nicht aus, wo nach
bestimmten Daten gesucht wird.
Angenommen, Sie wollen die Artikelbezeichnung und den Lieferantennamen anzeigen, und
zwar nur für die Artikel, die von Lieferant Meyer OHG geliefert werden. (b.w.!)
23
Einführung in SQL
Abfragen mit select
SELECT A.Bezeichnung, L.Lieferant
from Artikel A, Lieferant L
where L.Lieferant="Meyer OHG";
Die Einschränkung durch die where-Klausel reicht
nicht aus. Es wird das Cross Join gebildet, und bei
jedem Artikel wird Meyer OHG angezeigt
es sind alle Artikel, bei jedem steht Meyer OHG!
Bezeichnung
Haube für Tastatur
Disketten 3 1/2 DD
Disketten 5 1/4 HD
Motherboard ASUS A7 V3
Maus seriell
Disketten 5 1/4 DD
Tastatur deutsch
Monitor VGA
Farbband AX 35
Farbband AX 55
Disketten 3 1/2 HD
Centronics-Kabel
Lieferant
Meyer OHG
Meyer OHG
Meyer OHG
Meyer OHG
Meyer OHG
Meyer OHG
Meyer OHG
Meyer OHG
Meyer OHG
Meyer OHG
Meyer OHG
Meyer OHG
So ist es richtig: Equi Join, dann mit and die Einschränkung auf den einen Lieferanten:
SELECT A.Bezeichnung, L.Lieferant
from Artikel A, Lieferant L
where A.Lieferantennummer=L.LiefNr
and L.Lieferant="Meyer OHG";
Bezeichnung
Lieferant
Haube für Tastatur Meyer OHG
Disketten 3 1/2 DD Meyer OHG
Maus seriell
Meyer OHG
Monitor VGA
Meyer OHG
Centronics-Kabel Meyer OHG
Genauso suchen Sie auch nach einem ganz bestimmten Artikel, für den Daten aus den beiden Tabellen benötigt werden:
SELECT A.Bezeichnung, L.Lieferant
from Artikel A ,Lieferant L
where A.Lieferantennummer=L.LiefNr
and A.Bezeichnung="Haube für Tastatur";
Bezeichnung
Lieferant
Haube für Tastatur Meyer OHG
Die folgende Abfrage sucht nach den Artikelnummern von dem Lieferanten, der im Ort
Sprockhövel ansässig ist:
SELECT A.Artikelnummer,L.Lieferant
from Artikel A, Lieferant L
where A.Lieferantennummer=L.LiefNr
and L.Ort="Sprockhövel"
Artikelnummer
129
206
282
391
639
Lieferant
Meyer OHG
Meyer OHG
Meyer OHG
Meyer OHG
Meyer OHG
Die allgemeine Form des Equi Join lautet also:
SELECT Tabelle1.Feld1, Tabelle2.Feld3
FROM Tabelle1, Tabelle2
WHERE Tabelle1.Feld2 = Tabelle2.Feld2
2 beliebige Felder
in zwei Tabellen
in denen ein Feld (Feld2) gleiche Einträge
hat
Die Felder, die in der ersten Zeile mit Select ausgewählt werden, müssen nicht unbedingt
aus beiden Tabellen stammen, dann aber ein Teil der Bedingung – sonst läge gar kein Join
vor. Sehen Sie dazu folgendes Beispiel:
24
Einführung in SQL
Abfragen mit select
Aufgabe: Wie lauten Artikelnummer und Bezeichnung von den Artikeln, deren Lieferantennummer 25 ist und von denen mehr als 100 Stück vorrätig sind?
SELECT A.Artikelnummer,A.Bezeichnung
from Artikel A, Lieferant L
where A.Lieferantennummer=L.LiefNr
and L.LiefNR=25
and A.Menge>100
Artikelnummer Bezeichnung
206 Disketten 3 1/2 DD
208 Disketten 5 1/4 HD
331 Disketten 5 1/4 DD
352 Tastatur deutsch
452 Farbband AX 35
463 Farbband AX 55
530 Disketten 3 1/2 HD
Die Verbindung kann sich
natürlich über mehr als zwei
Tabellen erstrecken.
Durch eine SQL-Abfrage
sollen Artikelbezeichnung
und Name des Kunden von
den Verkaufsdaten angezeigt werden, wo der Kunde
namens Hartfiel etwas gekauft hat. Dazu muss das
Beziehungsmodell der Datenbank herangezogen werden:
Sie sehen dabei, dass die
Verbindung von Kunde zu
Artikel über die beiden Tabellen Verkauf und Verkaufdetails läuft.
Deshalb müssen in der Abfrage alle Verbindungen aufgeführt werden:
SELECT A.Bezeichnung, K.Name, VD.Menge
from Artikel A, Kunde K, Verkauf Vk,
VerkaufDetails VD
where Vk.Kundennummer = K.Kundennummer
and Vk.VerkaufNr = VD.VerkaufNr
and Vd.Artikelnummer=A.Artikelnummer
and K.Name="Hartfiel"
Bezeichnung Name Menge
Centronics-Kabel Hartfiel
50
Versuchen Sie nun, die folgenden Beispiele zur Datenbank Firma zu lösen:
1. Wie lautet die Adresse des Lieferanten, der den Artikel mit der Nummer 129 liefert?
Lieferant
Straße PLZ
Ort
Meyer OHG Haßlinghauser Straße 89 43320 Sprockhövel
2. Wer hat nach dem 15.08.01 etwas bestellt?
(Vorsicht: in der SQL-Version, die in Access zur Anwendung kommt, muss das Datum in der Form #8/15/2001# (Monat/Tag/Jahr) angegeben werden)
Name
Grieswelle
Hartfiel
Bestelldatum
12.11.01
30.09.01
25
Einführung in SQL
Name
Schäfer
Schäfer
Abfragen mit select
Bestelldatum
25.09.01
13.10.01
3. An welchem Datum hat der Kunde mit der Nummer 10903 etwas bestellt?
Bestelldatum
13.05.01
20.05.01
30.06.01
4. Welcher Kunde hat Artikel mit einem Einzelverkaufspreis über 100 Euro bestellt?
Name
Handke
Hillmann
5. Der Mindestbestand und die Artikelbezeichnung von den Artikeln, die Meyer OHG liefert, soll aufgelistet werden.
Mindestbestand
10
15
20
50
10
Bezeichnung
Haube für Tastatur
Disketten 3 1/2 DD
Maus seriell
Monitor VGA
Centronics-Kabel
6. Welcher Lieferant liefert welche bruchempfindlichen Artikel?
Lieferant
Schmitz AG
Meyer OHG
Meyer OHG
Bezeichnung
Motherboard ASUS A7 V3
Monitor VGA
Centronics-Kabel
Centronics-Kabel sind normalerweise nicht
bruchempfindlich, aber so sind sie in der
Tabelle gespeichert!
7. Name und Anschrift des Kunden, der ein Farbband gekauft hat (Achtung: Es gibt
zwei Sorten Farbbänder)
Name
Grieswelle
Handke
Hillmann
Schäfer
Straße
Uferweg 9
Wörterweg 19
Kölner Straße 80
Bergstraße 7
PLZ
50983
80702
40217
60321
Ort
Köln
München
Düsseldorf
Frankfurt
8. Artikelbezeichnung, Name des Kunden, gekaufte Menge und Gesamtpreis (Verkaufspreis mal Menge sowie die Mehrwertsteuer von 16 % von den Verkaufsvorgängen, bei denen Nettopreis mal verkaufte Menge über 2000 Euro lag.
Bezeichnung
Name
Menge
Motherboard ASUS A7 V3
Motherboard ASUS A7 V3
Maus seriell
Centronics-Kabel
Hillmann
Handke
Schäfer
Grieswelle
10
3
30
100
26
Gesamtprei
s
9800
2940
2250
2327
MWSt
1568
470,4
360
372,32
Einführung in SQL
Abfragen mit select
Lösungen zu den Aufgaben S. 25/26
SELECT L.Lieferant, L.Straße, L.PLZ, L.Ort
1.
from Lieferant L, Artikel A
where A.Lieferantennummer=L.LiefNr
and A.Artikelnummer=129;
2.
SELECT distinct K.Name, VK.Bestelldatum
FROM Kunde AS K, Verkauf AS VK, Verkaufdetails AS VD
WHERE K.Kundennummer=VK.Kundennummer
AND VK.VerkaufNr=VD.VerkaufNr
AND VK.Bestelldatum>#8/15/2001#;
3.
SELECT Vk.Bestelldatum
from Kunde K, Verkauf VK
where K.Kundennummer=VK.Kundennummer
and K.Kundennummer=10903;
4.
SELECT distinct K.Name
FROM Artikel A, Kunde K, Verkauf Vk, VerkaufDetails VD
WHERE Vk.Kundennummer=K.Kundennummer
And Vk.VerkaufNr=VD.VerkaufNr
And Vd.Artikelnummer=A.Artikelnummer
and A.Einkaufspreis>100;
5.
SELECT A.Mindestbestand, A.Bezeichnung
FROM Lieferant L, Artikel A
WHERE A.Lieferantennummer=L.LiefNr
And L.Lieferant="Meyer OHG";
6.
SELECT L.Lieferant, A.Bezeichnung
FROM Lieferant L, Artikel A, Lager LG
WHERE A.Lieferantennummer=L.LiefNr
and LG.Artikelnummer=A.Artikelnummer
And LG.bruchempfindlich=-1;
7.
Select distinct K.Name, K.Straße, K.PLZ, K.Ort
from Kunde K, Artikel A, Verkauf VK, Verkaufdetails VD
where K.Kundennummer= VK.Kundennummer
and Vk.Verkaufnr=VD.Verkaufnr
nd Vd.Artikelnummer=A.Artikelnummer
nd A.Bezeichnung like "Farbband*";
8.
select A.Bezeichnung, K.Name, vd.Menge, A.Verkaufspreis*VD.Menge as
Gesamtpreis, A.Verkaufspreis*VD.Menge*0.16 as MWSt
from Kunde K, Artikel A, Verkauf VK, Verkaufdetails VD
where K.Kundennummer= VK.Kundennummer
and Vk.Verkaufnr=VD.Verkaufnr
and Vd.Artikelnummer=A.Artikelnummer
and VD.Menge*A.Verkaufspreis>2000;
27
PHPMyAdmin
Einsatz von MySQL unter Windows
3 Zugriff auf Internet-Datenbanken
Datenbanken im Internet werden für viele Zwecke eingesetzt. Einige Beispiele:
⇒ Autobörsen wie autoscout24.de oder mobile.de
⇒ Webshops, die ein Artikelsortiment anbieten, das über eine Datenbank abgerufen wird
⇒ Auktionen bei ebay
Im Zusammenhang mit der medizinischen Dokumentation lassen sich ebenfalls viele Beispiele finden:
⇒ Abfrage von Verschlüsselungen, z. B. ICD-10 oder die Verschlüsselung von OPS-301
⇒ Medizinische Datenbanken nach Forschungsergebnissen, Veröffentlichungen, Medikamenten usw. abfragen
Um einen Datenbankzugriff mit einer Website zu ermöglichen, muss die Datenbank auf dem
Webserver bereitgestellt werden.
Wenn man den Aufruf einer "normalen" HTML-Datei im Internet durch einen Nutzer darstellt,
dann wird HTML übertragen. Der Browser (z. B. der Internet Explorer) kann dann den Aufbau der Seite darstellen. Wichtig im Unterschied zu Datenbanken ist: Wenn eine Adresse
aufgerufen wird, erfolgt die Übertragung des gesamten HTML-Codes zum Client.
HTML
Webserver
Client (Nutzer)
Wenn auf Inhalte eine Datenbank zugegriffen wird, dann muss beim Provider (dem Anbieter
der Internet-Dienstleistungen, auf dessen Server auch die HTML-Dateien gespeichert sind)
der Zugriff auf die Datenbank erfolgen. Im Unterschied zur einfachen, statischen HTML-Seite
kann natürlich nicht die komplette Datenbank zum Kunden übertragen werden. Nur die Auswahl an Daten, die der Kunde abruft, wird bereitgestellt und zum Kunden übertragen.
HTML
PHP
Datenbank
(z. B. MySQL)
Client (Nutzer)
Webserver
Der Kunde ruft eine HTML-Datei ab, die z. B. ein Formular zur Auswahl von Daten darstellt.
In dieses Formular trägt der Kunde seine Wünsche ein und sendet die Datei ab. De Webserver nimmt auf, was der Kunde gesandt hat, und reicht dies an die Datenbank weiter. Dazu
benötigt der Server z. B. PHP. Diese Programmiersprache wird deshalb als "serverseitige
Skriptsprache" beschrieben.
PHP reicht die Ergebnisse der Abfrage an die Datenbank an den Webserver weiter (vermittelt über PHP). Die Ausgabe an den Kunden erfolgt wieder über reines HTML, vom PHPCode bekommt der Kunde nichts zu sehen.
Um eine Datenbank im Web einzurichten, benötigt man
a)
Kenntnis in MySQL, PHP und SQL (denn SQL enthält die eigentliche Datenbankabfrage)
b)
einen Provider, der MySQL und PHP anbietet. Dies ist in der Regel erst bei den teureren "Internet-Paketen" (ab ca. 5 € / Monat, oft noch wesentlich teurer) der Fall.
28
PHPMyAdmin
Einsatz von MySQL unter Windows
3.1 Einsatz des Apache-Servers
Um auf einem PC die Datenbank MySQL laufen zu lassen, ist es erforderlich, den Computer
als Webserver zu konfigurieren. Dies geschieht z. B. über Apache (Apache Server).
Mit einer Verbreitung von rund 50% ist der Apache-Webserver der weltweit meistverbreitete
Webserver, da dieser extrem leistungsfähig und stabil ist.
Vorteile des Apache:
⇒ gratis
⇒ Open Source
⇒ extrem leistungsfähig und stabil
⇒ wird laufend weiterentwickelt
⇒ für verschiedene Betriebssysteme
⇒ breite Konfigurationsmöglichkeiten
3
⇒ modularer Aufbau
Der Webserver läuft, wie der Name schon sagt, in der Regel als Server bei einem InternetProvider. Um ihn lokal zu nutzen, richten wir ihn als "localhost" ein. Damit ist jeder PC in der
Lage, sowohl als Server für Websites als auch als Client zu fungieren.
3.2 WAMP-Installation
Die Abkürzung WAMP steht für Windows-Apache-MySQL-PHP. Das Gegenstück dazu ist
LAMP (L für Linux). Auch wenn Webserver häufig auf Linux laufen, können wir mit einer
WAMP-Installation dennoch dasselbe Ziel erreichen.
Es ist möglich, die einzelnen Programme separat zu installieren und aufeinander abzustimmen. Das ist jedoch nicht ganz einfach, es verlangt große Sorgfalt in der Abstimmung der
Einzelkomponenten. Die andere Möglichkeit besteht darin, auf eine sogenannte Distribution
zurückzugreifen, das ist ein Komplettpaket mit Installationsroutine. Die beste Empfehlung
dazu ist zur Zeit Xampp (Download über www.apachefriends.org). Dann stehen alle erforderlichen Teile nach der Installation zur Verfügung.
Aufgabe: Kopieren Sie das Programm
vom Netzordner auf
Ihre Festplatte. Starten Sie es dann mit einem Doppelklick.
Bestätigen Sie das erste Dialogfeld mit OK
Klicken Sie auf Weiter.
3
www.webmeister.ch
29
PHPMyAdmin
Einsatz von MySQL unter Windows
Das Lizenzabkommen mit
Annehmen bestätigen.
Im nächsten Dialogfeld wird
c:\xampp
eingestellt.
Klicken Sie dann auf Installieren.
Der Installationsvorgang läuft eine
Weile.
Zum Schluss meldet XAMPP den
Abschluss des Installationsvorgangs.
Klicken Sie auf Fertigstellen.
30
PHPMyAdmin
Einsatz von MySQL unter Windows
Im Ordner C:\xampp finden Sie diese beiden Dateien.
Kopieren Sie auf das Desktop.
Starten Sie aus dem xampp-Ordner zunächst diese Datei:
Wenn diese Meldung erscheint,
drücken Sie eine
Taste.
Starten Sie die Datei xampp_start.exe. Diese Datei muss in Zukunft immer zu Beginn der Arbeit gestartet werden. Das schwarze Fenster nicht schließen, sondern nur minimiert in der
Task-Leiste ablegen.
Es ist zwar auch möglich, Apache und MySQL als sogenannten Dienst in Windows einzurichten, so dass es immer zur Verfügung steht, aber diese Variante benötigt viel Arbeitsspeicher,
auch dann, wenn das Programm gar nicht gebraucht wird.
Hier meldet sich jetzt
Xampp im Internet
Explorer.
Klicken Sie auf
Deutsch.
Xampp meldet sich
jetzt mit dem WillkommensBildschirm.
Klicken Sie zunächst
auf Status, um zu sehen, ob alles läuft.
31
PHPMyAdmin
Einsatz von MySQL unter Windows
Diese Meldung zeigt,
welche Module aktiviert sind.
Aufgabe: Rufen Sie jetzt unter Tools PHPMyAdmin auf.
PHPMyAdmin wird gestartet. Zunächst kümmern wir uns jetzt um die Fehlermeldung, die
unten am Bildschirm erscheint.
3.3 Passwort für den localhost einstellen
Dies ist die Fehlermeldung, die wir jetzt beheben werden:
Ihre Konfigurationsdatei enthält Einstellungen (Benutzer "root" ohne Passwort), welche denen des MySQL-Standardbenutzers entsprechen. Wird Ihr MySQL-Server mit diesen Einstellungen betrieben, so können Unbefugte leicht von außen auf ihn zugreifen. Sie sollten diese
Sicherheitslücke unbedingt schließen!
Aufgabe: Klicken Sie auf Rechte. Sie sehen im PHPMyAdmin:
32
PHPMyAdmin
Einsatz von MySQL unter Windows
Auf diese Zeile kommt es jetzt an. Der root-User hat unter Kennwort den Eintrag Nein.
Aufgabe: Klicken Sie auf das Symbol zum Bearbeiten
.
Scrollen Sie ein Stück tiefer zu
Kennwort ändern. Geben Sie zweimal taw ein und klicken dann auf
OK.
PHPMyAdmin meldet die Änderung
des Passworts. Auch der SQLBefehl wird direkt mit angezeigt.
Aufgabe: Klicken Sie jetzt auf das Home-Symbol links im PHPMyAdmin
Das Ganze wird mit einer Fehlermeldung quittiert:
Aufgabe: Um dies zu beheben, muss zunächst Xampp gestoppt werden
.
Starten Sie dann den HTML-Editor: IM Ordner C:\Xampp\PHPMyadmin finden Sie die Datei
config.inc.php
Scrollen Sie zur Zeile 85 und ergänzen Sie dort taw zwischen die einfachen Hochkommata.
Aufgabe: Speichern Sie dann die Datei und schließen Sie den HTML-Editor.
Aufgabe: Starten Sie jetzt den Xampp neu. Rufen Sie dann wieder PHPMyAdmin auf. Jetzt
erfolgt keine Fehlermeldung mehr
33
Herunterladen