39
Grundlagen der Programmierung II DBIS - SS2009 1 SQL Structured Query Language

Structured Query Language - Benutzer-Homepagesprg2/SS2009/folien/zicari/... · 3 Grundlagen der Programmierung II DBIS - SS2009 Structured Query Language • SQL ist für Relationale

  • Upload
    others

  • View
    2

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Structured Query Language - Benutzer-Homepagesprg2/SS2009/folien/zicari/... · 3 Grundlagen der Programmierung II DBIS - SS2009 Structured Query Language • SQL ist für Relationale

Grundlagen der Programmierung II DBIS - SS20091

SQL

Structured Query Language

Page 2: Structured Query Language - Benutzer-Homepagesprg2/SS2009/folien/zicari/... · 3 Grundlagen der Programmierung II DBIS - SS2009 Structured Query Language • SQL ist für Relationale

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

Page 3: Structured Query Language - Benutzer-Homepagesprg2/SS2009/folien/zicari/... · 3 Grundlagen der Programmierung II DBIS - SS2009 Structured Query Language • SQL ist für Relationale

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)

Page 4: Structured Query Language - Benutzer-Homepagesprg2/SS2009/folien/zicari/... · 3 Grundlagen der Programmierung II DBIS - SS2009 Structured Query Language • SQL ist für Relationale

Grundlagen der Programmierung II DBIS - SS20094

Syntaktische Grundform der SQL-Anfrage

select A1,A2, ... ,An

from R1, R2, ... ,Rm

where Bedingung;

Page 5: Structured Query Language - Benutzer-Homepagesprg2/SS2009/folien/zicari/... · 3 Grundlagen der Programmierung II DBIS - SS2009 Structured Query Language • SQL ist für Relationale

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;

Page 6: Structured Query Language - Benutzer-Homepagesprg2/SS2009/folien/zicari/... · 3 Grundlagen der Programmierung II DBIS - SS2009 Structured Query Language • SQL ist für Relationale

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;

Page 7: Structured Query Language - Benutzer-Homepagesprg2/SS2009/folien/zicari/... · 3 Grundlagen der Programmierung II DBIS - SS2009 Structured Query Language • SQL ist für Relationale

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;

Page 8: Structured Query Language - Benutzer-Homepagesprg2/SS2009/folien/zicari/... · 3 Grundlagen der Programmierung II DBIS - SS2009 Structured Query Language • SQL ist für Relationale

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.

Page 9: Structured Query Language - Benutzer-Homepagesprg2/SS2009/folien/zicari/... · 3 Grundlagen der Programmierung II DBIS - SS2009 Structured Query Language • SQL ist für Relationale

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;

Page 10: Structured Query Language - Benutzer-Homepagesprg2/SS2009/folien/zicari/... · 3 Grundlagen der Programmierung II DBIS - SS2009 Structured Query Language • SQL ist für Relationale

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!

Page 11: Structured Query Language - Benutzer-Homepagesprg2/SS2009/folien/zicari/... · 3 Grundlagen der Programmierung II DBIS - SS2009 Structured Query Language • SQL ist für Relationale

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

Page 12: Structured Query Language - Benutzer-Homepagesprg2/SS2009/folien/zicari/... · 3 Grundlagen der Programmierung II DBIS - SS2009 Structured Query Language • SQL ist für Relationale

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;

Page 13: Structured Query Language - Benutzer-Homepagesprg2/SS2009/folien/zicari/... · 3 Grundlagen der Programmierung II DBIS - SS2009 Structured Query Language • SQL ist für Relationale

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;

Page 14: Structured Query Language - Benutzer-Homepagesprg2/SS2009/folien/zicari/... · 3 Grundlagen der Programmierung II DBIS - SS2009 Structured Query Language • SQL ist für Relationale

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;

Page 15: Structured Query Language - Benutzer-Homepagesprg2/SS2009/folien/zicari/... · 3 Grundlagen der Programmierung II DBIS - SS2009 Structured Query Language • SQL ist für Relationale

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.

Page 16: Structured Query Language - Benutzer-Homepagesprg2/SS2009/folien/zicari/... · 3 Grundlagen der Programmierung II DBIS - SS2009 Structured Query Language • SQL ist für Relationale

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.

Page 17: Structured Query Language - Benutzer-Homepagesprg2/SS2009/folien/zicari/... · 3 Grundlagen der Programmierung II DBIS - SS2009 Structured Query Language • SQL ist für Relationale

Grundlagen der Programmierung II DBIS - SS200917

Unterabfragen

Es können auch Unteranfragen genutzt werden:

select Name from Kundewhere

KundenNr = max(select KundenNr from Konto);

Page 18: Structured Query Language - Benutzer-Homepagesprg2/SS2009/folien/zicari/... · 3 Grundlagen der Programmierung II DBIS - SS2009 Structured Query Language • SQL ist für Relationale

Grundlagen der Programmierung II DBIS - SS200918

Schachtelung von Abfragen

