structured query language - benutzer-homepagesprg2/ss2009/folien/zicari/... · 3 grundlagen der...
TRANSCRIPT
Grundlagen der Programmierung II DBIS - SS20091
SQL
Structured Query Language
Grundlagen der Programmierung II DBIS - SS20092
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
Grundlagen der Programmierung II DBIS - SS20093
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)
Grundlagen der Programmierung II DBIS - SS20094
Syntaktische Grundform der SQL-Anfrage
select A1,A2, ... ,An
from R1, R2, ... ,Rm
where Bedingung;
Grundlagen der Programmierung II DBIS - SS20095
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;
Grundlagen der Programmierung II DBIS - SS20096
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;
Grundlagen der Programmierung II DBIS - SS20097
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 AnzahlKontenfrom Konto;
Grundlagen der Programmierung II DBIS - SS20098
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.
Grundlagen der Programmierung II DBIS - SS20099
where-KlauselBezü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 Kontowhere Saldo > 5000 or KundenNr <= 100;
Grundlagen der Programmierung II DBIS - SS200910
Range query
Als Vereinfachung für bestimmte Arten von Abfragen zwischen zwei Grenzwerten steht unter SQL der between Operator zur Verfügung.
select KontoNrfrom Kontowhere Saldo between 5000 and 30000;
Achtung: 2. Wert sollte größer sein,sonst gibt es kein Ergebnis!
Grundlagen der Programmierung II DBIS - SS200911
Textvergleiche - LIKE
Kunde ( KundenNr Name Vorname Straße Stadt )
select KundenNrfrom Kundewhere Name like 'To%' and
Vorname not like '_arste%';
Bem.: % für beliebige Zeichenfolgen_ für genau ein Zeichen
Grundlagen der Programmierung II DBIS - SS200912
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;
Grundlagen der Programmierung II DBIS - SS200913
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;
Grundlagen der Programmierung II DBIS - SS200914
Join
Konto ( KontoNr KundenNr FilialName Saldo )Filiale ( Name Leiter Stadt Einlagen )
select * from Filiale, Kontowhere Filiale.Name = Konto.FilialName;
alternativ mit Alias
select * from Filiale F, Konto Kwhere F.Name = K.FilialName;
Grundlagen der Programmierung II DBIS - SS200915
Mengenoperationen
Verknüpfung von Anfragen mittels:– UNION [ALL] - Vereinigung– INTERSECT - Durchschnitt– MINUS - Differenz
Durch diese Operatoren können einzelne select-Anfragen mit attributgleichen und typkompatiblen Ergebnissen miteinander verbunden werden.
Grundlagen der Programmierung II DBIS - SS200916
select KundenNr, FilialName from Kontounion
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.
Grundlagen der Programmierung II DBIS - SS200917
Unterabfragen
Es können auch Unteranfragen genutzt werden:
select Name from Kundewhere
KundenNr = max(select KundenNr from Konto);
Grundlagen der Programmierung II DBIS - SS200918
Schachtelung von Abfragen
• [NOT] EXISTS• [NOT] IN• ANY• ALL
Grundlagen der Programmierung II DBIS - SS200919
select Name, Vorname, Straße, Stadtfrom Kunde KUwhere not exists (
select * from Kredit KRwhere KU.KundenNr = KR.KundenNr);
Ergebnis: Alle Kunden, die (noch) keinen Kredit
haben.
Grundlagen der Programmierung II DBIS - SS200920
Suche alle Kunden, die sowohl ein Konto als auch ein Sparbuch haben.
select Name, Vorname from Kunde KUwhere exists (
select * from Konto KOwhere KU.KundenNr = KO.KundenNrand exists (
select * from Sparbuch SPwhere SP.KundenNr = KO.KundenNr
) ) ;
Grundlagen der Programmierung II DBIS - SS200921
Alle Filialen, bei denen mindestens ein Kunde ein Konto hat.
select * from Filiale
where Name in (
select distinct FilialName from Konto
);
Grundlagen der Programmierung II DBIS - SS200922
Alle Kunden, die in der „Zeil“-Filiale ein Konto und einen Kredit haben.
select distinct KundenNr from Kontowhere FilialName = 'Zeil'
and KundenNr in (select distinct KundenNr from Kredit
where FilialName = 'Zeil');
Grundlagen der Programmierung II DBIS - SS200923
Alle Konten außer das, mit dem größten Saldo.
select * from Konto
where Saldo < any ( /* kleiner als irgendeines */
select Saldo from Konto
);
Grundlagen der Programmierung II DBIS - SS200924
Das Konto mit dem kleinsten Saldo.
select * from Kontowhere Saldo <= all ( /* kleiner gleich jedem */
select Saldo from Konto); Der Vergleich = any entspricht dabei dem in-Operator und der Vergleich <> all entspricht not in.
Grundlagen der Programmierung II DBIS - SS200925
Sortierung
select A1,A2, ... ,An
from R1, R2, ... ,Rm
[where Bedingung]
[order by (Ai [asc|desc])+];
select * from Kreditorder by FilialName, KreditNr;
Grundlagen der Programmierung II DBIS - SS200926
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}∗) ;
Grundlagen der Programmierung II DBIS - SS200927
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
) ;
Grundlagen der Programmierung II DBIS - SS200928
SQL-2 Datentypen
Grundlagen der Programmierung II DBIS - SS200929
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 ) ;
Grundlagen der Programmierung II DBIS - SS200930
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) ) ;
Grundlagen der Programmierung II DBIS - SS200931
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.
Grundlagen der Programmierung II DBIS - SS200932
… oder schreibt eine Anfrage, die eine Menge von Tupeln als Ergebnis hat, die eingefügt werden soll.
insert into Sparbuchselect 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,- €.
Grundlagen der Programmierung II DBIS - SS200933
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>
Grundlagen der Programmierung II DBIS - SS200934
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';
Grundlagen der Programmierung II DBIS - SS200935
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.
Grundlagen der Programmierung II DBIS - SS200936
create view Kredit_Info asselect FilialName, KreditNr, KundenNamefrom Kredit ;
Da SQL es erlaubt, eine View in jedem Ausdruck zu
verwenden, könnte man versucht sein, etwa Folgendes auszuführen:
insert into Kredit_Infovalues ('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.
Grundlagen der Programmierung II DBIS - SS200937
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.
Grundlagen der Programmierung II DBIS - SS200938
Nicht in diesen Folien(aber in den anderen!)
• Die Operationen delete und update und mögliche Anomalien dabei.
• Null-Werte • Zwischenergebnisse• …
Grundlagen der Programmierung II DBIS - SS200939
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