powerpoint-presentatie bij h1-10
TRANSCRIPT
Relationele databases Relationele databases en SQLen SQL
hoofdstuk 1 t/m 10hoofdstuk 1 t/m 10
© Mattic b.v., AlmereAlle rechten voorbehouden. Het is docenten toegestaan deze diaserie te gebruiken in combinatiemet het cursusboek. Hierbij mogen ook handouts worden verspreid.Het ppt-bestand bevat voor de SQL-code een niet-standaardlettertype (Letter Gothic). Wanneer u dit niet op uw computer hebt staan, moet u de bestanden openen met het kenmerkalleen-lezen. Anders wordt het lettertype verwijderd, wat ten koste gaat van de opmaak.Zie ook: Informatie over codelettertype voor Windows- en Mac-gebruikers.doc.
Cursusmateriaal
• cursusboek: Relationele databases en SQL• downloaden van www.relsql.nl:
– installatiefile voor de software:• Firebird: databasemanagementsysteem• Boekverkenner: interactieve versie van het boek• IQU (Interactive Query Utility): SQL-tool
– uitwerkingen van opgaven (pdf)– errata
3bij: Relationele databases en SQL ©Mattic b.v.
Installatie van de software:executeer de installatiefile, accepteer alle defaults
Inhoud boek (1)
1 Relationele databases: structuur
2 Relationele databases: regels
3 Communiceren met een relationele database
4 Nulls
5 Normalisatie
Deel A: Relationele databases
relationele model ennormalisatie, practisch ...
… en theoretisch
‘applicatie’praat via SQLmet database
4bij: Relationele databases en SQL ©Mattic b.v.
Inhoud boek (2)
6 Informatie uit één tabel
7 Informatie uit meerdere tabellen: joins
8 Statistische informatie
9 Subselects en views
10 Wijzigen van een database-inhoud
Deel B: Relationele databases bevragen en wijzigen
subtaal SQL-DML(Data ManipulationLanguage)
5bij: Relationele databases en SQL ©Mattic b.v.
Inhoud boek (3)
11 Definitie van gegevensstructuren
12 Autorisatie
13 Query-optimalisatie
Deel C: Relationele databases beheren
rechten voor gebruikers
14 Aanpak van queryproblemen
15 Transacties en concurrency
16 Triggers en stored procedures
17 De datadictionary
Deel D: Verdieping
programmeren van regels
meer gebruikers
het hart van een relationeel systeem
SQL-DDL
bij grote databases
methodisch problemen oplossen
6bij: Relationele databases en SQL ©Mattic b.v.
Hoofdstuk 1:Hoofdstuk 1:
Relationele Relationele databases: databases: structuurstructuur
In dit hoofdstuk ….
• Een applicatie die gebruikmaakt van een relationele database
• Structuren: van gegevens in de applicatie en van gegevens in de database
• Je moet ongewenste databasestructuren kunnen herkennen en tranformeren:– herhalende groepen– redundantie (overtolligheid van gegevens)
• Standaardisatie• In deze cursus: nog geen databases ontwerpen!
8bij: Relationele databases en SQL ©Mattic b.v.
Applicatie: Toetjesboek(applicatie bij Firebird-database)
9bij: Relationele databases en SQL ©Mattic b.v.
Toetjesboek (applicatie)
• Functionaliteit = wat ‘doet’ de applicatie?
• Functionaliteit van Toetjesboek:– ‘onderhoud’ van gerechten, hun ingrediënten, producten en
eenheden• invoegen (insert)• verwijderen (delete)• wijzigen (update)• zoeken en bladeren
10bij: Relationele databases en SQL ©Mattic b.v.
Receptwindow in applicatie (schematisch)
g e re c h t C o u p e K iw an o
e n e rg ie p e r p e rs o o n (kC a l) 4 3 1
b e re id in g s t ijd (m in u t e n ) 2 0
b e re id in g s w ijze S ch i l d e k iw an o , s n i jd h em in s tu k jes , v o eg d e teq u i la to e en laat d i t m en g s el1 5 m in u ten s taan . N eem p er p ers o o n 3 b o l let j es i j s en v o eg h ier d e k iw an om et t eq u i la aan to e. S erv eer m et g ezo et e, s t i j fg es lag en s lag ro o m .
in g re d ië n t e n p ro d u ct h o ev eelh ei d p er p ers o o n een h eid en erg ie p er een h eid (k C al )
i j sk iw an os lag ro o ms u ik ert eq u i la
0 . 1 50 . 50 . 31 01
l i ters tu k sd eci l i t erg rameet l ep el
1 6 0 04 0
3 3 64
3 0
11bij: Relationele databases en SQL ©Mattic b.v.
Hoe de gegevens opslaan in database? (1)
Bezwaren:• ‘redundantie’• structuur is (onnodig) complex: de vijfde kolom heeft een
samengestelde structuur (subtabel in elke rij)
Alle gegevens van alle gerechten in één tabel?
naam energiePPbereidingstijdbereidingswijzeingrediënten
product hoeveelheidPPeenheidenergiePECoupe Kiwano 431 20 Schil ... ijs
kiwanoslagroomsuikertequila
0.150.50.3101
literstuksdecilitergrameetlepel
160040336430
Glace Terrace 403 5 Neem ... ijsaardbeienpernodpeper
0.2502
litergrameetlepel
16000.2535
Mango Plus Plus 131 8 Snijd ... mangoaardbeienzure room
0.5500.4
stuksgramdeciliter
800.25195
Gerecht
12bij: Relationele databases en SQL ©Mattic b.v.
Redundantie (1)
Redundantie =reconstrueerbaarheid van gegeven(s) uit de context
Ofwel: ‘uit kunnen gummen’ en weer terug kunnen vinden!
naam energiePPbereidingstijdbereidingswijzeingrediënten
product hoeveelheidPPeenheid energiePECoupe Kiwano 431 20 Schil ... ijs
kiwanoslagroomsuikertequila
0.150.50.3101
literstuksdecilitergrameetlepel
160040336430
Glace Terrace 403 5 Neem ... ijsaardbeienpernodpeper
0.2502
grameetlepel
0.2535
Gerecht
13bij: Relationele databases en SQL ©Mattic b.v.
NB. Je moet wel weten dat er per product maar één eenheid is: beschouw dit als gegeven.
Redundantie (2)
Redundantie kan tot inconsistentie leiden:
Inconsistentie =tegenstrijdigheid van gegeven(s)
Beter op één plek verkeerd dan half goed, half fout !
naam energiePPbereidingstijdbereidingswijzeingrediënten
product hoeveelheidPPeenheidenergiePECoupe Kiwano 431 20 Schil ... ijs
kiwanoslagroomsuikertequila
0.150.50.3101
literstuksdecilitergrameetlepel
160040336430
Glace Terrace 403 5 Neem ... ijsaardbeienpernodpeper
0.2502
litergrameetlepel
14500.2535
Gerecht
14bij: Relationele databases en SQL ©Mattic b.v.
Herhalende groep
Bezwaren:• ingewikkelder databasebeheer• gebrek aan symmetrie in behandeling van ‘soorten van dingen’
Opslagstructuur hoort ‘neutraal’ te zijn(i.t.t. een applicatie, die taakgericht is)
naam energiePPbereidingstijdbereidingswijzeingrediënten
product hoeveelheidPPeenheidenergiePECoupe Kiwano 491 20 Schil ... ijs
kiwanoslagroomsuikertequilatopaz
0.150.50.31011
literstuksdecilitergrameetlepelstuks
16004033643060
Glace Terrace ... ... ... ... ... ... ...Mango Plus Plus ... ... ... ... ... ... ...Macedoine 175 10 Snijd ... mango
tangarinecherimoya
0.511
stuksstuksstuks
806075
Gerecht
toevoegen rij (met subtabel)in hoofdtabel toevoegen rij in subtabel
15bij: Relationele databases en SQL ©Mattic b.v.
‘Omkering’ van herhalende groep
‘gerechten’ als herhalende groep bij producten!
naam eenheid energiePEgerechten
gerecht energiePPbereidingstijdbereidingswijzehoeveelheidPPijs liter 1600 Coupe Kiwano
Glace Terrace431403
205
Schil ...Neem ...
0.150.2
kiwano stuks 40 Coupe Kiwano 431 20 Schil ... 0.5slagroom deciliter 336 Coupe Kiwano 431 20 Schil ... 0.3suiker gram 4 Coupe Kiwano 431 20 Schil ... 10tequila eetlepel 30 Coupe Kiwano 431 20 Schil ... 1aardbeien gram 0.25 Glace Terrace
Mango Plus Plus403131
58
Neem ...Snijd ...
5050
pernod eetlepel 35 Glace Terrace 403 5 Neem ... 2peper Glace Terrace 403 5 Neem ...mango stuks 80 Mango Plus Plus 131 8 Snijd ... 0.5zure room deciliter 195 Mango Plus Plus 131 8 Snijd ... 0.4
Product
16bij: Relationele databases en SQL ©Mattic b.v.
17
Eliminerenherhalendegroep
bij: Relationele databases en SQL ©Mattic b.v.
naam energiePPbereidingstijdbereidingswijzeingrediënten
product hoeveelheidPPeenheid energiePECoupe Kiwano 431 20 Schil ... ijs
kiwanoslagroomsuikertequila
0.150.50.3101
literstuksdecilitergrameetlepel
160040336430
Glace Terrace 403 5 Neem ... ijsaardbeienpernodpeper
0.2502
litergrameetlepel
16000.2535
Mango Plus Plus 131 8 Snijd ... mangoaardbeienzure room
0.5500.4
stuksgramdeciliter
800.25195
Gerecht
gerecht product hoeveelheidPPeenheid energiePECoupe KiwanoCoupe KiwanoCoupe KiwanoCoupe KiwanoCoupe KiwanoGlace TerraceGlace TerraceGlace TerraceGlace TerraceMango Plus PlusMango Plus PlusMango Plus Plus
ijskiwanoslagroomsuikertequilaijsaardbeienpernodpepermangoaardbeienzure room
0.150.50.3101
0.2502
0.5500.4
literstuksdecilitergrameetlepellitergrameetlepel
stuksgramdeciliter
160040336430
16000.2535
800.25195
Ingredient
naam energiePPbereidingstijdbereidingswijzeCoupe KiwanoGlace TerraceMango Plus Plus
431403131
2058
Schil ...Neem ...Snijd ...
Gerecht
Eliminerenredundantie:‘SPOD’Single PointOf Definition:• alle informatie
op één plaats gedefinieerd
• elk ‘soort vanding’ zijn eigentabel
gerecht product hoeveelheidPPeenheid energiePECoupe KiwanoCoupe KiwanoCoupe KiwanoCoupe KiwanoCoupe KiwanoGlace TerraceGlace TerraceGlace TerraceGlace TerraceMango Plus PlusMango Plus PlusMango Plus Plus
ijskiwanoslagroomsuikertequilaijsaardbeienpernodpepermangoaardbeienzure room
0.150.50.3101
0.2502
0.5500.4
literstuksdecilitergrameetlepellitergrameetlepel
stuksgramdeciliter
160040336430
16000.2535
800.25195
Ingredient
naam energiePPbereidingstijdbereidingswijzeCoupe KiwanoGlace TerraceMango Plus Plus
431403131
2058
Schil ...Neem ...Snijd ...
Gerecht
naam eenheid energiePEijskiwanoslagroomsuikertequilaaardbeienpernodpepermangozure room
literstuksdecilitergrameetlepelgrameetlepel
stuksdeciliter
160040336430
0.2535
80195
Product
gerecht product hoeveelheidPPCoupe KiwanoCoupe KiwanoCoupe KiwanoCoupe KiwanoCoupe KiwanoGlace TerraceGlace TerraceGlace TerraceGlace TerraceMango Plus PlusMango Plus PlusMango Plus Plus
ijskiwanoslagroomsuikertequilaijsaardbeienpernodpepermangoaardbeienzure room
0.150.50.3101
0.2502
0.5500.4
Ingredient
naam energiePPbereidingstijdbereidingswijzeCoupe KiwanoGlace TerraceMango Plus Plus
431403131
2058
Schil ...Neem ...Snijd ...
Gerecht
18bij: Relationele databases en SQL ©Mattic b.v.
Standaardisatie
Ook eenheden zijn dingen vanzelfstandig belang: standaardisatiegewenst ! Product
gerecht product hoeveelheidPPCoupe KiwanoCoupe KiwanoCoupe KiwanoCoupe KiwanoCoupe KiwanoGlace TerraceGlace TerraceGlace TerraceGlace TerraceMango Plus PlusMango Plus PlusMango Plus Plus
ijskiwanoslagroomsuikertequilaijsaardbeienpernodpepermangoaardbeienzure room
0.150.50.3101
0.2502
0.5500.4
Ingredient
naam eenheid energiePEijskiwanoslagroomsuikertequilaaardbeienpernodpepermangozure roombanaan
literstuksdecilitergrameetlepelgrameetlepel
stuksdeciliterstuks
160040336430
0.2535
8019540
naam energiePPbereidingstijdbereidingswijzeCoupe KiwanoGlace TerraceMango Plus Plus
431403131
2058
Schil ...Neem ...Snijd ...
Gerecht
naamliterstuksdecilitergramkilogrameetlepeltheelepel
Eenheid
19bij: Relationele databases en SQL ©Mattic b.v.
relationele database =database bestaandeuit tabellen
Genormaliseerde relationele database
‘volledig genormaliseerd’: - geen herhalende groepen - geen redundantie
normalisatie garandeert niet altijd standaardisatie ! tabel Eenheid !
Product
gerecht product hoeveelheidPPCoupe KiwanoCoupe KiwanoCoupe KiwanoCoupe KiwanoCoupe KiwanoGlace TerraceGlace TerraceGlace TerraceGlace TerraceMango Plus PlusMango Plus PlusMango Plus Plus
ijskiwanoslagroomsuikertequilaijsaardbeienpernodpepermangoaardbeienzure room
0.150.50.3101
0.2502
0.5500.4
Ingredient
naamliterstuksdecilitergramkilogrameetlepeltheelepel
Eenheid
naam eenheid energiePEijskiwanoslagroomsuikertequilaaardbeienpernodpepermangozure roombanaan
literstuksdecilitergrameetlepelgrameetlepel
stuksdeciliterstuks
160040336430
0.2535
8019540
naam energiePPbereidingstijdbereidingswijzeCoupe KiwanoGlace TerraceMango Plus Plus
431403131
2058
Schil ...Neem ...Snijd ...
Gerecht
20bij: Relationele databases en SQL ©Mattic b.v.
relatie = ‘tabel’
Databasestructuur: strokendiagram
Gerecht
Ingredient
Product
Eenheid
naam /energiePPbereidingstijdbereidingswijze
naam eenheid°energiePE
gerechtproducthoeveelheidPPvolgnr
naam
21bij: Relationele databases en SQL ©Mattic b.v.
‘Tabel’ versus ‘relatie’
‘tabel’ in de zin van ‘relatie’:• volgorde rijen en van kolommen niet van belang• er zijn géén gelijke rijen, ook al noteer je ze meervoudig
naam energiePPbereidingstijdCoupe KiwanoGlace TerraceMango Plus Plus
431403131
2058
GerechtenergiePPbereidingstijd naam
131403431403
85205
Mango Plus PlusGlace TerraceCoupe KiwanoGlace Terrace
Gerecht
=
22bij: Relationele databases en SQL ©Mattic b.v.
Informatie als verwoording van gegevens
vier ‘informatie-atomen’: Atomaireinformatie
naam energiePPbereidingstijdbereidingswijzeCoupe Kiwano 431 20 Schil ...
Gerecht
Er bestaat één gerecht met de naam 'Coupe Kiwano'
gerecht Coupe Kiwano heeft energiewaarde 431 kcal per persoon
gerecht Coupe Kiwano heeft bereidingstijd 20 minuten
gerecht Coupe Kiwano heeft bereidingswijze 'Schil ...'
23bij: Relationele databases en SQL ©Mattic b.v.
Hoofdstuk 2:Hoofdstuk 2:
Relationele Relationele databases: regelsdatabases: regels
In dit hoofdstuk ….
• Optionele kolommen• Uniciteitsregels• Sleutels• De referentiële integriteitsregel• Refererende actieregels• Transacties• Recursieve verwijzingen
25bij: Relationele databases en SQL ©Mattic b.v.
Optionelekolommen (1)
Een null: speciaal soortwaarde (indicator datgeen gewone waarde isingevuld)Optionele kolom magnulls bevatten.
Product
gerecht product hoeveelheidPPCoupe KiwanoCoupe KiwanoCoupe KiwanoCoupe KiwanoCoupe KiwanoGlace TerraceGlace TerraceGlace TerraceGlace TerraceMango Plus PlusMango Plus PlusMango Plus Plus
ijskiwanoslagroomsuikertequilaijsaardbeienpernodpepermangoaardbeienzure room
0.150.50.3101
0.2502
0.5500.4
Ingredient
naamliterstuksdecilitergramkilogrameetlepeltheelepel
Eenheid
naam eenheidenergiePEijskiwanoslagroomsuikertequilaaardbeienpernodpepermangozure roombanaan
literstuksdecilitergrameetlepelgrameetlepel
stuksdeciliterstuks
160040336430
0.2535
8019540
naam energiePPbereidingstijdbereidingswijzeCoupe KiwanoGlace TerraceMango Plus Plus
431403131
2058
Schil ...Neem ...Snijd ...
Gerecht
nulls
26bij: Relationele databases en SQL ©Mattic b.v.
Optionele kolommen (2)
Optionele kolom in strokendiagram: o
Gerecht
Ingredient
Product
Eenheid
naam /energiePP°bereidingstijdbereidingswijze
naam eenheid°energiePE°
gerechtproducthoeveelheidPP°volgnr
naam
afleidbarekolom
27bij: Relationele databases en SQL ©Mattic b.v.
Gerecht
Ingredient
Product
Eenheid
naam /energiePP°bereidingstijdbereidingswijze
naam eenheid°energiePE°
gerechtproducthoeveelheidPP°volgnr
naam
Uniciteitsregels (1)
Onder uniciteitspijl is meervoudig voorkomende waarden(waardencombinatie) niet toegestaan.
Coupe Kiwano .. .. ..Coupe Kiwano .. .. ..… .. .. ..
Coupe Kiwano ijs .. ..Coupe Kiwano ijs .. .. .. .. .. ..
overtredingenvan uniciteits-regel
28bij: Relationele databases en SQL ©Mattic b.v.
Uniciteitsregels (2)
Een uniciteitspijl kan nooit ‘binnen’ een bredere uniciteitspijlzitten: alleen de meest strenge regel wordt genoteerd.
Gerechtnaam /energiePP°bereidingstijdbereidingswijze
29bij: Relationele databases en SQL ©Mattic b.v.
Illustratieve populatie
Een illustratieve populatie voldoet aan alle regels, maarillustreert ook wat is toegestaan.De populatie hierboven illustreert bv. dat voor de afzonderlijkekolommen gerecht en product géén uniciteitsregel geldt.
Ingredientgerecht product hoeveelheidPP°
Coupe KiwanoCoupe KiwanoGlace Terrace
ijskiwanoijs
0.150.50.2
30bij: Relationele databases en SQL ©Mattic b.v.
Sleutels
primaire sleutel = kolom of kolomcombinatie waarvoor geldt: 1. verplicht; 2. met (meest strenge) uniciteitsregel; 3. aangewezen als logisch adres van een rij voor
verwijzingen naar die rij
verwijssleutel =
kolom (of kolomcombinatie)waarvan waarden(of waardencombinaties)verwijzen naar andere rijen(via de primaire sleuteldaarvan)
Gerecht
Ingredient
Product
Eenheid
p
p
p
p
naam /energiePP°bereidingstijdbereidingswijze
naam eenheid°energiePE°
gerechtproducthoeveelheidPP°volgnr
naam
31bij: Relationele databases en SQL ©Mattic b.v.
Primaire ‘sloten’ ?
gerecht product hoeveelheidPPCoupe KiwanoCoupe KiwanoCoupe KiwanoCoupe KiwanoCoupe KiwanoGlace TerraceGlace TerraceGlace TerraceGlace TerraceMango Plus PlusMango Plus PlusMango Plus Plus
ijskiwanoslagroomsuikertequilaijsaardbeienpernodpepermangoaardbeienzure room
0.150.50.3101
0.2502
0.5500.4
naam eenheid energiePE ijs kiwano slagroom suiker tequila aardbeien pernod peper mango zure room banaan
literstuksdecilitergrameetlepelgrameetlepel
stuksdeciliterstuks
160040336430
0.2535
8019540
Product
enz.
Ingredient
32bij: Relationele databases en SQL ©Mattic b.v.
Referentiële integriteitsregel
Referentiële integriteitsregel:Elke waarde van een verwijzende sleutel moet voorkomen alswaarde van de bijbehorende primaire sleutel.
Dus:Als in kindtabel een verwijzende waarde is ingevuld, moet diewaarde voorkomen in de oudertabel (als waarde van de primairesleutel).
Product
Eenheid
p
p
naam eenheid°energiePE°
naam oudertabel
kindtabel
33bij: Relationele databases en SQL ©Mattic b.v.
Cardinaliteitsregels
Je leest de cardinaliteit aan de andere kant van het lijntje !
G e re ch t
I n g re die n t
Pro du ct
Ee n h e id
0 o f 1p r e c ie s 10 o f m e e r
1 o f m e e r
b i j é é n P r o d u c t - r i j h o r e n 0 o f 1 E e n h e id - r i je n
b i j é é n E e n h e id - r i j h o r e n 0 o f m e e r P r o d u c t - r i j e n
34bij: Relationele databases en SQL ©Mattic b.v.
(Groot)ouder-(klein)kind
G e re ch t
I n g re die n t
Pro du ct
Ee n h e idouder
kind ouder
kind(kleinkind)
(grootouder)
ouder
kind
35bij: Relationele databases en SQL ©Mattic b.v.
Ouder-kind: relatief t.o.v. verwijzing
Tekenconventie: ouder boven, kind onder, indien mogelijk
123
AmsterdamRotterdamHaarlem
130124130
123124128130135
Dolstrade BoerMierBakkerCupido
122
3
p
pnr naam filiaal°
nr plaats regiomanager°
Werknemer
Filiaal
Werknemer
Filiaalis werk-zaam bij
heeft alsregiomanager
ouder
kind
kind
ouder
36bij: Relationele databases en SQL ©Mattic b.v.
37
Kunstmatige sleutels
- meestal numeriek (daarmee kun je snel zoeken en sorteren) - vaak alleen in database, niet zichtbaar in eindgebruikersapplicatie.
bij: Relationele databases en SQL ©Mattic b.v.
Ingredient
Product
Eenheidp
p
p
Gerechtpid naam/energiePP°bereidingstijdbereidingswijze
naam
id naam eenheid°energiePE°
gerechtproducthoeveelheidPP°
Kunstmatige sleutels:
Alternatieve sleutelsprimaire sleutel
alternatieve sleutel
Ingredient
Product
Eenheid
a
p
p
p
Gerechtapid naam/energiePP°bereidingstijdbereidingswijze
naam
id naam eenheid°energiePE°
gerechtproducthoeveelheidPP°
38bij: Relationele databases en SQL ©Mattic b.v.
Kandidaatsleutels en supersleutel
kandidaatsleutel = kolom of kolomcombinatie waarvoor geldt: 1. verplicht 2. met (zo zuinig mogelijke) uniciteitsregel.
Als er meerdere kandidaatsleutels zijn wordt één ervan gekozenals primaire sleutel. De andere is (of zijn) dan per definitie eenalternatieve sleutel.
supersleutel = kandidaatsleutel of omvattende kolomcombinatie
39bij: Relationele databases en SQL ©Mattic b.v.
Refererende actieregels
De refererende actieregels moeten zorgen dat de referentiëleintegriteitsregel blijft gelden wanneer je een rij verwijdert, ofwanneer je een primaire-sleutelwaarde wijzigt:
Voor een verwijzing geldt altijd één van de delete-regels:– restricted delete– cascading delete– nullifying delete
… en één van de update-regels:– restricted update– cascading update– nullifying update
40bij: Relationele databases en SQL ©Mattic b.v.
Restricted delete
Ingredient
poging tot deletevan ouderrij ...
... mislukt wanneer er nogéén of meer corresponderendekindrijen bestaan.
Productnaam eenheidenergiePE
ijskiwanoslagroomsuikertequilaaardbeienpernodpepermangozure roombanaan
literstuksdecilitergrameetlepelgrameetlepel
stuksdeciliterstuks
160040336430
0.2535
8019540
gerecht product hoeveelheidPPCoupe KiwanoCoupe KiwanoCoupe KiwanoCoupe KiwanoCoupe KiwanoGlace TerraceGlace TerraceGlace TerraceGlace TerraceMango Plus PlusMango Plus PlusMango Plus Plus
ijskiwanoslagroomsuikertequilaijsaardbeienpernodpepermangoaardbeienzure room
0.150.50.3101
0.2502
0.5500.4
rdrestricteddelete
41bij: Relationele databases en SQL ©Mattic b.v.
Transacties
Commit: opdracht om opdrachten definitief uit te voeren.Rollback: opdracht om opdrachten ongedaan te maken.Transactie: reeks opdrachten die als geheel worden uitgevoerd (of in hun geheel ongedaan worden gemaakt).
Na een succesvolle transactie is aan alle databaseregels voldaan! Ofwel: de database is dan integer.
v o lto o id e tr an s ac tie
t o es t and na vo rigecom m it m o m en t
t o es t an d n a n ieu wco m m it m o m en t
o n v o lto o id e tr an s ac tie
t o es t an d n a laat s t eco m m it m o m en t= t eru gkeert o es t an d n a ro llb ack
ro llb ac k
vindt vaakautomatisch plaats
42bij: Relationele databases en SQL ©Mattic b.v.
Cascading delete
gerecht product hoeveelheidPPCoupe KiwanoCoupe KiwanoCoupe KiwanoCoupe KiwanoCoupe KiwanoGlace TerraceGlace TerraceGlace TerraceGlace TerraceMango Plus PlusMango Plus PlusMango Plus Plus
ijskiwanoslagroomsuikertequilaijsaardbeienpernodpepermangoaardbeienzure room
0.150.50.3101
0.2502
0.5500.4
Ingredient
naam energiePPbereidingstijdbereidingswijzeCoupe KiwanoGlace TerraceMango Plus Plus
431403131
2058
Schil ...Neem ...Snijd ...
Gerecht
poging tot deletevan ouderrij ...
... heeftpoging tot deletevan corresponderendekindrijen tot gevolg.Deze poging slaagt, indit geval.
cd
43bij: Relationele databases en SQL ©Mattic b.v.
Cascading update
gerecht product hoeveelheidPPCoupe KiwanoCoupe KiwanoCoupe KiwanoCoupe KiwanoCoupe KiwanoGlace TerraceGlace TerraceGlace TerraceGlace TerraceMango Plus PlusMango Plus PlusMango Plus Plus
ijskiwanoslagroomsuikertequilaijsaardbeienpernodpepermangoaardbeienzure room
0.42
2.5304
0.2502
12001.5
Ingredient
naam energiePPbereidingstijdbereidingswijzeCoupe KiwanoGlace TerraceMango Plus Plus
419403105
2058
Schil ...Neem ...Snijd ...
Gerecht
poging tot updatevan primaire sleutel ...
... heeftpoging tot updatevan verwijzende sleutel-waarden tot gevolg.Deze poging slaagt, in ditgeval.
Coupe Reijnders
Coupe ReijndersCoupe ReijndersCoupe ReijndersCoupe Reijnders
cu
44bij: Relationele databases en SQL ©Mattic b.v.
Update- en deleteregels in Toetjesboek-database
Gerecht
Ingredient
Product
Eenheid
p
p
p
p
naam /energiePP°bereidingstijdbereidingswijze
naam eenheid°energiePE°
gerechtproducthoeveelheidPP°
naam
cd, cu
rd, cu
rd, cu
45bij: Relationele databases en SQL ©Mattic b.v.
Samengestelde sleutel
a
student cursus datump Inschrijving
p
Tentamenstudent cursus volgnr datum
a b
student cursus datum1111222344
I IDWDBIMI I
DWIMI II IDB
12-jan-2012 19-jan-2012 18-mrt-2012 20-jun-2012 12-jan-2012 12-jan-2012 26-jan-2012 16-jan-2012 20-jan-2012 29-feb-2012
Inschrijving
student cursusvolgnr datum1111224
I IDWDBDBIMIMDB
1112121
17-apr-2012 17-apr-2012 19-apr-2012 15-jun-2012 06-apr-2012 11-jun-2012 26-jun-2012
Tentamen
46bij: Relationele databases en SQL ©Mattic b.v.
Recursieve verwijzing
Docentp
DATCODBAC
C.Date E.Codd C.Bachman
COD
DAT
a b
Regel:Een docent mag niet zichzelfvervangen
Docentvervangera
acr naam vervanger°
Vervangeracr naam vervangerDATCODBAC
C.Date E.Codd C.Bachman
COD
DAT
Docentacr naam vervangerDATCODBAC
C.Date E.Codd C.Bachman
COD
DAT
zelfde tabel
47bij: Relationele databases en SQL ©Mattic b.v.
Veel-veel associatie van tabel met zichzelf
• veel-veel associatie tussen tabel Cursus en zichzelf:“cursus … eist als voorkennis cursus …”
code naam examinatorI I
DWDBIMSW
Inleiding informatica Discrete wiskunde Databases Informatiemodelleren Semantic web
BACDATCODDAT
Cursus
cursusvoorkennisDBDBIMSW
I IDWDBDB
Voorkenniseis
Cursusp
cursus voorkennisp Voorkenniseis
a b
cd
acode naam examinator°
48bij: Relationele databases en SQL ©Mattic b.v.
Veel-veel associatie van tabel met andere tabel
• veel-veel associatie tussen tabellen Docent en Cursus:“docent … is begeleider van cursus …”
code naam examinator°Cursusp
acr naamDocentp
docent cursusp Begeleider
cd
49bij: Relationele databases en SQL ©Mattic b.v.
Niet-sleutelverwijzing
Student
p Constraints:- beginpostcode <= eindpostcode- disjuncte intervallen
p
Plaatsnaam beginpostcodeeindpostcode
nr ... postcode huisnr
naam beginpostcodeeindpostcodeAmsterdamUtrecht
1000AA3200AA
1199ZZ3800ZZ
Plaats
nr ... postcodehuisnr12345
...
...
...
...
...
1018KL
3345PZ1045AF1079LN
17
1805
868
Student
50bij: Relationele databases en SQL ©Mattic b.v.
De OpenSchool-database Vakgroep
Studentnr naam mentor°
student cursusdatum/cijfer° vrijstelling°
Cursus
p
p p
Inschrijving
Docentp
docent cursusp
cursusvoorkennisp
Begeleider Voorkenniseis
p
Tentamen
cd
studentcursusvolgnrdatum cijfer°
cd
acode naamuren creditsexaminator°
aacr naam vervanger°vakgroep
p acode naam
a51bij: Relationele databases en SQL ©Mattic b.v.
Hoofdstuk 3:Hoofdstuk 3:
Communiceren met Communiceren met een relationele een relationele databasesdatabases
In dit hoofdstuk ….
• applicatie en database: Toetjesboek• SQL select-query’s• select-query’s op meer dan één tabel: joins• tabelinhouden wijzigen: insert-, delete- en update-
query’s• demonstratie Boekverkenner, SQL-tool en applicatie
53bij: Relationele databases en SQL ©Mattic b.v.
Nogmaals: Toetjesboek (eindgebruikersapplicatie)
54bij: Relationele databases en SQL ©Mattic b.v.
Toetjesboek: vragen
• Welke gegevens zijn berekenbaar uit andere gegevens?• Welke gegevens moeten worden opgeslagen?
– Zijn daar ook gegevens bij die niet zichtbaar zijn in het Gerechten-venster?
• Zijn er gegevens die zeker niet worden opgeslagen?• Voor welke gegevens is keuze mogelijk?
– Wat zijn de consequenties van die keuze?
55bij: Relationele databases en SQL ©Mattic b.v.
56
naam /energiePPbereidingstijdbereidingswijzeCoupe KiwanoGlace TerraceMango Plus Plus
431403131
2058
Schil ...Neem ...Snijd ...
Gerecht
gerecht product hoeveelheidPPvolgnrCoupe KiwanoCoupe KiwanoCoupe KiwanoCoupe KiwanoCoupe KiwanoGlace TerraceGlace TerraceGlace TerraceGlace TerraceMango Plus PlusMango Plus PlusMango Plus Plus
ijskiwanoslagroomsuikertequilaijsaardbeienpernodpepermangoaardbeienzure room
0.150.50.3101
0.2502
0.5500.4
123451234123
Ingredient
Productnaam eenheid energiePE
ijskiwanoslagroomsuikertequilaaardbeienpernodpepermangozure roombanaan
literstuksdecilitergrameetlepelgrameetlepel
stuksdeciliterstuks
1600403364
300.2535
8019540
56bij: Relationele databases en SQL ©Mattic b.v.
Een SQL-select query
57bij: Relationele databases en SQL ©Mattic b.v.
select naam, energiePP -- 3from Gerecht -- 1where bereidingstijd < 30 -- 2order by energiePP -- 4
1. Ga uit van tabel Gerecht: alle rijen2. Verwijder de rijen die niet aan de conditie voldoen3. Geef voor elke rij die nog over is: gerechtnaam en energiePP4. Orden de rijen op volgorde van energiePP
Selectquery op meerdan één tabel: join
(b)
(a)
gerecht product hoeveelheidPPvolgnrCoupe KiwanoCoupe KiwanoCoupe KiwanoCoupe KiwanoCoupe KiwanoGlace TerraceGlace TerraceGlace TerraceGlace TerraceMango Plus PlusMango Plus PlusMango Plus Plus
ijskiwanoslagroomsuikertequilaijsaardbeienpernodpepermangoaardbeienzure room
0.150.50.3101
0.2502
0.5500.4
123451234123
naam eenheidenergiePEijskiwanoslagroomsuikertequilaaardbeienpernodpepermangozure roombanaan
literstuksdecilitergrameetlepelgrameetlepel
stuksdeciliterstuks
160040336430
0.2535
8019540
Product
enz.
en Productjoin van Ingredient
Ingredient
gerecht producthoeveelheidPPvolgnr Product.eenheid
Product.energiePE
Coupe KiwanoCoupe KiwanoCoupe KiwanoCoupe KiwanoCoupe KiwanoGlace TerraceGlace TerraceGlace TerraceGlace TerraceMango Plus PlusMango Plus PlusMango Plus Plus
ijskiwanoslagroomsuikertequilaijsaardbeienpernodpepermangoaardbeienzure room
0.150.50.3101
0.2502
0.5500.4
123451234123
literstuksdecilitergrameetlepellitergrameetlepel
stuksgramdeciliter
160040336430
16000.2535
800.25195
join van Ingredient en Product:verbreding van Ingredientmet de niet-sleutelkolommenvan Product, via de verwijssleutel
58bij: Relationele databases en SQL ©Mattic b.v.
De join in SQL
Joinquery in SQL:
select Ingredient.gerecht, Ingredient.product, Ingredient.hoeveelheidPP, Ingredient.volgnr, Product.eenheid, Product.energiePEfrom Ingredient join Product on Ingredient.product = Product.naam
alle rijen van Ingredient gecombineerd met allebijbehorende rijen van Product, via de verwijssleutel
alle kolommen van de combinatie,behalve de primaire sleutel van Product
Korter, met ‘tabelaliassen’:
select I.gerecht, I.product, I.hoeveelheidPP, I.volgnr, P.eenheid, P.energiePEfrom Ingredient I join Product P on I.product = P.naam
59bij: Relationele databases en SQL ©Mattic b.v.
Tabelinhouden wijzigen
• Wijzigen van een tabelinhoud:– toevoegen van een rij (insert)– verwijderen van een rij (delete)– wijzigen van een bestaande rij (update)
60bij: Relationele databases en SQL ©Mattic b.v.
Insert
Voorbeeld: voeg het product ‘goudrenetten’ toe, gemetenin pond en met een energiewaarde van 330 kcal per pond.
Oplossing:
insert into Eenheid values ('pond');insert into Product values ('goudrenetten', 'pond', 330)
Ga na: zonder de eerste opdracht krijg je een foutmelding(overtreding van de referentiële integriteitsregel)
61bij: Relationele databases en SQL ©Mattic b.v.
Delete
Voorbeeld: verwijder het gerecht ‘banaan’.
Oplossing:
delete -- 3from Product -- 1where naam = ‘banaan’ -- 2
62bij: Relationele databases en SQL ©Mattic b.v.
Opgaven• Voorspel wat er gebeurt
bij een poging het product‘mango’ te verwijderen.
• Voorspel wat er gebeurtbij een poging het gerecht‘Mango Plus Plus’ teverwijderen.
Gerecht
Ingredient
Product
Eenheid
p
p
p
p
naam /energiePP°bereidingstijdbereidingswijze
naam eenheid°energiePE°
gerechtproducthoeveelheidPP°
naam
cd, cu
rd, cu
rd, cu
Zie ook de populatie, in boekof de Voorbeeldverkenner
Update
Voorbeeld: wijzig de energie per eenheid van goudrenetten in 550.
Oplossing:
update Product -- 1set energiePE = 550 -- 3where naam = 'goudrenetten' -- 2
toekenning
test op gelijkheid (resultaat ‘waar’ of ‘onwaar’)
Opgave• Voorspel wat er gebeurt bij een poging om in tabel Gerecht de naam
‘Coupe Kiwano’ te wijzigen in ‘Coupe Reijnders’.
63bij: Relationele databases en SQL ©Mattic b.v.
Triggers en scripts
• Waarden van Gerecht.energiePP worden automatisch berekend via triggers.
• Triggers zijn kleine programma’s die kunnen worden gekoppeld aan een insert, delete of update (of een poging daartoe)
Opgaven• Raadpleeg het create-script van Toetjesboek en zoek de create trigger-
opdrachten.• Probeer het script globaal te begrijpen.• Raadpleeg het insert-script van Toetjesboek en probeer dit globaal te
begrijpen.
Inserts, deletes en updates worden in detail behandeld in hoofdstuk 10.Triggers worden behandeld in hoofdstuk 16.
64bij: Relationele databases en SQL ©Mattic b.v.
65
Demonstratie Boekverkenner, SQL-tool en applicatie
bij: Relationele databases en SQL ©Mattic b.v.
• Toetjesboek-applicatie– doet het niet zonder geïnstalleerde Toetjesboek-database!– Toetjesboek-database installeren via Boekverkenner– Toetjesboek-applicatie verkennen– let op SQL-verkeer van en naar de SQL-server!
• Interactive Query Utility (IQU)– SQL-query vanuit IQU
• Boekverkenner– dababases installeren en de-installeren– inloggen op database– navigeren door de boektekst– SQL-query uitvoeren vanuit de boektekst– de Voorbeeldnavigator
Hoofdstuk 4:Hoofdstuk 4:
NullsNulls
In dit hoofdstuk ….
• de aard van nulls• nulls en de lege string• Codd-relationaliteit• logische algebra: twee- en driewaardige logica
67bij: Relationele databases en SQL ©Mattic b.v.
De OpenSchool-database Vakgroep
Studentnr naam mentor°
student cursusdatum/cijfer° vrijstelling°
Cursus
p
p p
Inschrijving
Docentp
docent cursusp
cursusvoorkennisp
Begeleider Voorkenniseis
p
Tentamen
cd
studentcursusvolgnrdatum cijfer°
cd
acode naamuren creditsexaminator°
aacr naam vervanger°vakgroep
p acode naam
a68bij: Relationele databases en SQL ©Mattic b.v.
De aard van nulls
• Null: speciale waarde– indicator voor niet-ingevulde ‘echte’ waarde
studentcursus datum cijfer vrijstelling1111222344
I IDWDBIMI I
DWIMI II IDB
12-jan-2012 19-jan-2012 18-mrt-2012 20-jun-2012 12-jan-2012 12-jan-2012 26-jan-2012 16-jan-2012 20-jan-2012 29-feb-2012
758
5
NNNNJJN
JN
Inschrijving
: nulls
betekenis:onbekend ofniet-van-toepassing
69bij: Relationele databases en SQL ©Mattic b.v.
Rekenen met null
Optellen met null-operand
select cijfer + 1 from Inschrijving
Resultaat:
ADD============== 8 6 9 <NULL> <NULL> <NULL> 6 <NULL> <NULL> <NULL>
70bij: Relationele databases en SQL ©Mattic b.v.
Null en de lege string (1)
• lege string (= string van lengte 0): is dat een null?– blijkt afhankelijk van de database (bv. Oracle of Firebird)
'string' string van lengte6'strin' string van lengte5'stri' string van lengte4'str' string van lengte3'st' string van lengte2's' string van lengte1'' string van lengte 0 of null?
71bij: Relationele databases en SQL ©Mattic b.v.
Null en de lege string (2)
• een lege string in Firebird is géén null!• vergelijk gedrag bij concatenatie:
'Inge' || null null
(onbekend!) (onbekend!)
'Inge' || '' 'Inge'
72bij: Relationele databases en SQL ©Mattic b.v.
Selecteren op null
Inschrijvingen waarvoor geen cijfer is ingevuld:
select *from Inschrijvingwhere cijfer is null
Inschrijvingen waarvoor wel een cijfer is ingevuld:
select *from Inschrijvingwhere cijfer is not null
73bij: Relationele databases en SQL ©Mattic b.v.
of: not(cijfer is null)
Codd-relationaliteit
• In een Codd-relationele database is elke kolom van een primaire sleutel verplicht.
• Voorbeeld niet-Codd-relationele tabel:
naam toonhoogte°docentInstrumentp
pianofluitfluitvioolvioolgitaarsaxofoonsaxofoonsaxofoondrums
alt
alt
alttenorsopraan
Richterde Quantde QuantGrubertBashevde LuciaParkerBakerParkerBennink
74bij: Relationele databases en SQL ©Mattic b.v.
Logische algebra
• logische algebra: ‘rekenen’ met logische waarden• logische waarden:
– in tweewaardige logica: true en false– in tweewaardige logica: true, false en unknown
• voorbeelden van logische expressies:– 1+1 = 2 levert true– 1+1 = 1 levert false– 1+null = 1 levert unknown
• NB. where unknown heeft hetzelfde effect als where false!
75bij: Relationele databases en SQL ©Mattic b.v.
Opgave
Voorspel het effect van:
a)
b)
c)
select *from Inschrijvingwhere cijfer = nullselect *from Inschrijvingwhere null = null
studentcursus datum cijfer vrijstelling1111222344
I IDWDBIMI I
DWIMI II IDB
12-jan-2012 19-jan-2012 18-mrt-2012 20-jun-2012 12-jan-2012 12-jan-2012 26-jan-2012 16-jan-2012 20-jan-2012 29-feb-2012
758
5
NNNNJJN
JN
Inschrijvingselect *from Inschrijvingwhere cijfer is null
76bij: Relationele databases en SQL ©Mattic b.v.
Tweewaardige logica
• operatoren: not, and en or• rekenregels:
NB: or = ‘en/of’
77bij: Relationele databases en SQL ©Mattic b.v.
Prioriteit operatoren
• 1. not 2. and 3. or• Vergelijk:
• en:
select student, cursus, cijfer, vrijstellingfrom Inschrijvingwhere not(vrijstelling = 'J' or cijfer > 5)
select student, cursus, cijfer, vrijstellingfrom Inschrijvingwhere not vrijstelling = 'J' or cijfer > 5
78bij: Relationele databases en SQL ©Mattic b.v.
Regels van De Morgan
• Voorbeeld 1e regel:
is equivalent met:
• Vraag: welke haakjes mogen weg?
select student, cursus, cijfer, vrijstellingfrom Inschrijvingwhere not(vrijstelling = 'J' or cijfer > 5)
select student, cursus, cijfer, vrijstellingfrom Inschrijvingwhere not(vrijstelling) = 'J‘) and not(cijfer > 5)
79bij: Relationele databases en SQL ©Mattic b.v.
Driewaardige logica
• rekenregels:
• waarom?– zijn deze regels
aannemelijk temaken?
80bij: Relationele databases en SQL ©Mattic b.v.
Voorbeeld
• Select-query:
geeft als resultaat alle inschrijvingen met vrijstelling = ‘J’ (ongeacht het cijfer en of dat is ingevuld) en alle inschrijvingen met cijfer > 5 (ongeacht de waarde van vrijstelling en of die is ingevuld)
select student, cursus, cijfer, vrijstellingfrom Inschrijvingwhere vrijstelling = 'J' or not cijfer <= 5
81bij: Relationele databases en SQL ©Mattic b.v.
Hoofdstuk 5:Hoofdstuk 5:
NormalisatieNormalisatie
In dit hoofdstuk ….
• normaalvormen• herhalende groepen en de eerste normaalvorm (1NV)• functionele afhankelijkheid en de tweede en derde
normaalvormen (2NV en 3NV)• de Boyce-Codd-normaalvorm• nabeschouwing: wat is normaliseren en wat is het niet?
• voor liefhebbers: 4NV en 5NV op relsql.nl
83bij: Relationele databases en SQL ©Mattic b.v.
Normaalvormen
• Een normaalvorm is een bepaalde gewenste tabelstructuur, waarin een (door die normaalvorm verboden) situatie niet optreedt.
• eerste normaalvorm (1NV)– verbod op herhalende groepen
• tweede en derde normaalvorm (2NV en 3NV)– verbod op bepaalde vormen van redundantie (overtolligheid van
gegevens)
• Boyce-Codd-normaalvorm– verbiedt nog net wat meer dan 3NV (maar is wat problematisch …)
• Deze normaalvormen worden steeds strenger: er wordt steeds wat meer verboden
84bij: Relationele databases en SQL ©Mattic b.v.
Niet-genormaliseerde tabel
• een tabel met drie kolommen:
• derde kolom is gestructureerd (herhalende groep)• de herhalende groep heeft in elke cel een (deel)tabel• 1NV verbiedt herhalende groepen (niet-relationeel!)• niet-genormaliseerd = niet-1NV !
Student
naamgeslacht cursussencursus studiepunten datum inschrijvingstypetarief
Jan m wiskundenatuurkunde
23
25-aug-201225-aug-2012
RR
300300
Eva v wiskunde 2 26-aug-2012 T 150
85bij: Relationele databases en SQL ©Mattic b.v.
(R=regulier; T= tentamenstudent)
Van niet-genormaliseerd naar 1NV (1)
Student
naamgeslacht cursussencursus studiepunten datum inschrijvingstypetarief
Jan m wiskundenatuurkunde
23
25-aug-201225-aug-2012
RR
300300
Eva v wiskunde 2 26-aug-2012 T 150
student cursus studiepuntendatum inschrijvingstypetarief
naam geslachtStudentp
p Inschrijving
JanJanEva
wiskundenatuurkundewiskunde
232
25-aug-201225-aug-201226-aug-2012
RRT
300300150
JanEva
mv
‘afsplitsen’ herhalende groep
86bij: Relationele databases en SQL ©Mattic b.v.
Functionele afhankelijkheid (FA)
• als je de cursus weet, weet je het aantal studiepunten:
Synoniemen:• cursus determineert studiepunten• studiepunten wordt gedetermineerd door cursus• studiepunten is functioneel afhankelijk van cursus
87bij: Relationele databases en SQL ©Mattic b.v.
student cursus studiepuntendatum inschrijvingstypetarief
naam geslachtStudentp
p Inschrijving
JanJanEva
wiskundenatuurkundewiskunde
232
25-aug-201225-aug-201226-aug-2012
RRT
300300150
JanEva
mv
FA
Nog een FA
• tarief is functioneel afhankelijk van inschrijvingstype
• Dit spreekt niet vanzelf: je moet hiervoor weten dat het tarief niet óók afhankelijk is van de cursus!
• Dit moet dus gegeven zijn, een voorbeeldpopulatie is niet voldoende (waarom niet?)
student cursus studiepuntendatum inschrijvingstypetarief
naam geslachtStudentp
p Inschrijving
JanJanEva
wiskundenatuurkundewiskunde
232
25-aug-201225-aug-201226-aug-2012
RRT
300300150
JanEva
mv
FAFA
88bij: Relationele databases en SQL ©Mattic b.v.
Triviale FA’s (1)
• Alle kolommen zijn functioneel afhankelijk van de primaire sleutel!
• Waarom?
student cursus studiepuntendatum inschrijvingstypetarief
naam geslachtStudentp
p Inschrijving
FAFA
FAFA
FA
89bij: Relationele databases en SQL ©Mattic b.v.
Triviale FA’s (2)
• Elke kolom(combinatie) is functioneel afhankelijk van zichzelf
• Elke combinatie is functioneel afhankelijk van een combinatie waar hij deel van uitmaakt
• Triviale functionele afhankelijkheden zijn niet interessant!
90bij: Relationele databases en SQL ©Mattic b.v.
• Niet de FA’s zijn de boosdoener (die zijn ze zoals ze zijn), maar de structuur.
• We transformeren de structuur, zó dat de FA’s triviaal worden.
Redundantie door niet-triviale FA’s
91bij: Relationele databases en SQL ©Mattic b.v.
student cursus studiepuntendatum inschrijvingstypetarief
naam geslachtStudentp
p Inschrijving
JanJanEva
wiskundenatuurkundewiskunde
232
25-aug-201225-aug-201226-aug-2012
RRT
300300150
JanEva
mv
FAFA
Overtredingen van 2NV en 3NV
92bij: Relationele databases en SQL ©Mattic b.v.
student cursus studiepuntendatum inschrijvingstypetarief
naam geslachtStudentp
p Inschrijving
FAFA
overtreding van 2NV
partiële sleutelafhankelijkheid:niet-sleutelkolom* diefunctioneel afhankelijkis van een echt deel vaneen kandidaatsleutel* (of kolomcombinatie)
overtreding van 3NV
transitieve sleutelafhankelijkheid:niet -sleutelkolom* diefunctioneel afhankelijk isvan een determinant diegeen kandidaatsleutel isen ook geen deel daarvan
Transformatie: van niet-2NV naar 2NV
FA
A B ... C ...
93bij: Relationele databases en SQL ©Mattic b.v.
A B ... ...
B Cp
situatie verboden door2NV (uitgaande van 1NV):
transformatie naar 2NV:‘afsplitsen van FA’
NB. De FA is er nog steeds, maar nu als triviale FA in de (nieuwe) oudertabel.Je zou kunnen zeggen: ‘de FA heeft een eigen tabel gekregen’.
A, B, C, …: kolommenof kolomcombinaties
Toegepast op voorbeeld
student cursus studiepuntendatum inschrijvingstypetarief
naam geslachtStudentp
p Inschrijving
FAFA
94bij: Relationele databases en SQL ©Mattic b.v.
1NV /niet-2NV
student cursus datum inschrijvingstypetarief
naam geslachtStudentp
p Inschrijving
FA
naam studiepuntenCursuspna afsplitsen
FA: 2NV
Transformatie: van 2NV/niet-3NV naar 3NV
FA
A ... B ... C ...
FA
A ... B1 B2 ... C ...
FA
A B1 B2 ... C ...
B C
A ... B ...
B1 B2 C
A ... B1 B2 ...
B1 B2 C
A B1 B2 ...
95bij: Relationele databases en SQL ©Mattic b.v.
Toegepast op voorbeeld
96bij: Relationele databases en SQL ©Mattic b.v.
2NV /niet-3NV
student cursus datum inschrijvingstypetarief
naam geslachtStudentp
p Inschrijving
FA
naam studiepuntenCursusp
Inschrijvingstudent cursus datum inschrijvingstype
p
code tariefp Inschrijvingstype
JanJanEva
wiskundenatuurkundewiskunde
25-aug-201225-aug-201226-aug-2012
EET
naam studiepuntenp Cursus
wiskundenatuurkunde
23
ET
300150
na afsplitsenFA: 3NV
geen redundantiemeer!
Wat wordt verboden door BCNV ?
• Verboden situatie (uitgaande van 1NV):
De Boyce-Codd normaalvorm verbiedt alle niet-triviale functionele afhankelijkheden met niet-unieke determinant.
Dit is een generalisatie van de verboden situaties van 2NV en 3NV(en net iets krachtiger: er wordt nog net iets meer verboden).
FA
... A ... B ...
(niet uniek)
97bij: Relationele databases en SQL ©Mattic b.v.
Voorbeeld
student cursus docentInschrijving
JanJanMichielMichiel
wiskundenatuurkundewiskundenatuurkunde
De BruinDe BruinDe BruinDe Wit
(1)(2)(3)(4)
p
Nu extra aanname: elke docent geeft maar één cursus.Dit geeft een nieuw type FA:
student cursus docent
FA
Inschrijving
Ga na: voorbeeldpopulatie is in strijd met nieuwe regel!
98bij: Relationele databases en SQL ©Mattic b.v.
FA impliceert extra uniciteitsregel
FA
Inschrijving
JanMichielJanAagje
wiskundewiskundenatuurkundewiskunde
De BruinDe BruinDe WitGroen
1student cursus docent
volgt uituniciteitsregel 1en de FA
Ga na dat dit voorbeeld1. voldoet aan 3NV2. niet voldoet aan
BCNV
Dus: kritisch voorbeeldvoor BCNV!
99bij: Relationele databases en SQL ©Mattic b.v.
Van 3NV/niet-BCNV naar BCNV
Toepassen ‘recept’ afsplitsen ongewenste FA:
Merk op:• de FA is in de nieuwe structuur triviaal• uniciteitsregel 1 is verdwenen!
naam cursus
student docent
Docent
Inschrijving
p
p
JanMichielJanAagje
De BruinDe BruinDe WitGroen
De BruinDe WitGroen
wiskundenatuurkundewiskunde
FA
100bij: Relationele databases en SQL ©Mattic b.v.
Waar is uniciteitsregel 1 gebleven?
Vraag:hoe (on)bevre-digend is dit?
Weer toevoegen uniciteitsregel 1 als ‘join-uniciteitsregel’:
d o c e n tn a a m v a kn a a m
c u rs is t n a a m d o c e n tn a a m
D o ce n t
I n s c h rijv in g
J anM ich ielJ anA ag je
D e B ru in D e B ru in D e W it G ro en
D e B ru inD e W i tG ro en
w isk u n d en atu u rk u n d ew isk u n d e
jo in - u n ic i t e i t s r e g e l
101bij: Relationele databases en SQL ©Mattic b.v.
De vierde en de vijfde normaalvorm
• Er zijn nog een vierde (4NV) en een vijfde normaalvorm (5NV)– voor de praktijk minder belangrijk– zie voor een artikel hierover: de boekwebsite relsql.nl
102bij: Relationele databases en SQL ©Mattic b.v.
Voorbeeld met geneste herhalende groep
Student
nr naaminschrijvingen
cursuscode cursusnaam creditsexaminatordatum cijfertentamens
volgnr datum cijfer
1
2
34
Berk
Tack
Bos Eik
I IDWDB
IMI IDWIM
I II IDB
Inleiding informaticaDiscrete wiskundeDatabases
InformatiemodellerenInleiding informaticaDiscrete wiskundeInformatiemodelleren
Inleiding informaticaInleiding informaticaDatabases
80120120
15080120150
8080120
BACDATCOD
DATBACDATDAT
BACBACCOD
12-jan-2012 19-jan-2012 18-mrt-2012
20-jun-2012 12-jan-2012 12-jan-2012 26-jan-2012
16-jan-2012 20-jan-2012 29-feb-2012
758
5
1112
12
1
17-apr-2012 17-apr-2012 19-apr-2012 15-jun-2012
06-apr-2012 11-jun-2012
26-jun-2012
7558
45
Gegeven: • elke student heeft uniek nummer• elke cursus heeft unieke code en naam• cijfer inschrijving is (evt. voorlopig) eindcijfer, berekend uit tentamencijfers
103bij: Relationele databases en SQL ©Mattic b.v.
Afsplitsen ‘buitenste’ herhalende groep
a
Studentnr naam
studentcursuscodecursusnaamcreditsexaminatordatumcijfertentamens
volgnrdatumcijfer
Inschrijving
p
p
Student
nr naaminschrijvingen
cursuscodecursusnaamcreditsexaminatordatum cijfertentamens
volgnr datum cijfer
p
NB1: sleutels zijn in het boek alleen gedefinieerd voor relationele structuur; géén bezwaar ze ook al toe te passen in een structuur met herhalende groep.NB2: kolom student is verwijssleutel en bevat studentnummers.NB3: (student, cursusnaam) is een alternatieve sleutel. Waarom?
104bij: Relationele databases en SQL ©Mattic b.v.
Afsplitsen ‘binnenste’ herhalende groep
a
Studentnr naam
studentcursuscodecursusnaamcreditsexaminator°datumcijfer°p
p
Inschrijving
p
Tentamenstudentcursuscodevolgnrdatum cijfer°
1NV !
Studentnr naam
studentcursuscodecursusnaamcreditsexaminatordatumcijfertentamens
volgnrdatumcijfer
Inschrijving
p
p
105bij: Relationele databases en SQL ©Mattic b.v.
Test 2NV: zijn er FA’s met determinant die deel is van een sleutel?
FAFA
FAniet 2NV!
106bij: Relationele databases en SQL ©Mattic b.v.
a
Studentnr naam
studentcursuscodecursusnaamcreditsexaminator°datumcijfer°p
p
Inschrijving
p
Tentamenstudentcursuscodevolgnrdatum cijfer°
NB: aanpassingkolomnamen aanconventies
Studentnr naam
studentcursusdatumcijfer°
p
Inschrijving
p
Tentamenstudentcursusvolgnrdatumcijfer°
p Cursusacodenaamcreditsexaminator°
p
afsplitsenFA’s: 2NV
Test 3NV: zijn er transitieve FA’s?
107bij: Relationele databases en SQL ©Mattic b.v.
Studentnr naam
studentcursusdatumcijfer°p
p
Inschrijving
p
Tentamenstudentcursusvolgnrdatumcijfer°
p Cursusacodenaamcreditsexaminator°
Nee, die zijn er niet: structuur staat dus ook in 3NV !
Standaardisatiedocent-acroniemen
Studentnr naam
studentcursusdatumcijfer°p
p
Inschrijving
p
Tentamenstudentcursusvolgnrdatumcijfer°
p Cursusacodenaamcreditsexaminator°
Docentpacr
Studentnr naam
studentcursusdatumcijfer°p
p
Inschrijving
p
Tentamenstudentcursusvolgnrdatumcijfer°
p Cursusacodenaamcreditsexaminator°
Examinator-acroniemenzijn in deze structuur niet-gestandaardiseerd
Standaardisatie:via aparte tabel met één kolom,die we niet Examinator, maarDocent noemen.
NB. ‘examinator’ is een rol dieeen docent speelt binnen eencursus. Tabel Docent staat losvan die context.
NB. We zijn nu aan het modelleren, dit is geennormaliseren meer.
108bij: Relationele databases en SQL ©Mattic b.v.
Normalisatie: reikwijdte en beperkingen• Normalisatie is een controlemiddel op gegeven structuren• Normalisatie leidt doorgaans tot een betere structuur
– maar: structuur in 3NV / niet-BCNV (kritisch voorbeeld, in de praktijk overigens zeldzaam) kan beter zijn dan doorgenormaliseerd voorbeeld in BCNV
• Kennis van normalisatie leidt tot goed inzicht in afhankelijkheden tussen gegevens en begrippen als ‘redundantie’ en ‘inconsistentie’
• Normalisatie hoeft niet tot standaardisatie te leiden van bepaalde ‘soorten van dingen’, terwijl dat wel gewenst is
• Normalisatie kijkt alleen naar afzonderlijke tabellen, niet naar de structuur als geheel
• De beginstructuur is allesbepalend; normalisatie kijkt niet naar alternatieven
109bij: Relationele databases en SQL ©Mattic b.v.
Wat is normalisatie niet?
• Normalisatie is geen volwaardige databaseontwerp-methode:
– je kunt pas gaan normaliseren vanuit een gegeven structuur, maar hoe die te vinden is een vak apart
– normalisatie stopt zodra (bepaalde typen) redundante structuren zijn geëlimineerd
– normalisatie leidt veelal niet tot standaardisatietabellen voor bepaalde ‘soorten dingen’
• Voor databaseontwerp bestaan andere (en betere) methoden
110bij: Relationele databases en SQL ©Mattic b.v.
Hoofdstuk 6:Hoofdstuk 6:
Informatie uit één Informatie uit één tabeltabel
In dit hoofdstuk …
• nogmaals: werken met Boekverkenner en IQU• projecties• datatypen• operatoren• functies• selecties• ordening• verzamelingsoperatoren
112bij: Relationele databases en SQL ©Mattic b.v.
OpenSchool Vakgroep
Studentnr naam mentor°
student cursusdatum/cijfer° vrijstelling°
Cursus
p
p p
Inschrijving
Docentp
docent cursusp
cursusvoorkennisp
Begeleider Voorkenniseis
p
Tentamen
cdcd
acode naamuren creditsexaminator°
aacr naam vervanger°vakgroep
p acode naam
a
studentcursusvolgnrdatum cijfer°
113bij: Relationele databases en SQL ©Mattic b.v.
Projecties: select … from
• Bij projectie (‘select’) wordt tabel rij voor rij afgelopen• Voorbeeld:
114bij: Relationele databases en SQL ©Mattic b.v.
select naam as cursus, uren, credits * 28 as ECTS_urenfrom Cursus
Resultaat:
CURSUS UREN ECTS_UREN===================== ========= =================Inleiding informatica 80 84.0 Discrete wiskunde 120 112.0 Databases 120 112.0 Informatiemodelleren 150 140.0 Semantic web 120 112.0
= (kolom)alias
as mag je weglaten!
Projecties: distinct
• Vergelijk:select uren, creditsfrom Cursus
Resultaat:
UREN CREDITS========= ======= 80 3.0 120 4.0 120 4.0 150 5.0 120 4.0
select distinct uren, creditsfrom Cursus
Resultaat:
UREN CREDITS========= ======= 80 3.0 120 4.0 150 5.0
Resultaattabel is niet zuiver relationeel!Een tabel in de zin van relatie is immers een verzameling, dus alle rijen verschillend!Distinct maakt er een verzameling van.
115bij: Relationele databases en SQL ©Mattic b.v.
Datatypen
• Gegevens hebben een datatype (vastgelegd in tabeldefinitie)
116bij: Relationele databases en SQL ©Mattic b.v.
datatypeinteger gehele getallennumeric(n,m)numeric(n)
decimale getallen
char(n) tekst vaste lengtevarchar(n) tekst variabele lengtedatetimetimestamp
datumtijddatum + tijd
blob binary large object (bv. plaatje, geluid)
Operatoren
• operator: ‘token’ voor een bewerking• voorbeelden:
– numerieke operatoren: + - * /– alfanumerieke operator: | |– datum/tijd-operatoren: -– datum/tijd met numeriek: + -
117bij: Relationele databases en SQL ©Mattic b.v.
aantal dagen optellen bij datum/tijd
datums van elkaar aftrekken
stringconcatenatie
Functies
• Functie: voorschrift met een naam om een waarde te berekenen uit andere waarden, de argumenten
• Format is meestal: f(x, y, …)– f is de functienaam– x, y, … zijn de argumenten
• soms wordt de komma vervangen door een ‘betekenisvol’ woord– vb. rekenkundige functie: power (x,y) (x tot de macht y)
– vb. stringfunctie: substring(x from startpos for length)• Er kunnen nul argumenten zijn
– vb.: pi() voor π
118bij: Relationele databases en SQL ©Mattic b.v.
Speciale functies (1): case
119bij: Relationele databases en SQL ©Mattic b.v.
select student, cursus, case when cijfer >= 6 then ‘voldoende’ when cijfer < 6 then ‘onvoldoende’ else ‘ingeschreven’ endfrom Tentamen
Resultaat:
STUDENT CURSUS CASE ======= ====== ============ 1 II voldoende 1 DW onvoldoende 1 DB onvoldoende 1 DB voldoende 2 IM onvoldoende 2 IM onvoldoende 4 DB ingeschreven
Speciale functies (2): iff
select nr, naam, iif(mentor is null, ‘heeft geen mentor’, ‘heeft mentor’)from Student
Resultaat:
NR NAAM CASE ========= ====== ================= 1 Berk heeft mentor 2 Tack heeft mentor 3 Bos heeft mentor 4 Eik heeft geen mentor
120bij: Relationele databases en SQL ©Mattic b.v.
Selecties: where
121bij: Relationele databases en SQL ©Mattic b.v.
select code, naam, credits -- 3: projectiefrom Cursus -- 1: brontabelwhere examinator = ‘DAT’ -- 2: selectie
select code, naam, creditsfrom Cursuswhere examinator = 'DAT'
code naam uren creditsexaminatorII
DWDBIMSW
Inleiding informatica Discrete wiskunde Databases Informatiemodelleren Semantic web
80120120150120
34454
BACDATCODDAT
Cursus
code naam creditsDWIM
Discrete wiskunde Informatiemodelleren
45
Let op: kanverwarrendzijn
Ordening: order by
122bij: Relationele databases en SQL ©Mattic b.v.
Alle inschrijvingen vanaf 15 jan 2012:
select * from Inschrijvingorder by cijfer asc
Resultaat:
STUDENT CURSUS DATUM CIJFER VRIJSTELLING========= ====== =========== ====== ============ 4 II 20-jan-2012 <NULL> J 4 DB 29-feb-2012 <NULL> N 1 IM 20-jun-2012 <NULL> N 3 II 16-jan-2012 <NULL> <NULL> 1 DW 19-jan-2012 5 N 2 IM 26-jan-2012 5 N 1 II 12-jan-2012 7 N 1 DB 18-mrt-2012 8 N
• asc (klimmend ordenen) mag worden weggelaten.• nulls voorop! (databasespecifiek)• dalend ordenen: desc
Verzamelingsoperatoren
• Wiskundige verzamelingsfuncties op twee (rij)verzamelingen A en B:
123bij: Relationele databases en SQL ©Mattic b.v.
A
A
A
B
B
B
B
A union B
A intersectB A except B
A
Verzamelingsfuncties in SQL: de union
124bij: Relationele databases en SQL ©Mattic b.v.
select student, cursus, volgnr, cijferfrom Tentamenwhere volgnr >= 2unionselect student, cursus, volgnr, cijferfrom Tentamenwhere cijfer <= 5
Resultaat:
STUDENT CURSUS VOLGNR CIJFER======= ====== ====== ====== 1 DB 1 5 1 DB 2 8 1 DW 1 5 2 IM 1 4 2 IM 2 5
Vraag: hoe kan dit veel simpeler?
rijverzameling A
A
rijverzameling B
BA union B (‘vereniging’)
Zinvol voorbeeld union
-- eerste pogingenselect student, cursus, datum, ‘eerste poging’ pogingfrom Tentamenwhere volgnr = 1union-- herkansingenselect student, cursus, datum, ‘herkansing’from Tentamenwhere volgnr >= 2
Tentamens met voldoende en tekst ‘eerste poging’ of ‘herkansing’:
Resultaat:
STUDENT CURSUS DATUM POGING ======= ====== =========== ============= 1 DB 19-apr-2012 eerste poging 1 DB 26-jun-2012 herkansing 1 DW 17-apr-2012 eerste poging 1 II 17-apr-2012 eerste poging 2 IM 06-apr-2012 eerste poging 2 IM 11-jun-2012 herkansing 4 DB 26-jun-2012 eerste poging
125bij: Relationele databases en SQL ©Mattic b.v.
Nogmaals: demonstratie Boekverkenner / IQU
• Voorbeelddatabase: OpenSchool– databasediagrammen– scripts
• Installatie van voorbeelddatabase / in- en uitloggen• Uitvoeren van query’s vanuit de tekst• Werken met de Interactive Query Utility
126bij: Relationele databases en SQL ©Mattic b.v.
Hoofdstuk 7:Hoofdstuk 7:
Informatie uit Informatie uit meerdere tabellen: meerdere tabellen: joinsjoins
In dit hoofdstuk …
• Inner joins• Outer joins• Joinoperatoren• Joins over een brede sleutel• Samengestelde joins• Joins van tabel met zichzelf (autojoins)• Joins over niet-sleutelverwijzing• Navigatiepaden
128bij: Relationele databases en SQL ©Mattic b.v.
OpenSchool Vakgroep
Studentnr naam mentor°
student cursusdatum/cijfer° vrijstelling°
Cursus
p
p p
Inschrijving
Docentp
docent cursusp
cursusvoorkennisp
Begeleider Voorkenniseis
p
Tentamen
cdcd
acode naamuren creditsexaminator°
aacr naam vervanger°vakgroep
p acode naam
a
studentcursusvolgnrdatum cijfer°
129bij: Relationele databases en SQL ©Mattic b.v.
Inner join vanStudent enDocent
130bij: Relationele databases en SQL ©Mattic b.v.
join = verbrede tabel(via verwijzing)
nr naammentor1234
Berk Tack Bos Eik
DATDATCOD
Docentacr naam vervangervakgroepDATCODBAC
C.Date E.Codd C.Bachman
COD
DAT
ISISST
Student
Student, verbreed metDocent (D): inner join
nr naammentorD.naamD.vervangerD.vakgroep123
Berk Tack Bos
DATDATCOD
C.Date C.Date E.Codd
CODCOD
ISISST
Joinen als denormaliseren
nr naammentor1234
Berk Tack Bos Eik
DATDATCOD
Docentacr naam vervangervakgroep
DATCODBAC
C.Date E.Codd C.Bachman
COD
DAT
ISISST
Student
FA
Student, verbreed metDocent (D): inner join
nr naammentorD.naamD.vervangerD.vakgroep123
Berk Tack Bos
DATDATCOD
C.Date C.Date E.Codd
CODCOD
ISISST
FAFA
Jointabel bevat functionele afhankelijkheden met niet-unieke determinant:voldoet dus niet aan 3NV. (In database zou dat redundantie geven.)
131bij: Relationele databases en SQL ©Mattic b.v.
Join-navigatiepad
nr naammentor1234
Berk Tack Bos Eik
DATDATCOD
Docentacr naam vervangervakgroep
DATCODBAC
C.Date E.Codd C.Bachman
COD
DAT
ISISST
Student
Studentnr naam mentor°p
Docentp aacr naam vervanger°vakgroep
navigatievan kindnaar ouder
Navigatiepad loopt (in dit geval!) vanaf Student (startpunt)via de verwijzende sleutel naar Docent.
132bij: Relationele databases en SQL ©Mattic b.v.
De inner join in SQL
Stap 1 :producttabel
133bij: Relationele databases en SQL ©Mattic b.v.
Studentnr naam mentor°p
Docentp aacr naam vervanger°vakgroep
select *from Student, Docent
Resultaat:
NR NAAM MENTOR ACR NAAM VERVANGER VAKGROEP========= ====== ====== ====== ========= ========= ======== 1 Berk DAT DAT C.Date COD IS 2 Tack DAT DAT C.Date COD IS 3 Bos COD DAT C.Date COD IS 4 Eik <NULL> DAT C.Date COD IS 1 Berk DAT COD E.Codd <NULL> IS 2 Tack DAT COD E.Codd <NULL> IS 3 Bos COD COD E.Codd <NULL> IS 4 Eik <NULL> COD E.Codd <NULL> IS 1 Berk DAT BAC C.Bachman DAT ST 2 Tack DAT BAC C.Bachman DAT ST 3 Bos COD BAC C.Bachman DAT ST 4 Eik <NULL> BAC C.Bachman DAT ST
producttabel: alle rijenvan Student gecombineerdmet alle rijen van Docent
incl. zinloze combinaties!
134bij: Relationele databases en SQL ©Mattic b.v.
select *from Student S, Docent Dproducttabel
Stap 2 :selectie van producttabel
NR NAAM MENTOR ACR NAAM VERVANGER VAKGROEP========= ====== ====== ====== ========= ========= ======== 1 Berk DAT DAT C.Date COD IS 2 Tack DAT DAT C.Date COD IS 3 Bos COD DAT C.Date COD IS 4 Eik <NULL> DAT C.Date COD IS 1 Berk DAT COD E.Codd <NULL> IS 2 Tack DAT COD E.Codd <NULL> IS 3 Bos COD COD E.Codd <NULL> IS 4 Eik <NULL> COD E.Codd <NULL> IS 1 Berk DAT BAC C.Bachman DAT ST 2 Tack DAT BAC C.Bachman DAT ST 3 Bos COD BAC C.Bachman DAT ST 4 Eik <NULL> BAC C.Bachman DAT ST
where S.mentor = D.acrselectie:alleen de zinvolle rijen
uit Student uit Docent
Resultaattabel
135bij: Relationele databases en SQL ©Mattic b.v.
select S.nr, S.naam, S.mentor, D.naam, D.vervanger, D.vakgroepfrom Student S, Docent Dwhere S.mentor = D.acr
Resultaat:
NR NAAM MENTOR NAAM VERVANGER VAKGROEP========= ====== ====== ====== ========= ======== 1 Berk DAT C.Date COD IS 2 Tack DAT C.Date COD IS 3 Bos COD E.Codd <NULL> IS
inner join!
Studentnr naam mentor°p
Docentp aacr naam vervanger°vakgroep
Stap 3 : projectie(schrap primairesleutel vanoudertabel
Inner join met extra conditie
Geef van elke cursus die een examinator heeft en die 4 ofminder credits hebben, de cursusnaam en het acroniem ende naam van de examinator.
select C.naam, C.examinator, D.naamfrom Cursus C, Docent Dwhere C.examinator = D.acr and C.credits <= 4
joinconditieaanvullende conditie
Zet de joinconditie voorop: kwestie van goede programmeerstijl
136bij: Relationele databases en SQL ©Mattic b.v.
Inner join-operator
137bij: Relationele databases en SQL ©Mattic b.v.
select C.naam, C.examinator, D.naamfrom Cursus C, Docent Dwhere C.examinator = D.acr and C.credits <= 4
Equivalent, met inner join-operator:
select C.naam, C.examinator, D.naamfrom Cursus C inner join Docent D on C.examinator = D.acrwhere C.credits <= 4
kortweg: join
Left outer joinvan Studenten Docent
138bij: Relationele databases en SQL ©Mattic b.v.
nr naammentor1234
Berk Tack Bos Eik
DATDATCOD
Docentacr naam vervangervakgroepDATCODBAC
C.Date E.Codd C.Bachman
COD
DAT
ISISST
Student
Student, verbreed metDocent (D):left outer join
nr naammentorD.naamD.vervangerD.vakgroep123
Berk Tack Bos
DATDATCOD
C.Date C.Date E.Codd
CODCOD
ISISST
4 Eik
tabelverbreding opde outer join-manier:elke rij wordt verbreed
De left outer join in SQL
139bij: Relationele databases en SQL ©Mattic b.v.
Gewenst resultaat: NR NAAM MENTOR NAAM VERVANGER VAKGROEP========= ====== ====== ====== ========= ======== 1 Berk DAT C.Date COD IS 2 Tack DAT C.Date COD IS 3 Bos COD E.Codd <NULL> IS 4 Eik <NULL> <NULL> <NULL> <NULL>
We maken deze ‘left outer join’ als een inner join met een union:
select S.nr, S.naam, S.mentor, D.naam, D.vervanger, D.vakgroepfrom Student S, Docent Dwhere S.mentor = D.acrunionselect nr, naam, mentor, null, null, nullfrom Studentwhere mentor is null
de extra rij (studentzonder mentor)
‘left’: van linker tabel komen alle rijen in het resultaat
De left outer join-operator
Left outer join, via union:
select S.nr, S.naam, S.mentor, D.naam, D.vervanger, D.vakgroepfrom Student S, Docent Dwhere S.mentor = D.acrunionselect nr, naam, mentor, null, null, nullfrom Studentwhere mentor is null
Equivalent en simpeler, met de left outer join-operator:
select S.nr, S.naam, S.mentor, D.naam, D.vervanger, D.vakgroepfrom Student S left outer join Docent D on S.mentor = D.acr
left: linker tabeloperand wordt verbreed
140bij: Relationele databases en SQL ©Mattic b.v.
Left outer join met oudertabel voorop (1)
Geef alle docenten, met hun acroniem en naam en, voor zover ze er zijn,het nummer en de naam van de studenten waarvan zij mentor zijn.
Kan niet in SQL!
Merk op: overzicht met herhalende groep gevraagd!
Namelijk:
141bij: Relationele databases en SQL ©Mattic b.v.
ACR NAAM ---STUDENTEN--- (NR NAAM )------ --------- -------- ------DAT C.Date 1 Berk 2 TackCOD E.Codd 3 BosBAC C.Bachman <NULL> <NULL>
Left outer join met oudertabel voorop (2)
Meest in de buurt komt de volgende oplossing:
select D.acr, D.naam, S.nr, S.naamfrom Docent D left outer join Student S on D.acr = S.mentor
Resultaattabel:
ACR NAAM NR NAAM ====== ========= ========= ======DAT C.Date 1 Berk DAT C.Date 2 Tack COD E.Codd 3 Bos BAC C.Bachman <NULL> <NULL>
genormaliseerde versievan gevraagd overzicht
142bij: Relationele databases en SQL ©Mattic b.v.
ACR NAAM ---STUDENTEN--- (NR NAAM )------ --------- -------- ------DAT C.Date 1 Berk 2 TackCOD E.Codd 3 BosBAC C.Bachman <NULL> <NULL>
De right en full outer join
De left outer join volstaat!
Aanname daarbij:a) alleen ‘homogene’ overzichten, d.w.z. van één soort
van ding, bepaald door één starttabelb) navigatie starten in de juiste (start)tabelc) volgorden in SQL-statement aanpassen aan het
navigatiepad
(zie voorbeelden in cursusboek)
143bij: Relationele databases en SQL ©Mattic b.v.
Joins over een brede sleutel
Gevraagd: voor elk tentamen het aantal dagen dat is verstreken sinds de cursusinschrijving. De benodigde tabellen zijn weergegeven in figuur 7.7
student cursus datum /cijfer° vrijstelling°p Inschrijving
p
Tentamenstudent cursus volgnrdatum cijfer°
SQL: stap voor stap (zie Boek / Boekverkenner). Uiteindelijk:
select T.student, T.cursus, T.volgnr, T.datum - I.datum aantal_dagen_na_inschrijvingfrom Tentamen T join Inschrijving I on T.student = I.student and T.cursus = I.cursus
144bij: Relationele databases en SQL ©Mattic b.v.
Samengestelde joins (1)
Geef een overzicht van alle herkansingstentamens, waarbij naast hetstudentnummer de naam van de student wordt vermeld. Verder moetin plaats van de cursuscode de naam van de cursus worden vermeld.
Deze vinden we terug inde SQL-oplossing!
Tentamen
Inschrijving
CursusStudent
De starttabel en het navigatiepad volgen uit de vraagstelling:
145bij: Relationele databases en SQL ©Mattic b.v.
Samengestelde joins (2)
SQL:
select T.student, C.naam, T.volgnr, T.datum, T.cijferfrom Tentamen T join Inschrijving I on T.student = I.student and T.cursus = I.cursus join Student S on I.student = S.nr join Cursus C on I.cursus = C.codewhere T.volgnr >= 2
Tentamen
Inschrijving
CursusStudent
146bij: Relationele databases en SQL ©Mattic b.v.
Gemengd gebruik van inner en outer joins
Geef van elke inschrijving waarvoor een vrijstelling is verleendhet studentnummer, de cursuscode, de datum en – voor zover vantoepassing – de naam van de examinator.
Inschrijving
Cursus
Docent(Examinator)
Starttabel en navigatiepad:SQL:
select I.student, I.cursus, I.datum, D.naam examinatorfrom Inschrijving I join Cursus C on I.cursus = C.code left outer join Docent D on C.examinator = D.acrwhere I.vrijstelling = 'J'
NB. Verwijzing van Inschrijving naar Cursus isverplicht, dus geen verschil inner en outer join.
147bij: Relationele databases en SQL ©Mattic b.v.
Autojoins
148bij: Relationele databases en SQL ©Mattic b.v.
Docentp aacr naam vervanger°vakgroep
Vraagstelling:Geef van alle docenten die een vervanger hebben, het acroniemen de naam en ook het acroniem en de naam van de vervanger.
Aanpak:Tabel Docent (starttabel) doorlopen en via de verwijzing in dezelfde tabel de vervanger opzoeken.
Truc: ga - conceptueel - uit van twee exemplaren van Docent,één in de rol van docenten waarvoor het overzicht gemaaktwordt, en één in de rol van mogelijke vervangers.
Autojoin: joinen met ander exemplaar van dezelfde tabel
Vat een recursieve verwijzing op als een virtuele exemplarenvan de ene tabel Docent, met elk een eigen naam(alias), waarvan de één naar de ander verwijst:
Recursieve verwijzing:opvatten als gewoneverwijzing! Welge-kozen aliassen gevende rollen weer van detabelexemplaren inhet probleem.
Docent (V)p aacr naam vervanger°vakgroep
Docent (D)p aacr naam vervanger°vakgroep
SQL:
select D.acr, D.naam, V.acr, V.naamfrom Docent D join Docent V on D.vervanger = V.acr
Docent (D)
Docent (V)
Navigatiepad:
149bij: Relationele databases en SQL ©Mattic b.v.
Met populatie:
Elk virtueel tabelexemplaar is de volledige tabel(gebruikt in een zekere rol)
150bij: Relationele databases en SQL ©Mattic b.v.
Docent (V)acr naam vervangerDATCODBAC
C.Date E.Codd C.Bachman
COD
DAT
Docent (D)acr naam vervangerDATCODBAC
C.Date E.Codd C.Bachman
COD
DAT
Virtueel tabelexemplaar is volledige tabel!
Een left outer autojoin in SQL
select D.acr, D.naam, V.acr, V.naamfrom Docent D left outer join Docent V on D.vervanger = V.acr
Geef van alle docenten het acroniem en de naam en als ze eenvervanger hebben ook het acroniem en de naam van de vervanger.
ACR NAAM ACR NAAM ====== ========= ====== ======DAT C.Date COD E.Codd COD E.Codd <NULL> <NULL> BAC C.Bachman DAT C.Date
Resultaat:
151bij: Relationele databases en SQL ©Mattic b.v.
Docent (V)acr naam vervangerDATCODBAC
C.Date E.Codd C.Bachman
COD
DAT
Docent (D)acr naam vervangerDATCODBAC
C.Date E.Codd C.Bachman
COD
DAT
Ouders zonder kind (1)
Probleem: geef alle cursussen (code en naam) waarvoor geenenkele inschrijving bestaat.
Algemeen: geef alle ouderrijen waar geen kindrij bij hoort.
student cursusdatum/cijfer° vrijstelling°
Cursus
p
p
Inschrijving
acode naamuren creditsexaminator°
We lossen dit probleem op met een outer join. Later doen we het eenvoudiger, met een subselect. Maar deze manier is leerzaam en kan ook erg snel zijn (bij grote databases)!
Merk op: er wordt precies gevraagd naar de ouderrijen dieverdwijnen bij de inner join (en behouden blijven bij de left outerjoin) van Cursus en Inschrijving.
Hoe herkennen we die rijen in de left outer join?152bij: Relationele databases en SQL ©Mattic b.v.
Ouders zonder kind (2)
select *from Cursus C left outer join Inschrijving I on C.code = I.cursus
zit niet in inner join:ouder zonder kind!
CODE NAAM UREN CREDITS EXAMINATOR STUDENT CURSUS DATUM CIJFER VRIJSTELLING====== ===================== ========= ======= ========== ========= ====== =========== ====== ============II Inleiding informatica 80 3.0 BAC 1 II 12-jan-2012 7 N II Inleiding informatica 80 3.0 BAC 2 II 12-jan-2012 <NULL> J II Inleiding informatica 80 3.0 BAC 3 II 16-jan-2012 <NULL> <NULL> II Inleiding informatica 80 3.0 BAC 4 II 20-jan-2012 <NULL> J DW Discrete wiskunde 120 4.0 DAT 1 DW 19-jan-2012 5 N DW Discrete wiskunde 120 4.0 DAT 2 DW 12-jan-2012 <NULL> J DB Databases 120 4.0 COD 1 DB 18-mrt-2012 8 N DB Databases 120 4.0 COD 4 DB 29-feb-2012 <NULL> N IM Informatiemodelleren 150 5.0 DAT 1 IM 20-jun-2012 <NULL> N IM Informatiemodelleren 150 5.0 DAT 2 IM 26-jan-2012 5 N SW Semantic web 120 4.0 <NULL> <NULL> <NULL> <NULL> <NULL> <NULL>
student cursusdatum/cijfer° vrijstelling°
Cursus
p
p
Inschrijving
acode naamuren creditsexaminator°
Eerst volledige left outer join:
(of andere verplichte kolom van kindtabel)
select C.code, C.naamfrom Cursus C left outer join Inschrijving I on C.code = I.cursuswhere I.student is null
Dan conditie toevoegen:
153bij: Relationele databases en SQL ©Mattic b.v.
Hoofdstuk 8:Hoofdstuk 8:
Statistische Statistische informatieinformatie
In dit hoofdstuk …
• Statistische functies• Scheve query’s• Groeperen• Voorwaarden aan groepen: having• Groeperen is denormaliseren• Statistische joinquery’s• Het conceptuele algoritme
155bij: Relationele databases en SQL ©Mattic b.v.
OpenSchool Vakgroep
Studentnr naam mentor°
student cursusdatum/cijfer° vrijstelling°
Cursus
p
p p
Inschrijving
Docentp
docent cursusp
cursusvoorkennisp
Begeleider Voorkenniseis
p
Tentamen
cdcd
acode naamuren creditsexaminator°
aacr naam vervanger°vakgroep
p acode naam
a
studentcursusvolgnrdatum cijfer°
156bij: Relationele databases en SQL ©Mattic b.v.
Statistische functies
count aantal rijen, of aantal waarden in kolom sum / avg totaal / gemiddelde van waarden in kolom max / min grootste / kleinste waarde in kolom
Hoeveel inschrijvingen zijn er voor de cursus met code II?
select count(*) aantal -- 3from Inschrijving -- 1where cursus = 'II' -- 2
één statistischewaarde overhele tabel(één groep)
157bij: Relationele databases en SQL ©Mattic b.v.
Resultaat:
AANTAL========= 4
‘Scheve’ query’s
select code, count(*)from Cursus
één waarde per rij
één waarde voor hele tabel
Wat deugt hierniet aan?
foutieve ´scheve´ query!
158bij: Relationele databases en SQL ©Mattic b.v.
Groeperen
Aantal inschrijvingenper cursus:
select cursus, count(*) aantal -- 3from Inschrijving -- 1group by cursus -- 2 tabel Inschrijving
wordt opgedeeldin groepen van rijen:- per cursus één groep;- één statistische waardeper groep (= per cursus)
Resultaat:
CURSUS AANTAL====== =========DB 2 DW 2 II 4 IM 2
studentcursus datum cijfer vrijstelling1111222344
I IDWDBIMI I
DWIMI II IDB
12-jan-2012 19-jan-2012 18-mrt-2012 20-jun-2012 12-jan-2012 12-jan-2012 26-jan-2012 16-jan-2012 20-jan-2012 29-feb-2012
758
5
NNNNJJN
JN
Inschrijving
159bij: Relationele databases en SQL ©Mattic b.v.
Verfijnd groeperen
Aantallen tentamens per inschrijving(= per combinatie student/cursus):
select student, cursus, count(*)from Tentamengroup by student, cursus
Resultaat:
STUDENT CURSUS COUNT======= ====== ========= 1 DB 2 1 DW 1 1 II 1 2 IM 2 4 DB 1
student cursus volgnr datum cijfer1111224
I IDWDBDBIMIMDB
1112121
17-apr-2012 17-apr-2012 19-apr-2012 15-jun-2012 06-apr-2012 11-jun-2012 26-jun-2012
755845
Tentamen
Groeperen over twee of meerkolommen geeft een verfijnderegroepenindeling.
Voorbeeld:
160bij: Relationele databases en SQL ©Mattic b.v.
Voorwaarden aan groepen: having
studentcursus datum cijfer vrijstelling1111222344
I IDWDBIMI I
DWIMI II IDB
12-jan-2012 19-jan-2012 18-mrt-2012 20-jun-2012 12-jan-2012 12-jan-2012 26-jan-2012 16-jan-2012 20-jan-2012 29-feb-2012
758
5
NNNNJJN
JN
Inschrijving
Per cursus aantal inschrijvingenzonder vrijstelling.Beperken tot cursussen waar-voor dat aantal tenminste 2 is:
select cursus, count(*) aantal -- 5from Inschrijving -- 1where vrijstelling = 'N' -- 2group by cursus -- 3having count(*) >= 2 -- 4
Resultaat:
CURSUS AANTAL====== =========DB 2 IM 2
161bij: Relationele databases en SQL ©Mattic b.v.
Groeperen als denormaliseren (1)
Geef voor elke cursus met vrijstelling = ‘ N’:cursuscode, aantal inschrijvingen en gemiddelde cijfer.
Oplossing:
select cursus, -- 4 count(*) aantal, -- avg(cijfer) gemiddelde_cijfer --from Inschrijving -- 1where vrijstelling = ‘N’ -- 2group by cursus -- 3
Eindresultaat (na stap 4):CURSUS AANTAL GEMIDDELDE_CIJFER====== ========= =================DB 2 8 DW 1 5 II 1 7 IM 2 5
162bij: Relationele databases en SQL ©Mattic b.v.
Groeperen als denormaliseren (2)
select …from Inschrijving -- 1where vrijstelling = ‘N’ -- 2
is het tussenresultaat:
Na stap 2:
STUDENT CURSUS DATUM CIJFER VRIJSTELLING========= ====== =========== ====== ============ 1 II 12-jan-2012 7 N 1 DW 19-jan-2012 5 N 1 DB 18-mrt-2012 8 N 1 IM 20-jun-2012 <NULL> N 2 IM 26-jan-2012 5 N 4 DB 29-feb-2012 <NULL> N
In stap 3 gaan wedit groeperenop kolom cursus
163bij: Relationele databases en SQL ©Mattic b.v.
Groeperen als denormaliseren (3)
Bij stap 3 – het groeperen op cursus – wordt een herhalende groep gemaakt:
select …from Inschrijving -- 1where vrijstelling = ‘N’ -- 2group by cursus -- 3
Dit is tabel met vier rijenen twee kolommen,waarvan één eenherhalende groep!
164bij: Relationele databases en SQL ©Mattic b.v.
STUDENT CURSUS DATUM CIJFER VRIJSTELLING========= ====== =========== ====== ============ 1 DB 18-mrt-2012 8 N 4 29-feb-2012 <NULL> N ------------------------------------------------ 1 DW 19-jan-2012 5 N ------------------------------------------------ 1 II 12-jan-2012 7 N ------------------------------------------------ 1 IM 20-jun-2012 <NULL> N 2 26-jan-2012 5 N
Groeperen als denormaliseren (4)
Nog duidelijker wanneer we kolom cursus voorop zetten:
Zo ontstaat het eindresultaat:CURSUS AANTAL GEMIDDELDE_CIJFER====== ========= =================DB 2 8 DW 1 5 II 1 7 IM 2 5
165bij: Relationele databases en SQL ©Mattic b.v.
CURSUS STUDENT DATUM CIJFER VRIJSTELLING====== ========= =========== ====== ============DB 1 18-mrt-2012 8 N 4 29-feb-2012 <NULL> N ------------------------------------------------DW 1 19-jan-2012 5 N ------------------------------------------------II 1 12-jan-2012 7 N ------------------------------------------------ IM 1 20-jun-2012 <NULL> N 2 26-jan-2012 5 N
voor elke groep:
count(*),avg(cijfer),…
Statistische joinquery’s
166bij: Relationele databases en SQL ©Mattic b.v.
code naam ..II
DWDBIMSW
Inleiding informatica Discrete wiskunde Databases Informatiemodelleren Semantic web
..
..
..
..
..
studentcursus datum ..1111222344
I IDWDBIMI I
DWIMI II IDB
12-jan-2012 19-jan-2012 18-mrt-2012 20-jun-2012 12-jan-2012 12-jan-2012 26-jan-2012 16-jan-2012 20-jan-2012 29-feb-2012
..
..
..
..
..
..
..
..
..
..
Cursus
Inschrijving
Gevraagd: cursussen met hunhun aantallen inschrijvingen
Cursus, verbreed metstatistische gegevens vanInschrijving: de 'inner' manier
code naam .. aantal_inschrijvingenII
DWDBIM
Inleiding informatica Discrete wiskunde Databases Informatiemodelleren
..
..
..
..
4222
Merk op:- tabelverbreding op de inner join manier: we missen cursus SW- starttabel is Cursus: navigatie is ouder richting kind, tegen de richting van de verwijzing in
Starttabel en navigatierichting bij statistische query
cursist cursus datum ...
code naam ...Cursusp
Inschrijvingp
code naam ... aantalInschrijvingen
Cursus, verbreed met statistischegegevens van Inschrijvingp
starttabel
navigatierichting
167bij: Relationele databases en SQL ©Mattic b.v.
Statistische joinquery in SQL
(Gevraagd: cursussen met hun aantallen inschrijvingen)
Poging:
select C.code, C.naam, count(*) aantal_inschrijvingenfrom Cursus C join Inschrijving I on C.code = I.cursusgroup by C.code
cursist cursus datum ...
code naam ...Cursusp
Inschrijvingp
code naam ... aantalInschrijvingen
Cursus, verbreed metstatistische gegevensvan Inschrijvingp
Conceptueel is dit goed: we moeten immers groepen hebbenmet gelijke cursuscode. Die hebben dan vanzelf ook dezelfdecursusnaam (waarom?)
168bij: Relationele databases en SQL ©Mattic b.v.
Onverwacht verfijnd groeperen
De juiste oplossing:
169bij: Relationele databases en SQL ©Mattic b.v.
verplicht verfijnd groeperen,ondanks de functionele afhankelijkheid
select C.code, C.naam, count(*) aantal_inschrijvingenfrom Cursus C join Inschrijving I on C.code = I.cursusgroup by C.code, C.naam
FA
Statistische outer joinquery’s
170bij: Relationele databases en SQL ©Mattic b.v.
code naam ..II
DWDBIMSW
Inleiding informatica Discrete wiskunde Databases Informatiemodelleren Semantic web
..
..
..
..
..
studentcursus datum ..1111222344
I IDWDBIMI I
DWIMI II IDB
12-jan-2012 19-jan-2012 18-mrt-2012 20-jun-2012 12-jan-2012 12-jan-2012 26-jan-2012 16-jan-2012 20-jan-2012 29-feb-2012
..
..
..
..
..
..
..
..
..
..
Cursus
Inschrijving
Gevraagd: alle cursussen methun aantallen inschrijvingen
Merk op:- nu ook cursus SW (aangevuld met null)
Cursus, verbreed metstatistische gegevens vanInschrijving: de 'outer' manier
code naam .. aantal_inschrijvingenII
DWDBIMSW
Inleiding informatica Discrete wiskunde Databases Informatiemodelleren Semantic web
..
..
..
..
..
4222
Statistische outer joinquery in SQL
(alle cursussen met hunaantallen inschrijvingen)
Poging:select C.code, C.naam, count(*) aantal_inschrijvingenfrom Cursus C left outer join Inschrijving I on C.code = I.cursusgroup by C.code, C.naam
Resultaat van poging:
CODE NAAM AANTAL_INSCHRIJVINGEN====== ===================== =====================DB Databases 2 DW Discrete wiskunde 2 II Inleiding informatica 4 IM Informatiemodelleren 2 SW Semantic web 1 Waarom een 1?
Hoe op te lossen?
Juiste oplossing:
count(I.cursus)
171bij: Relationele databases en SQL ©Mattic b.v.
Genest groeperen (vb: ‘minimax’-probleem)
select count(*)from Inschrijvinggroup by cursus
Aantallen inschrijvingenper cursus:
Resultaat:
COUNT========= 2 2 4 2
Resultaat:
AVG(COUNT(*))------------- 3.6666667
genest groeperen = groeperen van groeperingsresultaat statistische waarde van statistische waarden
172bij: Relationele databases en SQL ©Mattic b.v.
select avg(count(*))from Inschrijvinggroup by cursus
Gemiddeld aantal inschrijvingenper cursus :
(in Firebirdmoet dit anders)
Nogmaals een ‘scheve’ query
Poging:
select cursus, max(count(*))from Inschrijvinggroup by cursus
173bij: Relationele databases en SQL ©Mattic b.v.
Gevraagd:
de cursus (of cursussen)met het grootste aantalinschrijvingen
Waarom is dit een ‘scheve’ query en dus fout?
cursist cursus datum ...
code naam ...Cursusp
Inschrijvingp
De conceptuele verwerkingsvolgorde (1)
174bij: Relationele databases en SQL ©Mattic b.v.
Gevraagd: overzicht van inschrijvingendie met een voldoende zijn afgesloten enwaarvan aantal tentamens 2 is of hoger.Orden op dat aantal, van hoog naar laag. Oplossen: vanuit ‘bekende’ conceptueleverwerkingsvolgorde’:
studentcursusdatum/cijfer° vrijstelling°p Inschrijving
p
Tentamen
a
studentcursusvolgnrdatum cijfer°
met opzet hier zonder joinoperator!
select I.student, I.cursus, count(*)from
5. projectie op I.student, I.cursus, met extra statistische kolom
Inschrijving I, Tentamen T 1. brontabel (cartesisch product)
where I.student = T.student and I.cursus = T.cursus and I.cijfer >= 6
2. rijselectie van brontabel
group by I.student, I.cursus 3. groeperen (geeft één rij per inschrijving, met herhalende groep)
having count(*) >= 2 4. rijselectie van gegroepeerde tabel
order by count(*) 6. ordening op aantal (count(*))
De conceptuele verwerkingsvolgorde (2)
De werkelijke volgorde kan anders zijn!
175bij: Relationele databases en SQL ©Mattic b.v.
brontabel
where
group by
having
select … from
order by
Hoofdstuk 9:Hoofdstuk 9:
Subselects en Subselects en viewsviews
In dit hoofdstuk …
• subselects als oplossing van deelproblemen– subselect in:
… where-clausule… select-clausule… from-clausule… having-clausule (zie boek)
• gecorreleerde en niet-gecorreleerde subselects• subselects en joins: navigatie via subselect(s)• gecorreleerde subselects
– … met (not) exists• geneste subselects• views als oplossing van deelproblemen
177bij: Relationele databases en SQL ©Mattic b.v.
OpenSchool Vakgroep
Studentnr naam mentor°
student cursusdatum/cijfer° vrijstelling°
Cursus
p
p p
Inschrijving
Docentp
docent cursusp
cursusvoorkennisp
Begeleider Voorkenniseis
p
Tentamen
cdcd
acode naamuren creditsexaminator°
aacr naam vervanger°vakgroep
p acode naam
a
studentcursusvolgnrdatum cijfer°
178bij: Relationele databases en SQL ©Mattic b.v.
Waar een subselect?
179bij: Relationele databases en SQL ©Mattic b.v.
In principe (conceptueel):overal waar een relationele expressie(tabel) of atomaire waarde betekenisvol is.
select ... from ... where ... group by ... having ...
(select ... ...)
Subselect in where-clausule
Gevraagd: geef de oudste inschrijving (of inschrijvingen).Vermeld studentnummer, cursuscode en datum.
180bij: Relationele databases en SQL ©Mattic b.v.
student cursusdatum/cijfer° vrijstelling°p Inschrijving
Stapsgewijs oplossen:
select student, cursus, datumfrom Inschrijvingwhere datum = -- de vroegste inschrijvingsdatum
stap 1( select min(datum) from Inschrijving)
stap 2
Deze subselect is niet-gecorreleerd: kan a.h.w. wordenuitgeknipt en zelfstandig worden uitgevoerd.
Subselect in select-clausule (1)
Gevraagd: van elke cursus de cursuscode, de cursusnaamen het aantal inschrijvingen.
code naam uren ...II
DWDBIMSW
Inleiding informatica Discrete wiskunde Databases Informatiemodelleren Semantic web
80120120150120
Cursuscursistcursus datum ...
1111222344
IIDWDBIMII
DWIMIII IDB
12-jan-2012 19-jan-2012 18-mrt-2012 20-jun-2012 12-jan-2012 12-jan-2012 26-jan-2012 16-jan-2012 20-jan-2012 29-feb-2012
Inschrijving
Stapsgewijs oplossen:
select code, naam, -- aantal inschrijvingen
from Cursus
deelprobleem ( select count(*) from Inschrijving where cursus = C.code)C
met oplossing
subselect is gecorreleerd: voor elke cursus van de hoofdselect andere subselect181bij: Relationele databases en SQL ©Mattic b.v.
Subselect in select-clausule (2)
select code, naam, (-- aantal inschrijvingen select count(*) from Inschrijving where cursus = C.code)from Cursus C
De oplossing:
kunnen we nog als volgt herschrijven met een kolomalias:
select code, naam, (select count(*) from Inschrijving where cursus = C.code) aantal_inschrijvingenfrom Cursus C
De kolomnaam (alias) vervangt nu het commentaar.
182bij: Relationele databases en SQL ©Mattic b.v.
Subselect in from-clausule
Gevraagd: maximum van de aantallen inschrijvingen per cursus.
(minimax-probleem!)
(select count(*) aantal_inschrijvingen from Cursus C join Inschrijving I on C.code = I.cursus group by C.code)
student cursusdatum/cijfer° vrijstelling°
Cursus
p
p
Inschrijving
acode naamuren creditsexaminator°
Stapsgewijs oplossen:
select max(aantal_inschrijvingen)from
deelprobleemgevraagd: tabel met eenkolom aantal_inschrijvingen(per cursus)
183bij: Relationele databases en SQL ©Mattic b.v.
Subselectnavigatie en joinnavigatie
cursist cursus datum ...
code naam ...Cursusp
Inschrijvingp
(gevraagd: van elke cursus: code, naamen aantal inschrijvingen)
Bij beide stap je over van Cursus naar Inschrijving: navigatie tegen richting verwijzende sleutel in (‘van één naar veel’).
184bij: Relationele databases en SQL ©Mattic b.v.
met subselectnavigatie:
select code, naam, (select count(*) from Inschrijving where cursus = C.code) aantal_inschrijvingenfrom Cursus C
met joinnavigatie:
select C.code, C.naam, count(I.cursus)from Cursus C left outer join Inschrijving I on C.code = I.cursusgroup by C.code, C.naam
Subselect met verzamelingenoperator ‘in’
Gevraagd: alle cursussen (code en naam) die cursus DW als voorkennis eisen
185bij: Relationele databases en SQL ©Mattic b.v.
Cursusp
cursusvoorkennisp Voorkenniseis
acode naamuren creditsexaminator°
stap 1select code, naamfrom Cursuswhere code in -- verzameling codes van cursussen met voorkennis DWstap 2 (
select cursus from Voorkenniseis where voorkennis = 'DW')
Navigatie over brede sleutel
Gevraagd: inschrijvingen (studentnummer,cursuscode en datum) waarvoor twee maalof vaker tentamen is gedaan.
186bij: Relationele databases en SQL ©Mattic b.v.
student cursus datum ...p Inschrijving
p
Tentamenstudent cursus volgnr ...
select student, cursus, datumfrom Inschrijvingwhere (student, cursus) in -- verzameling combinaties (student, cursus) uit Tentamen die daarin minstens twee keer voorkomen
stap 1
(
select student, cursus from Tentamen group by student, cursus having count(*) >= 2)
stap 2
(kan niet in Firebird: zie boek voor trucje)
niet zelfstandig uit tevoeren (gecorreleerd)
Ongecorreleerde en gecorreleerde subselects
1. Gevraagd: de vroegste inschrijvingen:
select student, cursus, datumfrom Inschrijvingwhere datum = (-- de vroegste inschrijvingsdatum select min(datum) from Inschrijving)
2. Gevraagd: de vroegste inschrijvingen per cursus:
select student, cursus, datumfrom Inschrijving Iwhere datum = (-- de vroegste inschrijvingsdatum bij -- de cursus van ‘deze’ inschrijving select min(datum) from Inschrijving where cursus = I.cursus)
twee exemplarenvan Inschrijving!
187bij: Relationele databases en SQL ©Mattic b.v.
zelfstandig uit te voeren(ongecorreleerd)
Gecorreleerde subselectmet exists
student cursusdatum/cijfer° vrijstelling°
Cursus
p
p
Inschrijving
acode naamuren creditsexaminator°
188bij: Relationele databases en SQL ©Mattic b.v.
Gevraagd: cursussen waarvoor één of meer vrijstellingen zijn verleend.
Oplossing 1:ongecorreleerde subselect met in
select code, naamfrom Cursuswhere code in (select cursus from Inschrijving where vrijstelling = 'J')
Oplossing 2:gecorreleerde subselect met exists
select code, naamfrom Cursus Cwhere exists (select * from Inschrijving where cursus = C.code and vrijstelling = 'J')
geeft true alsverzamelingniet leeg verzameling
Nogmaals:ouders zonder kind
Probleem: geef alle cursussen (code en naam) waarvoor geenenkele inschrijving bestaat.
student cursusdatum/cijfer° vrijstelling°
Cursus
p
p
Inschrijving
acode naamuren creditsexaminator°
Subselect met ‘not in’:
select code, naamfrom Cursuswhere code not in (select cursus from Inschrijving)
Subselect met ‘not exists’:
select code, naamfrom Cursus Cwhere not exists (select * from Inschrijving where cursus = C.code)
189bij: Relationele databases en SQL ©Mattic b.v.
Geneste subselects
student cursusdatum/cijfer° vrijstelling°
Cursus
p
p
Inschrijving
Docentp
docentcursuspBegeleider
acode naamuren creditsexaminator°
aacr naam vervanger°vakgroep
Probleem: welke docenten (acroniem) zijn begeleider van decursus met de meeste inschrijvingen?
Navigatiepad volgt al uit de vraagstelling:
1
2 3
190bij: Relationele databases en SQL ©Mattic b.v.
Oplossing in stappen volgt navigatiepad
select acr, naamfrom Docentwhere acr in (-- de verzameling acroniemen van docenten die begeleider zijn -- zijn van de cursus(sen) met de meeste inschrijvingen
stap 1
select docentfrom Begeleiderwhere cursus in (-- verzameling codes van cursussen met de meeste inschrijvingen
stap 2
select cursusfrom Inschrijvinggroup by cursushaving count (*) = (-- maximum aantal inschrijvingen per cursusstap 3
select max(aantal_inschrijvingen)from (select count(*) aantal_inschrijvingen from Inschrijving group by cursus))))stap 4
Navigatiepad omvat zelfs twee exemplaren van Inschrijving!
191bij: Relationele databases en SQL ©Mattic b.v.
Views
• Een view is een ‘ named query’: een select-query die we kunnen bewaren en gebruiken als een databasetabel
• Een view kan als alternatief dienen voor een subselect• Views kunnen we (dus) net als subselects gebruiken om
een probleem op te delen in deelproblemen
192bij: Relationele databases en SQL ©Mattic b.v.
Voorbeeld van een view (1)
Gevraagd: code, naam en aantal inschrijvingen van de cursus(sen)met de meeste inschrijvingen.
Oplossing 1: met subselect
select C.code, C.naam, count(*)from Cursus C join Inschrijving I on C.code = I.cursusgroup by C.code, C.naamhaving count(*) = (--maximum aantal inschrijvingen per cursus select max(aantal_inschrijvingen) from (select count(*) aantal_inschrijvingen from Inschrijving group by cursus))
- complexe hoofdquery met complexe (geneste) subselect- ter vereenvoudiging maken we een view voor het volgende deelprobleem: het aantal inschrijvingen per cursus
193bij: Relationele databases en SQL ©Mattic b.v.
Voorbeeld van een view (2)
Oplossing 2: met een view en een (simpeler) subselect:
- Definitie van de view (genaamd vCursus)
create view vCursus (code, naam, aantal_inschrijvingen)as select C.code, C.naam, count(*) from Cursus C join Inschrijving I on C.code = I.cursus group by C.code, C.naam
- Oplossing van het volledige probleem is nu eenvoudig:
select code, naam, aantal_inschrijvingenfrom vCursuswhere aantal_inschrijvingen = (select max(aantal_inschrijvingen) from vCursus)
Hiermee is een deelprobleem opgelost.
194bij: Relationele databases en SQL ©Mattic b.v.
Hoofdstuk 10:Hoofdstuk 10:
Wijzigen van een Wijzigen van een database-inhouddatabase-inhoud
In dit hoofdstuk …
• Transacties• Het insert-statement• Het delete-statement• Het update-statement• Integriteitsregels
196bij: Relationele databases en SQL ©Mattic b.v.
OpenSchool Vakgroep
Studentnr naam mentor°
student cursusdatum/cijfer° vrijstelling°
Cursus
p
p p
Inschrijving
Docentp
docent cursusp
cursusvoorkennisp
Begeleider Voorkenniseis
p
Tentamen
cdcd
acode naamuren creditsexaminator°
aacr naam vervanger°vakgroep
p acode naam
a
studentcursusvolgnrdatum cijfer°
Transacties
• transactie = reeks SQL-statements die ofwel in hun geheel, ofwel in het geheel niet worden uitgevoerd.
• commitmoment = moment waarop de transactie definitief wordt– tevens einde van de transactie– expliciet via commit-statement– impliciet via DDL-statement
• DDL = subtaal voor structuurverandering, bv. create table
• rollback: terugdraaien van transactie– statement: rollback
198bij: Relationele databases en SQL ©Mattic b.v.
Soorten databases m.b.t. transacties
Aard en frequentie van transacties bepalen hoe een database ‘leeft’. Verschillende ‘levenswijzen’:
• OnLine Transational Processing (OLTP)– database online gestuurd via programmatuur en (frequent)
gevuld vanuit automaten of bv. internet• Transactionele bedrijfssystemen
– bijhouden van dagelijkse veranderingen van de bedrijfswerkelijkheid (klanten, bestellingen, …)
• Datawarehouses– verzamelen historiegegevens en transformeren tot
waardevolle informatie
Transactie afsluiten met commit(moment) of rollback
nieuwcommit-moment
start van transactie
toestand na laatstecommitmoment
rollback
start van transactie
toestand na laatstecommitmoment= terugkeertoestandna rollback
transactie afgeslotenmet commitmoment:
transactie afgeslotenmet rollback:
200bij: Relationele databases en SQL ©Mattic b.v.
Transactiemodellen
• Impliciete transactiemodel: na elk commitmoment of rollback start nieuwe transactie
• Expliciete transactiemodel: start transactie pas nastart transaction-statement; tot die tijd is elk statement een transactie op zichzelf
• Meer hierover in hoofdstuk 15 ‘Transacties en concurrency’– … met name over hoe transacties van verschillende
gebruikers elkaar in de weg kunnen zitten en oplossingen daarvoor
201bij: Relationele databases en SQL ©Mattic b.v.
Het insert-statement: poging tot invoegen
Voorbeeld enkelvoudige insert:
insert into Studentvalues (5, 'Stam', null)
Alternatief met kolommenlijst (en weglating null-waarde):
insert into Student (nr, naam)values (5, 'Stam', null)
Studentnr naam mentor°p
202bij: Relationele databases en SQL ©Mattic b.v.
Meervoudige insert
Voorbeeld: nieuwe tabel DWCursus maakt deel uit vandatawarehouse met statistische informatie.Kolom begeleidJN moet waarde ‘J’ of ‘N’ krijgen al naargelang een cursus één of meer begeleiders heeft.
Cursusp
docent cursusp Begeleider
acode naam uren creditsexaminator°
gevulde tabellen uit OpenSchool-database:
IIDWDBIMSW
Inleiding informatica Discrete wiskunde Databases Informatiemodelleren Semantic web
80120120150120
34454
BACDATCODDAT
DATDATDATBACBAC
DBDWIMII
DB
insert into DWCursus select code, naam, iif(exists (select * from Begeleider where cursus = C.code), 'J', 'N') from Cursus C
203bij: Relationele databases en SQL ©Mattic b.v.
code naam begeleidJN°DWCursusp
nieuwe, lege tabel:
Het delete-statement: poging tot verwijderen
IIDWDBIMSW
Inleiding informatica Discrete wiskunde Databases InformatiemodellerenSemantic web
80120120150120
34454
BACDATCODDAT
DBDBIMSW
I IDWDBDB
Cursusp
cursusvoorkennisp Voorkenniseis
cd
acode naam uren creditsexaminator°
1111222344
I IDWDBIMI IDWIMI II IDB
12-jan-2012 19-jan-2012 18-mrt-2012 20-jun-2012 12-jan-2012 12-jan-2012 26-jan-2012 16-jan-2012 20-jan-2012 29-feb-2012
758
5
NNNNJJN
JN
DATDATDATBACBAC
DBDWIMIIDB
student cursus datum /cijfer° vrijstelling°p Inschrijving
docent cursuspBegeleider
cd
Verschil tussen:
delete from Cursuswhere code = ‘II‘en
delete from Cursuswhere code = ‘SW‘
denk aan:- referentiële integriteitsregel- cascading deletes
204bij: Relationele databases en SQL ©Mattic b.v.
Het update-statement: poging tot wijzigen
Voorbeeld eenvoudige update:
update Cursus -- 1set uren = 140, credits = 5 -- 3where code = 'DW' -- 2
Let op de(conceptuele)volgorde!
205bij: Relationele databases en SQL ©Mattic b.v.
update Cursusset uren = 140, credits = 5where code = 'DW'
toekenning (‘maak gelijk aan’)
gelijkheid (‘is gelijk aan’)
Update van elke rij
Update van elke rij:
update Cursusset uren = uren * 1.1
nieuwewaardevan uren
oudewaardevan uren
206bij: Relationele databases en SQL ©Mattic b.v.
Update met subselect
Maak elk urenaantal gelijk aan het gemiddelde aantal uren.
Poging:
update Cursusset uren = (select avg(uren) from Cursus)
Inspectie van tabel Cursus geeft:
CODE NAAM UREN====== ===================== =========II Inleiding informatica 118 DW Discrete wiskunde 125 DB Databases 126 IM Informatiemodelleren 127 SW Semantic web 123
(ongecorreleerdeupdate)
verklaring?
207bij: Relationele databases en SQL ©Mattic b.v.
Update met gecorreleerde subselect
Extra kolom tabel Cursus:
Cursus
Inschrijvingp
pcode naam ... /aantal_inschrijvingen°
studentcursus ...
alter table Cursusadd aantal_inschrijvingen integer
Vullen: update Cursus Cset aantal_inschrijvingen = (-- aantal inschrijvingen voor ‘deze’ cursus select count(*) from Inschrijving where cursus = C.code)
208bij: Relationele databases en SQL ©Mattic b.v.