SQL-Grundlagen - Informatikdidaktik

Werbung
Einführung in die Wirtschaftsinformatik
Akademisches Jahr 2006/07
Prof. Andreas Meier
Assistentin:
Andreea Ionas
SQL-Grundlagen
1
2
3
4
5
6
Einleitung 1
Abfragen mit SELECT 2
2.1 Attribute auswählen (select-Klausel) 3
2.2 Auswählen von Tupeln (where-Klausel) 3
2.3 zusammengesetzte Suchbedingungen 4
2.4 Vermeidung von Mehrfachnennungen (distinct) 5
2.5 Sortieren (order-Klausel) 5
2.6 verschachtelte Abfragen 5
2.7 Tabellen multiplizieren (kartesisches Produkt) 6
2.8 Verbinden von Relationen (join) 7
2.9 Vereinigen von Tabellen (union) 8
2.10 Die Relationen-Algebra mit SQL 8
weitere Abfragemöglichkeiten 9
3.1 Platzhalter-Suche 9
3.2 Mengen-Abfragen 9
3.3 Der Exists-Operator 10
Rechnen in Tabellen 10
4.1 Das Rechnen mit Spalten 10
4.2 Rechnen mit Zeilen 11
Datenmanipulation und -definition mit SQL 12
Beispieldatenbank Terra 14
1 Einleitung
Die in einer Datenbank enthaltenen Daten können auf unterschiedliche Art organisiert sein. Das
Muster oder die Struktur, nach der die Organisation erfolgt, wird als Datenmodell bezeichnet.
Heute wird oftmals das von Codd definierte relationale Datenmodell verwendet. 1)
Das Grundelement einer relationalen Datenbank ist die Tabelle. Eine Tabelle setzt sich aus Spalten
und Zeilen zusammen; die Spalten sind die Attribute und die Zeilen werden Tupel genannt.
Die Begriffe Relation, Attribut und Tupel stammen aus der Mathematik. Sie bedeuten dasselbe
wie Tabelle, Spalte und Zeile und werden in diesem Papier synonym verwendet.
1)
Weitere mögliche Datenmodelle sind: hierarchisches Datenmodell, Netzwerk-Datenmodell, objektorientiertes Datenmodell.
Die abgebildete Tabelle Kunde enthält sechs Attribute und sieben Tupel:
Die Schnittpunkte von Kolonnen und Zeilen nennen wir (in Anlehnung an die Tabellenkalkulation)
Datenzellen. Sie enthalten die Datenwerte. Ein Datenwert kann eine Zahl sein (z.B. 1700), es kann
sich dabei aber auch um Text (z.B. Rosenweg 26) handeln oder um einen Wahrheitswert (booleschen Variable wahr/falsch).
Innerhalb einer Kolonne müssen alle Datenwerte denselben Datentyp haben (je nachdem welcher
Datentyp für die betreffende Spalte vereinbart wurde). In der Spalte PLZ sind z.B. alle Datenwerte
vom Typ « ganze Zahl » (Integer), in der Spalte Strasse hingegen vom Typ « Text ». 2)
In jeder Tabelle einer relationalen Datenbank existiert zudem ein (oder mehrere) Bezeichner, der
jede Zeile der Tabelle eindeutig definiert. Dieser Bezeichner kann entweder aus einer Spalte oder
aus einer Kombination mehrerer Spalten bestehen. Im relationalen Modell heisst dieser Bezeichner
Primärschlüssel. Im obigen Beispiel ist die Spalte KundenNr der Primärschlüssel der Tabelle
Kunde.
2 Abfragen mit SELECT
Der Grundbefehl, um Daten aus Relationen abzufragen heisst SELECT. Dieser Befehl ist erweiterbar
und sehr mächtig. Die formale Beschreibung (Syntax) sieht wie folgt aus:
SELECT [DISTINCT] spaltenname [, spaltenname …]
FROM tabellenname [, tabellenname …]
[WHERE suchausdruck]
[ORDER BY spaltenname [DESC][, spaltenname [DESC] …]] ;
• Alles was bei Syntaxdefinitionen in eckigen Klammern steht, ist fakultativ und kann je nach
Bedarf weggelassen werden.
• Die Wörter in Grossbuchstaben sind die SQL-Schlüsselwörter. Sie bilden das Gerüst der
Abfrage und müssen exakt 3) übernommen werden.
• Was kursiv (engl. italic) geschrieben wurde, ist ein Platzhalter und muss ersetzt werden.
Die ersten drei Teile (Klauseln) sind die wichtigsten. Sie haben im wesentlichen die folgenden
Bedeutung:
1. In der FROM-Klausel (zweite Zeile der Syntaxbeschreibung) wird gesagt, aus welcher Tabelle
Daten abgefragt werden sollen.
2)
3)
Bei Text spricht man auch von Zeichenketten (engl. string).
Gross-, Kleinschreibung ist dabei nicht relevant.
SQL-Grundlagen
2
2. In der SELECT-Klausel wird angegeben, welche Attribute der Tabelle angezeigt werden sollen.
3. In der WHERE-Klausel hat man die Möglichkeit, die Abfrage auf gewisse Tupel einzuschränken.
In den folgenden Abschnitten lernen Sie die verschiedenen Elemente dieses Befehls kennen.
In diesen Unterlagen verweisen die meisten Beispiele auf der Terra Datenbank: http://marvin.sn.schule.de/terra/. Die notwendigen Informationen zur Terra Datenbank findet ihr im Kapitel
6 Beispieldatenbank Terra
2.1 Attribute auswählen (select-Klausel)
Bei jeder Abfrage muss man angeben, welche Attribute der Tabelle angezeigt werden sollen. Die
gewünschten Attribute werden in der Select-Klausel mit ihrem Namen aufgeführt. So liefert z.B. der
Befehl
SELECT
Hauptstadt
FROM
LAND;
als Ergebnis die Spalte mit den Namen der Hauptstädte.
Sollen mehrere Attribute angezeigt werden, so trennt man sie durch Kommas:
SELECT
Hauptstadt, Flaeche, Einwohner
FROM
LAND;
Sollen alle Attribute der Tabelle angezeigt werden, so muss man die Merkmalsnamen nicht alle einzeln eintippen, sondern kann einen Stern als Platzhalter verwenden:
SELECT
*
FROM
LAND;
Dieser Befehl liefert alle Attribute (und Tupel) der Relation Land. Man kann sich damit also ganze
Tabellen anschauen.
2.2 Auswählen von Tupeln (where-Klausel)
Interessiert man sich nur für gewisse Datensätze (Tupel), so muss man diese durch eine Suchbedingung beschreiben. Die Suchbedingung wird mithilfe des Schlüsselworts WHERE an die SelectAbfrage angehängt.
Suchen von Zeichenketten
Durch die Abfrage
SELECT
*
FROM
LAND
WHERE
Hauptstadt='Vaduz';
wird nur der Datensatz des Landes dessen Hauptstadt Vaduz ist angezeigt .
Die gesuchte Zeichenkette muss in SQL immer zwischen Hochkommas stehen. Die Gross-/Kleinschreibung der abgefragten Werte ist bei manchen Datenbanken relevant.
Suchen von Zahlenwerten
Hingegen liefert der Befehl
SELECT
*
FROM
4)
LAND
WHERE
Einwohner>10000000;
anhand der Einwohnerzahl die Daten von grösseren Länder. Bei nummerischen Attributen können
zum Vergleichen die Operatoren =, <> (ungleich), <, >, <=, >= verwendet werden.
4)
3
Für Strings müssen Hochkommas verwendet werden, bei Zahlenwerte darf man keine verwenden.
SQL-Grundlagen
Suchen von Teilen einer Zeichenkette
Falls in der WHERE-Klausel nach Teilen einer Zeichenkette gesucht wird, so kann auch mit den
Platzhaltern % und _ gearbeitet werden. Anstelle vom Gleichheitszeichen « = » muss dann das
Schlüsselwort LIKE verwendet werden.
SELECT *
FROM
LAND
WHERE
L_Name
LIKE
'Schwe%';
Diese Abfrage findet alle Länder, deren Name mit « Schwe » beginnt; die Abfrage
« LIKE 'Schwe_ _' » (zwei Unterstriche) würde das Land Schweiz finden (nicht aber Schweden).
Das Prozentzeichen steht für eine beliebige Anzahl von Zeichen (auch für kein Zeichen), während
der Unterstrich genau ein Zeichen ersetzt.
Suchen von fehlenden Werten
Zum Abfragen von nicht ausgefüllten Zellen wird der Operator is null gebraucht. Dieser listet
jene Tupel auf, die im betreffenden Attribut keinen Eintrag aufweisen (also nicht jene, wo die Zahl 0
oder ein Leerzeichen steht). Das Gegenteil kann mittels is not null erreicht werden.
SELECT
*
FROM
LAND
WHERE
LT_ID is null;
2.3 Zusammengesetzte Suchbedingungen
Durch die logische Verknüpfung mit AND, OR und NOT können komplexe Suchbedingungen realisiert werden. Dazu je ein Beispiel:
SELECT L_Name, Flaeche, Einwohner, Hauptstadt FROM LAND
WHERE Hauptstadt = 'Wien' OR Hauptstadt = 'Bern';
Liste der Länder mit der Haupstadt Wien oder Bern.
SELECT *
WHERE
FROM LAND
Einwohner > 5000000 AND Einwohner < 25000000;
die Daten der Länder die mehr als 5 Mio. Einwohner und weniger als 25 Mio. haben
Werden mehr als zwei logische Bedingungen miteinander verknüpft, so müssen ev. runde Klammern gesetzt werden, damit die Verknüpfung in der richtigen Reihenfolge ausgeführt wird. Werden
keine Klammern gesetzt, so bindet der NOT-Operator am stärksten, danach AND und als letztes die
Verknüpfung mit OR.
Beispiel: Sie suchen alle Länder die eine grössere Fläche als 100000 haben und deren Name mit
dem Buchstaben 'P' oder 'R' anfängt. Das korrekte SQL-Statement für diese Situation lautet:
SELECT L_Name, Einwohner FROM LAND
WHERE Flaeche > 100000 AND
(L_Name like 'P%' OR L_Name like 'R%');
Frage:Welche Tupel liefert die obige Abfrage, wenn die Klammern weggelassen werden? Begründen Sie!
2.4 Vermeidung von Mehrfachnennungen (distinct)
Das Ergebnis einer Abfrage kann identische Tupel enthalten. Ein Beispiel hierfür liefert die Abfrage
SELECT INSELGRUPPE FROM INSEL;
In der Ergebnistabelle erscheinen die Inselgruppen mehrfach (für jede Insel). Falls Sie keine Mehrfachnennung identischer Tupel möchten, verwenden Sie den Zusatz DISTINCT. Der Befehl
SELECT
DISTINCT INSELGRUPPE FROM INSEL;
SQL-Grundlagen
4
liefert dieselbe Auflistung wie vorhin, aber jede Inselgruppe wird nur einmal genannt.
2.5 Sortieren (order-Klausel)
Mittels SELECT aufgerufene Tupel werden in beliebiger Reihenfolge angezeigt. Nun möchte man
die Tupel aber oftmals in einer bestimmten Reihenfolge angezeigt bekommen. Hier hilft der Zusatz
ORDER BY. Der Befehl
SELECT
*
FROM
INSEL
ORDER BY
Flaeche;
führt dazu, dass die Insel sortiert nach der Fläche ausgegeben werden. Standardmässig wird in aufsteigender Reihenfolge sortiert. Falls in absteigender Reihenfolge sortiert werden soll, wird hinter
das Sortiertattribut der Befehl DESC gestellt. 5)
SELECT
*
FROM
INSEL
ORDER BY
Flaeche DESC;
Ebenfalls möglich ist es, nach mehreren Attributen sortieren zu lassen, z.B. einmal absteigend nach
der Inselgruppe (erster Schlüssel), und bei Insel auf der selben Inselgruppe nach der Fläche (zweiter
Schlüssel). Man schreibt die Sortierschlüssel dann hintereinander:
SELECT
*
FROM INSEL ORDER BY Inselgruppe DESC, Flaeche;
2.6 Verschachtelte Abfragen
Es ist möglich, Abfragebefehle ineinander zu verschachteln. Dies ist häufig sinnvoll bei Abfragen,
bei denen Daten aus mehreren Tabellen benötigt werden. Man arbeitet dabei sinnvollerweise mit
Klammern, um die Auswertungsreihenfolge klarzustellen.
Beispiel:
SELECT L_Name
FROM LAND
WHERE L_ID IN(SELECT L_ID FROM LANDTEIL WHERE Einwohner>10000000);
Hier wird nach den Namen derjenigen Länder gesucht, die Landteile mit mehr als 1 Mio. Einwohner
haben. Klammern werden immer von innen nach aussen abgearbeitet: Zuerst wird nach der L_ID
der Länder mit grossen Landteilen geschaut, und anschliessend wird nach denjenigen Ländern
gesucht, bei denen im Attribut L_ID die ermittelte Nummer vermerkt ist.
2.7 Tabellen multiplizieren (kartesisches Produkt)
Beim Multiplizieren zweier Tabellen wird das kartesische Produkt gebildet, d.h. jedes Tupel der
ersten Relation wird mit jedem Tupel der zweiten Relation kombiniert. Das kartesische Produkt der
Tabellen Land und Kontinent sieht wie folgt aus:
5)
5
DESC: engl. descending
SQL-Grundlagen
Das kartesische Produkt wird immer dann erzeugt, wenn in der FROM-Klausel mehrere Tabellen
angegeben werden. Der SQL-Befehl zum Erzeugen des obigen kartesischen Produktes (LAND ×
KONTINENT) lautet wie folgt:
SELECT
*
FROM
LAND, KONTINENT;
Das kartesische Produkt kann auch mit mehr als zwei Tabellen gebildet werden. Dann wird jedes
Tupel der ersten Relation mit jedem Tupel jeder anderen Relation kombiniert.
Dabei entsteht viel « Datenmüll ». Betrachten Sie z. B. die ersten Tupel. Alle Länder wurden auf
dem Kontinent Afrika gesetzt.
2.8 Verbinden von Relationen (join)
Aus dem kartesischen Produkt kann man nun mit der WHERE-Klausel die sinnvollen Kombinationen heraussuchen.
Betrachten Sie die Tabellen LAND, KONTINENT und UMFASST (die Flächen bei LAND und
KONTINENT haben unterschiedliche Masseinheiten):
SQL-Grundlagen
6
Wie erhält man eine Liste aller Länder, in der auch die Namen der Kontinente erscheinen?
Müsste man eine solche Liste ohne Hilfe des Computers erstellen, würde man bei jedem Land
zunächst nach der ID des Landes schauen (z. B. L_ID = A in der Tabelle Land), und dann in der
Tabelle UMFASST den Name des entsprechenden Kontinentes raussuchen (K_Name = Europa in
der Tabelle UMFASST) und falls man noch mehr Infos zum Kontinenten möchte, diese Informationen in der Tabelle Kontinent suchen. D. h. man kombiniert jedes Tupel aus der Land-Tabelle mit
demjenigen Tupel aus der Kontinent-Tabelle, bei denen eine Kombination in der Tabelle UMFASST
existiert.
Genau dies tut auch der folgende SQL-Befehl:
SELECT L_Name, Flaeche, K_Name
FROM LAND, UMFASST
WHERE LAND.L_ID = UMFASST.L_ID;
Resultat:
Bemerkung:
Beim Abfragen mehrerer Relationen kann der Fall auftreten, dass Attribute aus verschiedenen
Tabellen denselben Namen haben. Im obigen Beispiel- das Attribut L_ID muss durch Angabe des
Tabellennamens klar gemacht werden, somit wird spezifiziert aus welcher Relation das Attribut
geholt werden soll. Der Tabellenname wird dabei jeweils in der Form table_name.column_name
angegeben.
Es können auch mehr als zwei Tabellen miteinander verbunden werden.
7
SQL-Grundlagen
So z.B. möchte man auch die Fläche des jeweilgen Kontinenten kennen, muss auch die Tabelle
KONTINENT in die obere Abfrage einbezogen werden:
SELECT L_Name, LAND.Flaeche, KONTINENT.K_Name, KONTINENT.Flaeche
FROM LAND, UMFASST, KONTINENT
WHERE LAND.L_ID = UMFASST.L_ID
AND UMFASST.K_NAME=KONTINENT.K_NAME;
Beachten Sie, dass der WHERE-Teil eine einzige zusammengesetzte logische Bedingung bildet, die
auf das kartesische Produkt mehrerer Tabellen angewendet wird (vgl. Kap. 2.7).
2.9 Vereinigen von Tabellen (union)
Unter gewissen Voraussetzungen können die Ergebnisse zweier SELECT-Abfragen in einer einzigen Tabelle zusammengefasst werden. Dies geschieht durch den Befehl UNION. Die Grundform
davon sieht wie folgt aus:
select_statement1
UNION
select_statement2
Betrachten wir dazu ein Beispiel (es ist ein fiktives Beispiel):
SELECT
UNION
SELECT
Name, Vorname, Ort
FROM
Tennisclub
Name, Vorname, Ort
FROM
Badmintonclub;
Die resultierende Tabelle enthält sowohl Daten des einen Sportclubs als auch des anderen. Natürlich
können auch komplexere Abfragen als Bausteine verwendet werden. Wichtig ist nur, dass die beiden
SELECT-Befehle vereinigungskonforme Ergebnistabellen liefern, d.h. diese müssen
• gleich viele Attribute haben und
• die Attribute aus beiden Select-Abfragen müssen in der derselben Reihenfolge dieselben Datentypen aufweisen.
• Die Namen der Attribute brauchen jedoch nicht übereinzustimmen.
Bemerkung: Beim Verbinden von Relationen (join) werden die Attribute verschiedener Tabellen zu
einer neuen Tabelle zusammengeführt, beim Vereinigen (union) die Tupel. Joins sind sehr üblich,
unions sehr selten.
2.10 Die Relationen-Algebra mit SQL
Eine Tabelle ist bekanntermassen eine Menge von Datensätzen (Tupeln). Mit Tabellen kann man
deswegen alles machen, was man mit Mengen auch machen kann, nämlich z.B.
SQL-Grundlagen
8
• eine Teilmenge auswählen
• eine Menge auf ein Merkmal (Dimension) projizieren
• Mengen vereinigen
• Mengen schneiden
• das kartesische Produkt von Mengen bilden
Alle diese Operationen lassen sich mit dem SELECT-Befehl realisieren. In diesem Kapitel haben
Sie die meisten dieser Operationen bereits kennengelernt:
• Mithilfe der WHERE-Klausel kann eine Teilmenge von Tupeln ausgewählt werden
• Mit SELECT kann eine Tabelle auf ein oder mehrere Merkmale projiziert werden.
• Mit UNION können zwei (vereinigungskonforme) Tabellen vereinigt werden.
• Der Befehl zum Schneiden von Tabellen lautet INTERSECT. Er wird allerdings von vielen
Datenbank-Programmen nicht unterstützt.
• Das kartesische Produkt wird gebildet, indem in der FROM-Klausel mehrere Tabellen angegeben werden. Es wird auch als Verbund ohne Verbundprädikat bezeichnet.
3 Weitere Abfragemöglichkeiten
3.1 Platzhalter-Suche 6)
Falls in der WHERE-Klausel mit einer Zeichenkette verglichen wird, so kann auch mit den Platzhaltern % und _ gearbeitet werden, wobei
% für beliebig viele (evtl. kein) Zeichen steht und
_
für genau ein Zeichen steht.
Anstelle des Operators « = » muss dann das Schlüsselwort LIKE geschrieben werden. So liefert z.B.
der Befehl
SELECT
*
FROM
INSEL
WHERE
I_Name LIKE 'M%';
die Datensätze der Insel, deren Name mit M beginnt.
Bemerkungen:
1. In einem Suchmuster können mehrere Platzhalter miteinander kombiniert werden: z.B. «_e%»
für alle Zeichenketten, deren zweiter Buchstabe ein e ist.
2. In manchen Datenbank-Programmen (z.B. Access) werden anstelle der Zeichen % und _ die Zeichen * und ? als Platzhalter verwendet.
3.2 Mengen-Abfragen
SQL unterstützt nicht nur den Vergleich mit einzelnen Werten. Häufig möchte man mehrere Werte
für ein Merkmal zulassen. SQL erlaubt es, diese Werte in einer Menge aufzuzählen. Dazu wird das
Schlüsselwort IN verwendet. Der Befehl
SELECT *
WHERE
6)
9
FROM INSEL
Inselgruppe IN
('Madagaskar', 'Komoren', 'Balearen');
Dies wurde bereits in den SQL-Grundlagen in Kapitel 2.2 angetönt.
SQL-Grundlagen
liefert z.B. die Daten der Insel, die zu den Inselgruppen Madagaskar, Komoren oder Balearen gehören, und ist äquivalent zum Befehl
SELECT * FROM INSEL
WHERE Inselgruppe='Madagaskar' OR Inselgruppe='Komoren' OR
Inselgruppe='Balearen';
Durch eine Mengen-Abfrage können also viele OR-Verknüpfungen eingespart werden.
Bemerkung: Eine Aufzählungsmenge kann beliebig viele Werte enthalten.
3.3 Der Exists-Operator
Manchmal interessiert man sich nur dafür, ob gewisse Tupel vorhanden sind, und nicht für den
Inhalt der Tupel selber.
Dies soll anhand des Beispiels aus der Übungsdatenbank veranschaulicht werden. Jedes Tupel in der
Tabelle «UMFASST» steht für die Zugehörigkeit eines Landes zu einem Kontinent. Möchte man
nun wissen, für welche Länder noch keine Zugehörigkeit in der Tabelle UMFASST definiert wurde,
so ist dies mit den bisherigen SQL-Abfragen nicht möglich.
Hier hilft der EXISTS-Operator, welcher zu einer vorgegebenen SQL-Abfrage angibt, ob sie Tupel
zurückliefert oder nicht. Es handelt sich dabei um eine verschachtelte Abfrage-Technik, wie das
Beispiel deutlich macht.
SELECT * FROM LAND
WHERE NOT EXISTS
(SELECT * FROM UMFASST WHERE UMFASST.L_ID=LAND.L_ID);
Es passiert folgendes: für jedes Tupel aus der LAND-Tabelle wird die Landnummer gelesen
(LAND.L_ID), und es wird in der Umfassttabelle nachgeschaut, ob ein oder mehrere Tupel mit dieser Landnummer vorkommen. Falls dies nicht zutrifft, werden die Informationen zu dem entsprechendem Land ausgegeben.
4 Rechnen in Tabellen
Mit SQL kann man in Tabellen rechnen. Man unterscheidet prinzipiell zwei Arten zu rechnen:
1. das Rechnen mit einer oder mehreren Spalten (Grundrechenarten +, *, ... sowie Text-Funktionen)
2. das Rechnen mit Tupeln (Aggregatfunktionen).
4.1 Das Rechnen mit Spalten
In SQL kann man Spalten addieren, multiplizieren usw. Dafür muss man nur den zu berechnenden
Ausdruck in die SELECT-Klausel schreiben.
Betrachten Sie die Tabelle Zahlen
SQL-Grundlagen
10
Der SQL-Befehl, um die beiden Spalten zu addieren, lautet:
SELECT
a, b, a+b
FROM
Zahlen;
Die Datenbank vergibt selbständig einen Namen für die Spalte mit dem Ergebnis. Man kann auch
einen aussagekräftigen Namen für die Spalte mit dem Ergebnis angeben. Dazu benötigt man das
Schlüsselwort AS:
SELECT
a, b, a+b
AS
Summe
FROM
Zahlen;
Man kann auch mit einer einzigen Spalte rechnen (z.B. a+1 oder ähnliches). Wichtig ist, dass man
auch mit Spalten vom Typ «Datum» rechnen kann. Dies geschieht tageweise. Angenommen man hat
eine Tabelle Kurs mit den Spalten KursNr, Bezeichnung, Preis, Datum und will man z.B. in der Kurstabelle vom Datum aller Kurse eine Woche abziehen (Anmeldeschluss), so benützt man den Befehl
SELECT KursNr, Bezeichnung, Datum-7
FROM Kurs;
AS
Anmeldeschluss
Man kann aber auch mit Text-Spalten «rechnen»; z.B. kann man
1. Zeichenketten hintereinanderhängen
Dazu benötigt man in den meisten Datenbank-Programmen das Pluszeichen +
2. Umwandlung in Gross- oder Kleinschreibung:
Dazu dienen die Funktionen UPPER/LOWER resp. UCASE/LCASE (Access)
Beispiele: gültige Ausdrücke sind
• Vorname + Name
• Vorname + ' ' + Name
(Vorname und Nachname durch Leerzeichen getrennt)
• UCASE(Name)
4.2 Rechnen mit Zeilen
Zum Rechnen mit Tupeln stehen in SQL die sogenannten Aggregatfunktionen zur Verfügung. Mit
diesen kann man:
• das Maximum/Minimum innerhalb einer Spalte bestimmen,
• Durchschnitte berechnen,
• alle Werte innerhalb einer Spalte aufsummieren,
• Tupel zählen (genauer: diejenigen Tupel zählen, für die ein bestimmtes Feld nicht leer ist).
Dazu je ein Beispiel (es handelt sich um fiktive Beispiele):
SELECT
Min(Preis)
FROM Buch;
der Preis des billigsten Buches
SELECT
Avg(Preis)
FROM Buch;
der durchschnittliche Preis der Bücher
SELECT
Sum(Preis)
FROM
Verkäufe;
die gesamten Einnahmen aus den Verkäufe
SELECT
Count(VerkaufNr)
FROM Verkäufe;
Anzahl Verkäufe
Das Ergebnis wird in Form einer einzelligen Mini-Tabelle angezeigt.
11
SQL-Grundlagen
Es besteht die Möglichkeit, diese Funktionen zu «verfeinern», d.h. man kann Gruppen von Datensätzen bilden, für welche die Ergebnisse separat ausgewiesen werden. Dies geschieht mit Hilfe des
Zusatzes GROUP BY.
Z.B. können die Anzahl Länder je Kontinent gezählt werden durch den Befehl
SELECT K_Name, Count(L_Id)
FROM UMFASST
GROUP BY K_Name;
Sinnvollerweise lässt man nicht nur die Ergebnisse anzeigen, sondern auch das Attribut, über dessen
Wert die Gruppierung vorgenommen wurde, um zu wissen, welchen Datensätzen welche Ergebnisse
zuzuordnen sind.
Möchte man auch andere Attribute angezeigt bekommen, so muss man diese in die GROUP BYKlausel aufnehmen:
SELECT KONTINENT.K_Name,Flaeche, Count(L_Id)
FROM UMFASST, KONTINENT
WHERE UMFASST.K_Name=KONTINENT.K_NAME
GROUP BY KONTINENT.K_Name,Flaeche;
AS Anzahl_Länder
Bemerkung: Auch die Ergebnisse der anderen Aggregat-Funktionen lassen sich mithilfe der
GROUP BY-Klausel gruppieren.
5 Datenmanipulation und -definition mit SQL
Neben den vorgestellten SQL-Befehlen zum Abfragen und Auswerten von Daten umfasst SQL eine
Reihe von Befehlen zum Erstellen, zum Ändern und zum Löschen von Datenbankobjekten- Datenbanken, Tabellen, Views. Die Beispiele in diesem Kapitel sind fiktive Beispiele, ihr könnt sie mit
der Übungsumgebung nicht durchführen.
5.1 INSERT
Mit der INSERT-Anweisung können Tupel (Zeilen) in einer bestehenden Tabelle eingefügt werden.
INSERT INTO tab_name [(spalte_1, ...)] VALUES ( ausdruck_1, ...)
Mit dieser Anweisung wird ein Tupel in der Tabelle tab_name eingefügt. spalte_1, spalte_2,... sind
die Namen der Spalten (Attribute) der Tabelle tab_name und ausdruck_1, ausdruck_2,... sind die
Werte, die in diesen Spalten eingefügt werden sollen. Jeder eingefügte Datenwert muss denselben
Datentyp haben, wie die Spalte, in der er eingefügt wird. Dabei sollen die alphanumerischen Werte
und die Datums- und Zeitangaben immer in Apostrophen eingeschlossen werden, während man
numerische Werte ohne Apostrophe schreiben kann.
Die Angabe der Spaltenliste ist optional. Falls alle Spalten einer Tabelle eingefügt werden sollen,
kann auf die Angabe der Liste verzichtet werden. (aber die Reihenfolge muss eingehalten werden)
insert into mitarbeiter values(25348,'Keller','Hans')
oder
insert into mitarbeiter(m_nr,m_name,m_vorname) values
(8413‚'Lotter','Wolfgang')
ein Datensatz wird in der Tabelle mitarbeiter eingefügt
Es besteht noch eine zweite Variante der INSERT-Klausel, die es erlaubt, mehrere Datensätze
gleichzeitig einzufügen. Die Syntax lautet:
SQL-Grundlagen
12
INSERT INTO tab_name [(spalte_1, ...)] select_anweisung
Hierbei werden die Reihen einer existierenden Tabelle ausgewählt und in einer anderen Tabelle
(oder derselben) Tabelle eingefügt.
INSERT INTO muench_abt (abt_nr, abt_name) SELECT abt_nr, abt_name FROM
abteilung WHERE stadt='München'
5.2 UPDATE
Die UPDATE-Anweisung ändert die Datenwerte der Tupel einer Tabelle. Diese Anweisung hat folgende Form:
UPDATE tab_name SET spalte_1=ausdr_1 [{,spalte_2=ausdr_2}...] [WHERE bedingung]
UPDATE arbeiten SET aufgabe='Gruppenleiter' WHERE m_nr=18316 AND
pr_nr='p2'
Die Aufgabe des Mitarbeiters mit der Personalnummer 18316 im Projekt p2 ist neu Gruppenleiter
5.3 DELETE
Mit der DELETE-Anweisung werden Tupel aus einer Tabelle gelöscht.
DELETE [FROM] tab_name [WHERE bedingung]
Delete from arbeiten where aufgabe ='Gruppenleiter'
alle Einträge aus der Tabelle arbeiten die den Wert 'Gruppenleiter' haben werden gelöscht
Delete from arbeiten
alle Einträge der Tabelle arbeiten werden gelöscht, Struktur der Tabelle (mit Name, Spaltennamen, etc.) bleibt erhalten
5.4 Views
Häufig benötigte SQL-Abfragen kann man in der Datenbank abspeichern und anschliessend wie
eine Tabelle abrufen. Man spricht dabei von Benutzersichten (engl. view). Man benützt dafür den
Befehl CREATE VIEW. Die Syntax lautet:
CREATE VIEW view_name AS select-statement
wobei view_name für den Namen der Benutzersicht steht, unter dem die Abfrage später wiederabgerufen werden soll, und select-statement für die abzuspeichernde SQL-Abfrage.
Bemerkung: In Access heissen Views Queries und werden in der Karteikarte "Queries" verwaltet
(und nicht mit dem CREATE-View-Befehl erzeugt)
CREATE VIEW Gruppenleiter AS
SELECT mitarbeiter.m_nr,m_name,m_vorname, pr_nr
FROM mitarbeiter,arbeiten
WHERE mitarbeiter.m_nr=arbeiten.m_nr and
aufgabe ='Gruppenleiter'
Es wird eine view der Gruppenleiter, mit den Informationen-m_nr, m_name, m_vorname, pr_nrerstellt, wobei die Tabellen mitarbeiter und arbeiten über die m_nr verbunden werden.
Um diese Liste abzurufen, gibt man dann ein:
SELECT * FROM Gruppenleiter
13
SQL-Grundlagen
Bemerkung: Benutzersichten lassen sich genau gleich wie Tabellen einsetzen! Deswegen
bezeichnet man Views auch als virtuelle Tabellen.
Zum Löschen einer view dient folgender Befehl:
DROP VIEW view_name
drop view Gruppenleiter
Die view Gruppenleiter wird gelöscht.
Bemerkung:
DELETE löscht einen oder mehrere Einträge in einer Tabelle oder einer view, die Tabelle
bleibt aber erhalten (eventuell ohne Einträge);
DROP löscht die Tabelle als Objekt.
Es ist wichtig zu beachten, dass Views bei jedem Aufruf neu ausgewertet werden (durch Ausführen
des entsprechenden SQL-Befehls). Somit erhält man durch das Abfragen einer View immer die zum
jeweiligen Zeitpunkt aktuellen Daten, auch wenn die Informationen in der zugrundeliegenden
Tabelle sich zwischenzeitlich geändert haben.
6 Beispieldatenbank Terra
Zur Unterstützung der SQL-Übungen für die Einführung in die Wirtschaftsinformatik wird die Terra
Datenbank benutzt. Der Zugang zur Datenbank geschieht über die URL http://marvin.sn.schule.de/terra.
Bei (1) kann man seine Abfrage eingeben, und mit dem Knopf Anfrage diese ausführen.
SQL-Grundlagen
14
Klickt man auf Interface bekommt man die untenstehende Struktur, man kann verschiedene Optionen auswählen, z.B. Struktur oder Inhalt der Tabellen einsehen.
Die Terra Datenbank enthält folgende Tabellen:
Es werden hier nicht alle Tabellen verwendet, ihr könnt selber damit experimentieren. In diesen
Unterlagen und Übungsserie werden dieTabellen LAND, UMFASST KONTINENT, LANDTEIL
und INSEL verwendet. Die Abbildung oberhalb zeigt die Primärschlüssel der Tabellen und die
Beziehungen zwischen ihnen.
Im Weiteren sind ein paar Datensätze der Tabellen LAND, UMFASST, KONTINENT, LANDTEIL
und INSEL aufgeführt.
15
SQL-Grundlagen
LAND
KONTINENT
UMFASST
LANDTEIL
INSEL
SQL-Grundlagen
16
Herunterladen