Folien (SQL) - sven.köppel.org

Werbung
SQL
Structured Query Language
1
Grundlagen der Programmierung II
DBIS - SS2009
DBS – Sprachen
Das DBS stellt als Schnittstelle eine
Datenbanksprache(n) für die folgenden Zwecke
zur Verfügung:
– Datenabfrage und -manipulation – Data
Manipulation Language (DML)
– Verwaltung der Datenbank – Data Definition
Language (DDL)
– Berechtigungssteuerung – Data Control Language
(DCL)
z.B. SQL
2
Grundlagen der Programmierung II
DBIS - SS2009
Structured Query Language
• SQL ist für Relationale Datenbanksysteme!
Standards:
• SQL-1 von 1986 bzw. 1989 (ca. 120 Seiten)
• SQL-2 (SQL92) von 1992 (ca. 580 Seiten)
http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt
• SQL-3 (SQL99) von 2000 (ca. 1200 Seiten)
http://www.cse.iitb.ac.in/dbms/Data/Papers-Other/SQL1999/ansi-iso-9075-2-1999.pdf
• SQL 2003 - ISO/IEC 9075:2003
• SQL:2006 - ISO/IEC 9075-14:2006 (SQL/XML)
3
Grundlagen der Programmierung II
DBIS - SS2009
Syntaktische Grundform der SQLAnfrage
select
from
where
4
A1,A2, ... ,An
R1, R2, ... ,Rm
Bedingung;
Grundlagen der Programmierung II
DBIS - SS2009
Anfragen ohne Bedingungen
Filiale ( Name Leiter Stadt Einlagen )
select Name, Leiter from Filiale;
select Leiter, Name from Filiale;
select Stadt from Filiale;
select * from Filiale;
5
Grundlagen der Programmierung II
DBIS - SS2009
SQL verwirklicht das Prinzip der
„Vielfachmenge“ (engl. multiset). In den
Ergebnismengen können demnach Duplikate
auftreten.
Sind keine Duplikate erwünscht, müssen sie
explizit durch den Zusatz distinct entfernt
werden.
select distinct Stadt from Filiale;
6
Grundlagen der Programmierung II
DBIS - SS2009
Aggregatfunktionen
Die sog. Aggregatfunktionen können in der
select-Klausel anstelle von einzelnen
Attributen angegeben werden.
Ergebnis einer Aggregatfunktion ist ein Wert,
kein Tupel.
select count(∗) as AnzahlKonten
from Konto;
7
Grundlagen der Programmierung II
DBIS - SS2009
Aggregatfunktionen
• min( A ) zur Berechnung des Minimalwerts aller Tupel unter dem
Attribut A.
• max( A ) zur Berechnung des Maximalwerts aller Tupel unter dem
Attribut A.
• avg( [ distinct ] A ) zur Berechnung des Durchschnittswerts aller
Tupel unter dem Attribut A, wobei unter Angabe von distinct
mehrfach gleiche Werte nur einmal in die Berechnung eingehen.
• sum( [ distinct ] A ) zur Berechnung der Summe aller Tupel unter
dem Attribut A, wobei unter Angabe von distinct mehrfach gleiche
Werte nur einmal in die Berechnung eingehen.
• count( ∗ ) zum Zählen der Tupel der betrachteten Relation.
• count( [ distinct ] A) zum Zählen der Tupel der betrachteten
Relation, wobei zunächst eine Duplikateneliminierung bezogen auf
Werte unter dem Attribut A stattfindet.
8
Grundlagen der Programmierung II
DBIS - SS2009
where-Klausel
Bezüglich der Bedingung sind Vergleiche mit den
üblichen Operatoren, den logischen
Verknüpfungen and und or sowie beliebige
Klammerungen gestattet.
Konto ( KontoNr KundenNr FilialName Saldo )
select * from Konto
where Saldo > 5000 or KundenNr <= 100;
9
Grundlagen der Programmierung II
DBIS - SS2009
Range query
Als Vereinfachung für bestimmte Arten von
Abfragen zwischen zwei Grenzwerten steht
unter SQL der between Operator zur
Verfügung.
Achtung: 2. Wert sollte größer sein,
sonst gibt es kein Ergebnis!
select KontoNr
from Konto
where Saldo between 5000 and 30000;
10
Grundlagen der Programmierung II
DBIS - SS2009
Textvergleiche - LIKE
Kunde ( KundenNr Name Vorname Straße Stadt )
select KundenNr
from Kunde
where Name like 'To%' and
Vorname not like '_arste%';
Bem.:
% für beliebige Zeichenfolgen
_ für genau ein Zeichen
11
Grundlagen der Programmierung II
DBIS - SS2009
Null-Werte
select * from Konto where Name=NULL;
… würde nicht funktionieren  immer falsch!
… is [not] null …
select * from Konto where Name IS [NOT] NULL;
12
Grundlagen der Programmierung II
DBIS - SS2009
Anfrage über mehrere Relationen
Werden in der from-Klausel mehrere Relationen
spezifiziert, so erfolgt die Berechnung des
kartesischen Produktes.
Konto ( KontoNr KundenNr FilialName Saldo )
Filiale ( Name Leiter Stadt Einlagen )
select * from Filiale, Konto;
13
Grundlagen der Programmierung II
DBIS - SS2009
Join
Konto ( KontoNr KundenNr FilialName Saldo )
Filiale ( Name Leiter Stadt Einlagen )
select * from Filiale, Konto
where Filiale.Name = Konto.FilialName;
alternativ mit Alias
select * from Filiale F, Konto K
where F.Name = K.FilialName;
14
Grundlagen der Programmierung II
DBIS - SS2009
Mengenoperationen
Verknüpfung von Anfragen mittels:
– UNION [ALL] - Vereinigung
– INTERSECT - Durchschnitt
– MINUS
- Differenz
Durch diese Operatoren können einzelne selectAnfragen mit attributgleichen und
typkompatiblen Ergebnissen miteinander
verbunden werden.
15
Grundlagen der Programmierung II
DBIS - SS2009
select KundenNr, FilialName from Konto
union
select KundenNr, FilialName from Kredit;
Der union-Operator folgt, im Gegensatz zu
den meisten anderen SQL-Konstrukten, nicht
dem Ansatz der Vielfachmenge!
Will man eventuelle Duplikate nicht
beseitigen, so ist union all zu verwenden.
16
Grundlagen der Programmierung II
DBIS - SS2009
Unterabfragen
Es können auch Unteranfragen genutzt werden:
select Name from Kunde
where
KundenNr = max(select KundenNr from
Konto);
17
Grundlagen der Programmierung II
DBIS - SS2009
Schachtelung von Abfragen
•
•
•
•
[NOT] EXISTS
[NOT] IN
ANY
ALL
18
Grundlagen der Programmierung II
DBIS - SS2009
select Name, Vorname, Straße, Stadt
from Kunde KU
where not exists (
select *
from Kredit KR
where KU.KundenNr = KR.KundenNr);
Ergebnis: Alle Kunden, die (noch) keinen Kredit
haben.
19
Grundlagen der Programmierung II
DBIS - SS2009
Suche alle Kunden, die sowohl ein Konto als auch
ein Sparbuch haben.
select Name, Vorname from Kunde KU
where exists (
select * from Konto KO
where KU.KundenNr = KO.KundenNr
and exists (
select * from Sparbuch SP
where SP.KundenNr = KO.KundenNr
)
);
20
Grundlagen der Programmierung II
DBIS - SS2009
Alle Filialen, bei denen mindestens ein Kunde
ein Konto hat.
select * from Filiale
where Name in (
select distinct FilialName from Konto
);
21
Grundlagen der Programmierung II
DBIS - SS2009
Alle Kunden, die in der „Zeil“-Filiale ein Konto
und einen Kredit haben.
select distinct KundenNr from Konto
where FilialName = 'Zeil'
and KundenNr in (
select distinct KundenNr from Kredit
where FilialName = 'Zeil'
);
22
Grundlagen der Programmierung II
DBIS - SS2009
Alle Konten außer das, mit dem größten Saldo.
select * from Konto
where Saldo < any ( /* kleiner als irgendeines */
select Saldo from Konto
);
23
Grundlagen der Programmierung II
DBIS - SS2009
Das Konto mit dem kleinsten Saldo.
select * from Konto
where Saldo <= all ( /* kleiner gleich jedem */
select Saldo from Konto
);
Der Vergleich = any entspricht dabei dem inOperator und der Vergleich <> all entspricht not in.
24
Grundlagen der Programmierung II
DBIS - SS2009
Sortierung
select
A1,A2, ... ,An
from
R1, R2, ... ,Rm
[where
Bedingung]
[order by (Ai [asc|desc])+];
select * from Kredit
order by FilialName, KreditNr;
25
Grundlagen der Programmierung II
DBIS - SS2009
Tabellen erstellen
Eine Tabelle wird im Minimalfall mit ihrem
eindeutigen Namen sowie der Liste der
zugehörigen Attribute samt Domänen nach
folgendem Schema definiert:
create table Relations-Name (
Attribut-Name Domäne { , Attribut-Name
Domäne}∗
);
26
Grundlagen der Programmierung II
DBIS - SS2009
create table Konto (
KtoNr integer,
KundenName char(25),
FilialName char(25),
Saldo real
);
create table Kunde (
Name char(25),
Vorname char(25),
Straße char(25),
Stadt char(25),
GebDatum date
);
27
Grundlagen der Programmierung II
DBIS - SS2009
SQL-2 Datentypen
28
Grundlagen der Programmierung II
DBIS - SS2009
Primärschlüssel
Mittels der Klausel primary key kann eine unter
den Attributfolgen einer Relation – bei der
Definition der Tabelle – als Primärschlüssel
ausgezeichnet werden. Die Benutzung dieser
Klausel ist nur einmal pro Relation gestattet.
create table Konto (
KtoNr integer primary key not null,
KundenName char(25),
FilialName char(25),
Saldo real ) ;
29
Grundlagen der Programmierung II
DBIS - SS2009
Primärschlüssel
Wenn mehr als ein Attribut als Primärschlüssel
definiert werden sollen, wird die Klausel in der
Form primary key (Attributnamen-Liste)
verwendet.
create table Transaktion (
vonKtoNr integer not null,
anKtoNr integer not null,
Datum date not null,
Betrag real,
primary key (vonKtoNr, anKtoNr, Datum) ) ;
30
Grundlagen der Programmierung II
DBIS - SS2009
Einfügen von Tupeln
Um Daten einzufügen, spezifiziert man entweder
das Tupel, das eingefügt werden soll …
Die Werte für die Attribute der Tupel müssen aus
der Domäne der Attribute sein.
insert into Kunde
values ( 'Otto', 'Hans', 'Bäckerweg 12', 'Frankfurt',
'1970-12-01' ) ;
 Der Kunde "Hans Otto" wird eingefügt.
