Datamodellering en –verwerking 8C020 college 5. Terugblik college 4 • Zeikenhuis (RM) •...

Post on 23-May-2015

212 views 0 download

Transcript of Datamodellering en –verwerking 8C020 college 5. Terugblik college 4 • Zeikenhuis (RM) •...

Datamodellering en –verwerking8C020

college 5

Terugblik college 4

• Zeikenhuis (RM)

• Querytalen

• SQL – Inleiding– Data definitie– Data manipulatie– Apsecten van SQL– Oefeningen

Onderwerpen college 5

• Aspecten van SQL – Join – Subqueries

• Oefeningen SQL

• Normalisatie– 1ste, 2de, 3de normaal form

• Oefeningen ER, RM, SQL

Join - voorbeeld

Patnr pnaam padres pwoonpl huisarts geb

12345 Appels Brink 12 Son 13 03-05-68

23456 Peren Markt 1 Son 13 23-06-70

34567 Storms Laan 88 Oss 14 13-06-36

12346 Appels Laan 86 Oss 14 23-12-45

24564 Janssen Weg 4a Almere 15 01-07-39

76543 Brandsma Weg 67 Almere 15 01-11-71

hanr hanaam haadres haplaats

13 B. Brandsma Brink 89 Son

14 S. Storms Laan 84 Oss

15 G. de Groot Weg 17 Lelystad

16 G. Groten Weg 19 Almere

Join

het leggen van een verbinding tussen tabellen

kan met behulp van een join-operatie

 

SELECT pnaam, hanaam

FROM patienten, huisartsen

WHERE patienten.pwoonpl =

huisartsen.haplaats;

 

1. beschouw stuk voor stuk de rijen uit de eerste FROM tabel

2. beschouw stuk voor stuk de rijen uit de tweede FROM tabel

3. verifieer of de combinatie voldoet aan de WHERE regel

4. geef voor de goede combinaties de SELECT attributen

Join

pnaam hanaam

Appels B. Brandsma

Peren B. Brandsma

Storms S. Storms

Appels S. Storms

Janssen G. Groten

Brandsma G. Groten

geef de namen van patiënten en de namen van huisartsen waarvoor geldt dat de patiënt woont in de plaats waar de huisarts praktijk houdt

Join

• in principe krijgen we bij een join combinaties van willekeurige tupels 

• meestal hebben we behoefte aan combinaties van gerelateerde tupels

 

SELECT pnaam, hanaam

FROM patienten, huisartsen

WHERE patienten.huisarts =

huisartsen.hanr;

 

1. beschouw stuk voor stuk de rijen uit de eerste FROM tabel

2. beschouw stuk voor stuk de rijen uit de tweede FROM tabel

3. verifieer of de combinatie voldoet aan de WHERE regel

4. geef voor de goede combinaties de SELECT attributen

Join

pnaam hanaam

Appels B. Brandsma

Peren B. Brandsma

Storms S. Storms

Appels S. Storms

Janssen G. de Groot

Brandsma G. de Groot

geef de namen van patiënten en de namen van hun huisartsen

Join

pnaam hanaam

Appels B. Brandsma

Peren B. Brandsma

Storms S. Storms

Appels S. Storms

SELECT pnaam, hanaamFROM patienten, huisartsenWHERE patienten.huisarts = huisartsen.hanrAND patienten.woonpl = huisartsen.haplaats;

geef de namen van patiënten en de namen van hun huisartsen voor die patiënten waarvoor geldt dat zij wonen in de plaats waar hun huisarts praktijk houdt

Join

voorbeeld

 

SELECT *

FROM patienten, huisartsen;

 

voorbeeld

 

SELECT *

FROM patienten, huisartsen

WHERE patienten.huisarts =

huisartsen.hanr;

Subqueries

binnen queries kunnen weer queries gebruikt worden

SELECT pnaam

FROM patienten

WHERE huisarts =

SELECT hanr

FROM huisartsen

WHERE hanaam = 'Brandsma';

subqueries in een tabel

SELECT pnaam

FROM patienten

WHERE huisarts =

SELECT huisarts

FROM patienten

WHERE patnr = '9912';

Subqeriesbehalve de operator = kunnen we ook andere operatoren gebruiken

om queries met elkaar te relateren

SELECT *

FROM patienten

WHERE huisarts IN

SELECT hanr

FROM huisartsen

WHERE haplaats = 'Eindhoven';

SELECT pnaam

FROM patienten

WHERE EXISTS

(SELECT hanr

FROM huisartsen

WHERE patienten.padres =

huisartsen.haadres);

Opgave 5.4

wat drukt de volgende query uit?

 

SELECT pnaam

FROM patienten

WHERE NOT huisarts IN

SELECT hanr

FROM huisartsen

WHERE haplaats = 'Eindhoven';

Voorbeeld

we hebben een relatie (tabel) ouders met attributen ouder en kind

en een relatie personen met attributen naam en leeftijd

ouders(ouder,kind)

personen(naam,leeftijd)

 opgave 5.5

wat drukt de volgende query uit?