• [NOT] EXISTS• [NOT] IN• ANY• ALL

Page 19: Structured Query Language - Benutzer-Homepagesprg2/SS2009/folien/zicari/... · 3 Grundlagen der Programmierung II DBIS - SS2009 Structured Query Language • SQL ist für Relationale

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.

Page 20: Structured Query Language - Benutzer-Homepagesprg2/SS2009/folien/zicari/... · 3 Grundlagen der Programmierung II DBIS - SS2009 Structured Query Language • SQL ist für Relationale

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

) ) ;

Page 21: Structured Query Language - Benutzer-Homepagesprg2/SS2009/folien/zicari/... · 3 Grundlagen der Programmierung II DBIS - SS2009 Structured Query Language • SQL ist für Relationale

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

);

Page 22: Structured Query Language - Benutzer-Homepagesprg2/SS2009/folien/zicari/... · 3 Grundlagen der Programmierung II DBIS - SS2009 Structured Query Language • SQL ist für Relationale

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');

Page 23: Structured Query Language - Benutzer-Homepagesprg2/SS2009/folien/zicari/... · 3 Grundlagen der Programmierung II DBIS - SS2009 Structured Query Language • SQL ist für Relationale

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

);

Page 24: Structured Query Language - Benutzer-Homepagesprg2/SS2009/folien/zicari/... · 3 Grundlagen der Programmierung II DBIS - SS2009 Structured Query Language • SQL ist für Relationale

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.

Page 25: Structured Query Language - Benutzer-Homepagesprg2/SS2009/folien/zicari/... · 3 Grundlagen der Programmierung II DBIS - SS2009 Structured Query Language • SQL ist für Relationale

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;

Page 26: Structured Query Language - Benutzer-Homepagesprg2/SS2009/folien/zicari/... · 3 Grundlagen der Programmierung II DBIS - SS2009 Structured Query Language • SQL ist für Relationale

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}∗) ;

Page 27: Structured Query Language - Benutzer-Homepagesprg2/SS2009/folien/zicari/... · 3 Grundlagen der Programmierung II DBIS - SS2009 Structured Query Language • SQL ist für Relationale

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

) ;

Page 28: Structured Query Language - Benutzer-Homepagesprg2/SS2009/folien/zicari/... · 3 Grundlagen der Programmierung II DBIS - SS2009 Structured Query Language • SQL ist für Relationale

Grundlagen der Programmierung II DBIS - SS200928

SQL-2 Datentypen

Page 29: Structured Query Language - Benutzer-Homepagesprg2/SS2009/folien/zicari/... · 3 Grundlagen der Programmierung II DBIS - SS2009 Structured Query Language • SQL ist für Relationale

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 ) ;

Page 30: Structured Query Language - Benutzer-Homepagesprg2/SS2009/folien/zicari/... · 3 Grundlagen der Programmierung II DBIS - SS2009 Structured Query Language • SQL ist für Relationale

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) ) ;

Page 31: Structured Query Language - Benutzer-Homepagesprg2/SS2009/folien/zicari/... · 3 Grundlagen der Programmierung II DBIS - SS2009 Structured Query Language • SQL ist für Relationale

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.

Page 32: Structured Query Language - Benutzer-Homepagesprg2/SS2009/folien/zicari/... · 3 Grundlagen der Programmierung II DBIS - SS2009 Structured Query Language • SQL ist für Relationale

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,- €.

Page 33: Structured Query Language - Benutzer-Homepagesprg2/SS2009/folien/zicari/... · 3 Grundlagen der Programmierung II DBIS - SS2009 Structured Query Language • SQL ist für Relationale

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>

Page 34: Structured Query Language - Benutzer-Homepagesprg2/SS2009/folien/zicari/... · 3 Grundlagen der Programmierung II DBIS - SS2009 Structured Query Language • SQL ist für Relationale

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';

Page 35: Structured Query Language - Benutzer-Homepagesprg2/SS2009/folien/zicari/... · 3 Grundlagen der Programmierung II DBIS - SS2009 Structured Query Language • SQL ist für Relationale

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.

Page 36: Structured Query Language - Benutzer-Homepagesprg2/SS2009/folien/zicari/... · 3 Grundlagen der Programmierung II DBIS - SS2009 Structured Query Language • SQL ist für Relationale

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.

Page 37: Structured Query Language - Benutzer-Homepagesprg2/SS2009/folien/zicari/... · 3 Grundlagen der Programmierung II DBIS - SS2009 Structured Query Language • SQL ist für Relationale

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.

Page 38: Structured Query Language - Benutzer-Homepagesprg2/SS2009/folien/zicari/... · 3 Grundlagen der Programmierung II DBIS - SS2009 Structured Query Language • SQL ist für Relationale

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• …

Page 39: Structured Query Language - Benutzer-Homepagesprg2/SS2009/folien/zicari/... · 3 Grundlagen der Programmierung II DBIS - SS2009 Structured Query Language • SQL ist für Relationale

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