Teil 2-6. Vorlesung Modul: Programmierung B-PRG Grundlagen der Programmierung II Professur für Datenbanken und Informationssysteme Dr. Karsten Tolle tolle@dbis.cs.uni-frankfurt.de 1
Schlüssel? PLZ ORT STRASSE_NR 30419 Hannover Schaumburgstr. 2 30419 Hannover Quetlinburger Weg 12 37308 Schirmberg Bergstraße 1 37308 Bodenrode Hauptstraße 12 37308 Geismar Bergstraße 1 35279 Neustadt Gartenstraße 7 53577 Neustadt Gartenstraße 7 keine Abhängigkeiten Schlüssel: PLZ, ORT, STRASSE_NR 2 Grundlagen der Programmierung II
Fahrzeuge der Firma AB HERSTELLER KENNZEICHEN ZUGEL_GES_GEW FÜHRERSCHEIN VW F-AB 123 bis 3.5 B MB F-AB 234 bis 7.5 C1 MB F-AB 235 bis 7.5 C1 MAN F-AB 236 bis 12 C MB F-AB 239 bis 12 C Abhängigkeiten? 3 Grundlagen der Programmierung II
Fahrzeuge der Firma AB HERSTELLER KENNZEICHEN ZUGEL_GES_GEW FÜHRERSCHEIN VW F-AB 123 bis 3.5t B MB F-AB 234 bis 7.5t C1 MB F-AB 235 bis 7.5t C1 MAN F-AB 236 bis 12t C MB F-AB 239 bis 12t C MB F-AB 230 bis 17t C aus ZUGEL_GES_GEW folgt hier FÜHRERSCHEIN: ZUGEL_GES_GEW FÜHRERSCHEIN umgekehrt nicht! 4 Grundlagen der Programmierung II
ein wenig abgewandelt HERSTELLER TYP ZUGEL_GES_GEW FÜHRERSCHEIN VW Transporter bis 3.5t B MB Laster bis 7.5t C1 MB Laster bis 7.5t C1 MAN Laster bis 12t C MB Lastzug bis 17t CE MB Lastzug bis 17t CE aus ZUGEL_GES_GEW und TYP folgt hier FÜHRERSCHEIN: ZUGEL_GES_GEW TYP FÜHRERSCHEIN 5 Grundlagen der Programmierung II
Funktionale Abhängigkeit (FD) Seien X und Y Teilmengen von R. Eine Relation r(r) erfüllt (satisfies) die funktionale Abhängigkeit (functional dependency) FD X Y, wenn für je zwei (beliebige) Tupel u, v r(r) gilt: u(x) = v(x) u(y) = v(y). X Y u(x) = v(x) u(y) = v(y) 6 Grundlagen der Programmierung II
Beispiel Gegeben ist die Relation r(r): A B C D E a1 b1 c1 d1 e1 a1 b2 c2 d2 e1 a2 b1 c3 d2 e1 a2 b1 c4 d3 e1 a3 b2 c5 d1 e1 Geben Sie an, welche der folgenden Abhängigkeiten r erfüllt. 7 A D AB D C BDE E A A E A BC Grundlagen der Programmierung II
Schlüssel Ein Schlüssel identifiziert eine Entität. Er besteht aus einer Menge von Attributen, deren Werte alle Instanzen einer Entität eindeutig bestimmen. (aus ER!) Ein Schlüssel (key) einer Relation r(r) ist eine minimale Teilmenge K von R, so dass für je zwei verschiedene Tupel t 1, t 2 r gilt: t 1 (K) t 2 (K) und keine echte Teilmenge K' von K hat diese Eigenschaft. Ein Schlüssel kann als Integritätsbedingung angesehen werden. Falls K Schlüssel von r(r), t 1 r, t 1 (K) = t 2 (K), t 1 t 2 dann dürfte t 2 nicht in r(r) eingefügt werden. 8 Grundlagen der Programmierung II
Schlüssel Gegeben seien ein Relationenschema R und eine Menge F von FDs. X R ist ein Oberschlüssel für R X R X ist ein Schlüssel für R X R und X minimal ( ( A X: X\A R)) 9 Grundlagen der Programmierung II
1. Normalform FIRSTNME LASTNME BIRTH STREET NUMBER TOWN ZIP Jon Lucas 12.03.1969 {Zeil, Lange Str.} {12, 114} {Frankfurt, Frankfurt} {60313, 60313} Lucas Jon 24.12.1980 Gräfstr. 27 Frankfurt 60325 FIRSTNME LASTNME BIRTH STREET NUMBER TOWN ZIP Jon Lucas 12.03.1969 Zeil 12 Frankfurt 60313 Jon Lucas 12.03.1969 Lange Str. 114 Frankfurt 60313 Lucas Jon 24.12.1980 Gräfstr. 27 Frankfurt 60325
1. Normalform Definition: Ein Relationenschema R ist in 1. Normalform (1NF), wenn die Wertebereiche aller Attribute von R atomar sind. 1.NF Wertebereiche atomar 11 Grundlagen der Programmierung II
vorrat (Teil Lager Menge Lageradresse) 101 1 25 Waag. 10 102 3 410 Krugerstr. 42 102 1 300 Waag. 10 112 4 10 Brunnerstr. 105 F = { Teil Lager Menge Lageradresse Lager Lageradresse } 12 Grundlagen der Programmierung II
Prim Ein Attribut A heißt prim in R, wenn es in einem Schlüssel von R enthalten ist, sonst heiße es nicht prim. A ist prim X: X ist Schlüssel, A X 13 Grundlagen der Programmierung II
volle funktionale Abhängigkeit Eine funktionale Abhängigkeit X Y heißt volle funktionale Abhängigkeit, wenn für keine Teilmenge X X, X Y gilt. Y heißt dann voll funktional abhängig von X. X Y voll funktional X X : X Y 14 Grundlagen der Programmierung II
2. Normalform Ein Relationenschema R ist in 2. Normalform (2NF), wenn es in 1NF ist und jedes nicht prime Attribut voll funktional von jedem Schlüssel von R abhängig ist. 2. NF A nicht prim Schlüssel A voll funktional Die 2. NF ist verletzt, wenn ein Teil eines Schlüssels ein Nicht-Schlüsselattribut funktional bestimmt. 15 Grundlagen der Programmierung II
Beispiel 1 vorrat (Teil Lager Menge Lageradresse) 101 1 25 Waag. 10 102 3 410 Krugerstr. 42 102 1 300 Waag. 10 112 4 10 Brunnerstr. 105 F = { Teil Lager Menge Lageradresse Lager Lageradresse } vorrat (Teil Lager Menge 101 1 25 102 3 410 102 1 300 112 4 10 lager (Lager Lageradresse) 1 Waag. 10 3 Krugerstr. 42 4 Brunnerstr. 105 16 Grundlagen der Programmierung II
Beispiel 2 R = ABCD F = {AB CD, B D} B D verletzt 2. NF Zerlegung in: R1 = (ABC) mit F1 = {AB C} R2 = (BD) mit F2 = {B D} 17 Grundlagen der Programmierung II
2. NF? ID HERSTELLER ZUGEL_GES_GEW FÜHRERSCHEIN 1 VW bis 3.5 B 2 MB bis 7.5 C1 3 MB bis 8.5 C 4 MAN bis 12 C 5 MB bis 12 C 6 VW bis 12 C F = { ID R, ZUGEL_GES_GEW FÜHRERSCHEIN} 18 Grundlagen der Programmierung II
transitive Abhängigkeit Gegeben sei eine Menge funktionaler Abhängigkeiten F über einem Relationenschema R, X R, A R. A ist transitiv abhängig von X, wenn es eine Attributmenge Y R gibt so, dass X Y F + und Y A F + sind und Y X F +, A XY gilt. X A transitiv Y, Y X: X Y A, A nicht prim F + ist die Hülle von F, d.h. zusätzlich alle FDs, die aus den gegebenen folgen. 19 Grundlagen der Programmierung II
3. Normalform Ein Relationenschema R in 1. NF ist in 3. Normalform (3NF), wenn kein nichtprimes Attribut von einem Schlüssel in R transitiv abhängig ist. 3.NF A nicht prim Schlüssel A nicht transitiv Die 3. NF ist verletzt, wenn ein Nicht-Schlüsselattribut transitiv von einem Schlüssel abhängt. 20 Grundlagen der Programmierung II
3. NF? ID HERSTELLER ZUGEL_GES_GEW FÜHRERSCHEIN 1 VW bis 3.5 B 2 MB bis 7.5 C1 3 MB bis 8.5 C 4 MAN bis 12 C 5 MB bis 12 C 6 VW bis 12 C Fall 1: F = { ID HERSTELLER TYP ZUGEL_GES_GEW, ZUGEL_GES_GEW FÜHRERSCHEIN} Fall 2: F = { ID R, ZUGEL_GES_GEW FÜHRERSCHEIN} 21 Grundlagen der Programmierung II
Beispiel R = ABC F = {A B, B C} A B C verletzt 3. NF Zerlegung in: R1 = (AB) mit F1 = {A B} und R2 = (BC) mit F2 = {B C} 22 Grundlagen der Programmierung II
Normalformen Über die Normalformen (NF) werden Kriterien definiert, um Redundanzen und Anomalien zu verhindern. Es gibt: 1 NF 2 NF 3 NF BCNF 4 NF 5 NF 6 NF 1 NF 2 NF 3 NF
Normalisierung / Denormalisierung Normalisierung: Der Prozess des Aufspaltens von Relationen, um Anomalien/Redundanzen zu verhindern. Denormalisierung: Der Prozess des Zusammenlegens von Relationen, um Performanz zu gewinnen.
Vorgehen beim Prüfen auf NF (WICHTIG!!!) Ausgangspunkt: Relation R (mind. 1. NF) und Menge der FDs gegeben. 1. Welche Schlüssel gibt es? was sind die nicht primen Attribute! 2. Prüfe auf 2. NF (voll funktional abhängig von ALLEN Schlüsseln?) 3. Prüfe auf 3. NF (transitive Abhängigkeit von irgend einem Schlüssel?) 25 Grundlagen der Programmierung II
SQL (ein Einblick) Structured Query Language
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
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)
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} ) ;
create table Konto ( KtoNr integer, KundenName varchar(25), FilialName varchar(25), Saldo real ) ; create table Kunde ( Name varchar(25), Vorname varchar(25), Straße varchar(25), Stadt varchar(25), GebDatum date ) ;
SQL-2 Datentypen character character(n) character varying(n) integer oder int smallint numeric(m,n) decimal(n,m) real double precision float(m) date time timestamp
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 varchar(25), FilialName varchar(25), Saldo real ) ;
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) ) ;
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.
Syntaktische Grundform der SQL-Anfrage select A 1,A 2,...,A n from R 1, R 2,...,R m [where conditions] [group by clause] [having clause] [order by clause];
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;
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;
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;
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.
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;
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
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;
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;
Sortierung select A 1,A 2,...,A n from R 1, R 2,...,R m [where Bedingung] [order by (A i [asc desc])+]; select * from Kredit order by FilialName, KreditNr;
Group by / Gruppierung select A 1,A 2,...,A n from R 1, R 2,...,R m [where conditions] [group by clause]; select TYP, sum(preis) from FAHRZEUGE where LADEGEW >= 3.0 group by TYP; ID TYP LADEGE W PREIS 1 VW-Trans 3 20.398 2 MB-Lastzug 14 35.986 3 MB-Lastzug 17 36.765 4 VW-Trans 2.4 19.938
Group by having / Gruppierung mit Bedingung select A 1,A 2,...,A n from R 1, R 2,...,R m [where conditions] [group by clause] [having clause]; ID TYP LADEGE W PREIS 1 VW-Trans 3 20.398 2 MB-Lastzug 14 35.986 3 MB-Lastzug 17 36.765 4 VW-Trans 2.4 19.938 select TYP, sum(preis) from FAHRZEUGE where LADEGEW >= 3.0 group by TYP having sum(preis) > 30000;
Fremdschlüssel / Forein Key CREATE TABLE EMPLOYEE (FIRSTNME varchar(20), LASTNME varchar(20), BIRTH date, Foreign Key (ADR_SID) references ADDRESS(ID)); FIRSTNME LASTNME BIRTH ADR_ID Jon Lucas 12.03.1969 1 Jon Smith 30.09.1973 2 Lucas Jon 24.12.1980 3 Jon Smith 24.12.1976 4 Lucas Smith 01.01.1975 1 ID STREET NUMBER TOWN ZIP 1 Zeil 12 Frankfurt 60313 2 Lange Str. 114 Frankfurt 60313 3 Gräfstr. 27 Frankfurt 60325 4 Gundhofstr. 27 Mörfelden- Walldorf 64546
SQL Online Tutorial http://sqlzoo.net/
SQL Online Tutorial Queries can be interactively executed.
Weitere Dinge Inner und Outer Join Alter und Drop Table Mengenoperationen: Union, Minus, Intersect Sichten/Views Index Trigger und vieles vieles mehr!!!! auch abhängig vom DBMS und der SQL-Version