SELECT ouder

FROM ouders

WHERE NOT kind IN

SELECT naam

FROM personen

WHERE leeftijd = '6';

en wat als er NOT in de laatste regel staat?

Opgave5.6

wat drukt de volgende query uit?

 

SELECT pnaam

FROM patienten

WHERE huisarts IN

SELECT hanr

FROM huisartsen

WHERE NOT hanaam IN

SELECT hanaam

FROM huisartsen

WHERE haplaats = 'Eindhoven';

Notatie

• als we in een query meerdere keren dezelfde relatie gebruiken moeten we aangeven welke attributen bij welke relaties horen

 

SELECT x.pnaam, y.pnaam

FROM patienten x, patienten y

WHERE x.huisarts = y.huisarts;

Voorbeeld

we hebben een relatie (tabel) ouders met attributen ouder en kind

ouders(ouder,kind)

 

opgave 5.7.a

wat drukt de volgende query uit?

 

SELECT x.ouder, y.kind

FROM ouders x, ouders y

WHERE x.kind = y.ouder; 

 

opgave 5.7.b

wat drukt de volgende query uit?

 

SELECT x.ouder, y.kind

FROM ouders x, ouders y;

 

Opgave 5.8

wat drukt de volgende query uit?

 

SELECT ouder

FROM ouders

WHERE kind IN

SELECT ouder

FROM ouders;

 

 

 

en wat met WHERE NOT kind IN ?

Opgave 5.9

wat drukt de volgende query uit?

 

SELECT ouder

FROM ouders

WHERE NOT ouder IN

SELECT ouder

FROM ouders

WHERE kind IN

SELECT naam

FROM personen

WHERE leeftijd = '3';

Opgave 5.10

druk in SQL uit:

 geef van alle ouders de leeftijden

 

druk in SQL uit:

 geef van alle ouders en grootouders de leeftijden

 

druk in SQL uit:

 geef alle personen die ouder zijn dan Bas en Anna

Functies

het is mogelijk met functies acties uit te voeren op groepen van gegevens

 

AVG(..)

SUM(..)

MAX(..)

MIN(..)

COUNT(*)

 

SELECT MAX(leeftijd)

FROM personen

WHERE naam = 'Anna';

 

SELECT MIN(leeftijd)

FROM personen, ouders

WHERE personen.naam = ouders.kind

Queryoptimalisatie

de formulering van queries kan (bijvoorbeeld met joins en subqueries) tot lastige uitdrukkingen leiden

 

query-optimalisatie betekent dat de DBMS-implementatie zorgt voor de vertaling naar een equivalente uitdrukking die sneller en efficiënter verwerkt kan worden

 

waarschuwing

 

• in de theorie is sprake van verzamelingen dus geen dubbele rijen en waarden

• in een SQL implementatie is sprake van tabellen met dubbele rijen

SQL en andere programmeertalen

• Embedded SQL

• Dynamic SQL– ODBC (Open Data Base Connectivity) – JDBC (Java Data Base Connectivity)

• Web technologien, “Data driven sites”– MySQL & php, Java scripts

Normalisatie

WN2

WNID NAAM AFD SALARIS CURSUS DATUM

100 Anna Bruinsma Verkoop 50.000 PR 6-6-94

100 Anna Bruinsma Verkoop 50.000 Word 1-12-94

140 Carla Dik Administratie 41.000 Belastingen 25-8-94

110 Eef Groen Informatiesystemen 49.000 C++ 13-11-94

110 Eef Groen Informatiesystemen 49.000 Word 1-12-94

190 Henk Israël Inkoop 39.500 Logistiek 8-3-94

150 Janny Kramer Verkoop 45.000 PR 6-6-94

150 Janny Kramer Verkoop 45.000 Workflow 11-12-94

Normalisatie

• Probleem– WN2 bevat gegevens over twee entiteiten

• Oplossing – Verdeel zo’n relatie in twee relaties: WN1 en WN-CURSUS

Normalisatie

WN1WNID NAAM AFD SALARIS100 Anna Bruinsma Verkoop 50.000140 Carla Dik Administratie 41.000110 Eef Groen Informatiesystemen 49.000

190 Henk Israël Inkoop 39.500150 Janny Kramer Verkoop 45.000

 WN-CURSUS

WNID CURSUS DATUM 

100 PR 6-6-94 

100 Word 1-12-94 

140 Belastingen 25-8-94  

110 C++ 13-11-94 

110 Word 1-12-94 

190 Logistiek 8-3-94 

150 PR 6-6-94 

150 Workflow 11-12-94 

Normaalvormen

1ste normaalvorm:

Alle rijen hebben dezelfde lengte

2de normaalvorm:

Elk niet sleutel attribuut is een feit over de hele primaire sleutel (niet alleen over een deel van de sleutel)

3de normaalvorm:

Elk niet sleutel attribuut is geen feit over een ander attribuut dat geen primaire sleutel is

Elk niet sleutel attribuut is een feit over

“the key, the whole key, and nothing but the key, (so help me Codd)”