31
Grundlagen der Programmierung II
DBIS - SS2009
… oder schreibt eine Anfrage, die eine Menge von Tupeln als
Ergebnis hat, die eingefügt werden soll.
insert into Sparbuch
select KreditNr, 50.00, KundenName, FilialName from Kredit
where FilialName in (
select FilialName from Filiale where Stadt = 'Frankfurt'
);
Alle Kunden, die bei Filialen in Frankfurt einen Kredit
haben, bekommen ein Sparbuch mit einem Startkapital
von 50,- €.
32
Grundlagen der Programmierung II
DBIS - SS2009
Sichten (views)
Eine View ist eine Relation, die nicht Teil des
konzeptuellen Schemas der Datenbank ist, sondern
dem Benutzer als virtuelle Relation zur Verfügung
gestellt wird. Views können nicht gespeichert
werden sondern müssen für jede Anfrage, die sie
referenziert neu berechnet werden.
In SQL wird eine View folgendermaßen definiert:
create view View-Name as
<Anfrage-Ausdruck>
33
Grundlagen der Programmierung II
DBIS - SS2009
create view alleKunden as
( select KundenName, FilialName from Konto )
union
( select KundenName, FilialName from Kredit ) ;
Ab jetzt kann die View in Anfragen benutzt werden:
select KundenName from alleKunden
where FilialName = 'Westend';
34
Grundlagen der Programmierung II
DBIS - SS2009
Probleme mit Views
Obwohl Views sehr nützlich sein können,
bringen sie Probleme mit, wenn sie in update,
insert oder delete-Anfragen verwendet
werden.
Das Problem ist, die Veränderungen in den
virtuellen Relationen auf die wirklichen
Relationen, die im konzeptuellen Schema
vorhanden sind, zu übertragen.
35
Grundlagen der Programmierung II
DBIS - SS2009
create view Kredit_Info as
select FilialName, KreditNr, KundenName
from Kredit ;
Da SQL es erlaubt, eine View in jedem Ausdruck zu
verwenden, könnte man versucht sein, etwa Folgendes
auszuführen:
insert into Kredit_Info
values ('Westend', 143, 'Meiser');
Diese Einfüge-Operation muss zu einem insert in der
Relation Kredit führen, dafür fehlt allerdings der Wert
für das Attribut Betrag.
36
Grundlagen der Programmierung II
DBIS - SS2009
Es gibt zwei unterschiedliche Ansätze, um mit
diesem Problem umzugehen:
1.Zurückweisen der Operation, und eine
Fehlermeldung an den Benutzer.
2.Einfügen des Tupels (143, null, 'Meiser',
'Westend') in die Relation Kredit.
Der null-Wert repräsentiert hierbei einen nicht
existierenden Wert.
37
Grundlagen der Programmierung II
DBIS - SS2009
Nicht in diesen Folien
(aber in den anderen!)
• Die Operationen delete und update und
mögliche Anomalien dabei.
• Null-Werte
• Zwischenergebnisse
• …
38
Grundlagen der Programmierung II
DBIS - SS2009
Weitere Dinge …
•
•
•
•
•
•
•
GROUP BY
HAVING
Inner und Outer Join
Alter und Drop Table
Index
Foreign Key
… und vieles vieles mehr!!!!
– … auch abhängig vom DBMS und der SQL-Version
39
Grundlagen der Programmierung II
DBIS - SS2009
Herunterladen