Oefeningen ERD - normalisatie
description
Transcript of Oefeningen ERD - normalisatie
Oefeningen ERD – normalisatie
Oefening: De filmadministratie
Je wenst een eigen administratie op te stellen voor het verwerken van filmgegevens. Bij elke film hoort de lijst met acteurs en het personage dat zij in de film speelden. Bedoeling is ook de gegevens over de volledige filmcrew te verwerken. De filmcrew bestaat uit de regisseur, cameramensen, ... Uiteindelijk wil je volgende overzicht kunnen afdrukken:
FilmID: 1999/57Titel: Bicentennial ManProductiehuis: Touchstone PicturesRelease Date: 17/12/99Korte inhoud: In the first decade of the new millenium, ....
Acteur PersonageMain Cast: Robin Williams Andrew Martin
Sam Neill SirIoliver Platt Rupert Burns...
MPAA rating: PG
CrewID Description Name1 Director: Chris Columbus2 Screen writer Nick Kazan3 Special Effects Steve Johnson4 Producer Mark Radcliffe5 Costume Designer Joseph G. Aulisi
Teken het ERD
Begrippen: Entiteit:
■ Crew■ Film■ Auteur ■ Productiehuis
Attribuut:■ Inhoud■ Titel■ Datum
1
Normaliseer het rapport
0NFFilm = (FilmID, Titel, ProductiehuisID, Productiehuis, ReleaseDate, KorteInhoud,
{ActeurID,Acteurvoornaam, Acteurfamilienaam, Personnage}, Rating, {CrewID, CrewVoornaam, Crewfamilienaam, Functie})
1NFFilm = (FilmID, Titel, ProductiehuisID, Productiehuis, ReleaseDate,
KorteInhoud, Rating)Cast = (FilmID, ActeurID, ActeurVoornaam, ActeurFamilienaam, Personage)CrewDetails = (FilmID, CrewID, Crewvoornaam, CrewFamilienaam, Fucntie)
2NF→ Elke afhankelijkheid afsplitsen: enkel kijken naar tabellen met samengestelde sleutelFilm = (FilmID, Titel, ProductiehuisID, Productiehuis, ReleaseDate,
KorteInhoud, Rating)Cast = (FilmID, ActeurID, Personage)Acteur = (ActeurID, ActeurVoornaam, ActeurFamilienaam)CrewDetails = (FilmID, CrewID, functie)Crew = (CrewID, CrewVoornaam, CrewAchternaam)
3NFFim = (FilmID, Titel, ProductiehuisID, ReleaseDate, KorteInhoud, Rating)Productiehuis = (ProductiehuisID, Productiehuis) Cast = (FilmID, ActeurID, Personage)Acteur= (ActeurID, ActeurVoornaam, ActeurFamilienaam)CrewDetails = (FilmID, CrewID, functie)Crew = (CrewID, CrewVoornaam, CrewAchternaam)
EXTRA VRAAG:
Productiehuis
Film Cast Acteur
Crew details Crew
Functie
Personage
2
Wij zijn er bij opgave van uitgegaan dat iemand van de technische ploeg slechts 1 functie kan uitoefenen. Stel welke gevolgen heeft het voor organisatie en voor het ERD als iemand van de technische ploeg meerdere functies zou hebben.
Oefening: het Songfestival
Stel dat je al jaren fan bent van het songfestival en dat je alle gegevens hierover bijhoudt in een database. Van elk festival noteer je telkens de plaats (land en stad) waar het wordt georganiseerd en de datum wanneer het plaatsvindt. Je houdt ook in detail bij welke scores de deelnemende artiesten verkregen van de verschillende landen. Je kan dan ook het volgende overzicht afdrukken voor elk songfestival ! Je moet dus uit je databank informatie kunnen halen zoals hoeveel keer een land heeft meegedaan, de totaalscore van land in een bepaald jaar, …Normaliseer het onderstaande rapport:
Songfestival: 2003Plaats: Riga, LetlandDatum: 24/mei
Land: TurkijeArtiest: Hannelore CasteelsLied: Ik ben vandaag zo vrolijk
Score overzicht punten voorrondeLand: PuntenBelgië 12Nederland 10Rusland 10…Totaal 167
Score finaleLand: PuntenFrankrijk 12Duitsland 10Rusland 9…Totaal 134
Land: BelgiëArtiest: Hannelore Casteels SeniorLied: Sanomi memeee amimameeemamooeeeeee
Score overzicht punten voorrondeLand: PuntenTurkije 8Nederland 5Rusland 12…Totaal 165
Score finale
3
Land: PuntenDuitsland 10Rusland 9Nederland 12…Totaal 109
Mogelijke entiteiten: Land, Songfestival, Artiest Attributen: Datum, Totaal, Plaats, Titelsong, Score
Teken het ERD
Herhalende groepen: Song (?), ScoresVoorronde, ScoreFinale
Normaliseer het rapport
???
Oefening: Het sponsorbureau
Je hebt een bureau dat sponsoring zoekt voor projecten van klanten. Je ontwerpt zelf een database voor het verwerken van je klantengegevens met hun projecten en zorgt ervoor dat je een overzicht kan drukken van alle sponsorgelden die je hebt verzameld. Alle anonieme giften worden onder de persoon anoniem ondergebracht. Hierdoor kan een persoon (bv “anoniem”) meerdere keren sponsorgeld storten. Ook personen waarvan de naam is gekend, kunnen meerdere keren sponsorgeld storten. Van elke storting aan sponsorgeld moet steeds het bedrag en de datum van de storting worden bijgehouden.Je organiseert in overleg met de klant ook evenementen om aan sponsoring te komen. Er zijn wel kosten verbonden aan dergelijke evenementen. Dus per evenement moet je een overzicht kunnen geven van de gemaakte kosten.
Land
Songfestival
Song
Scores voorronde
Score land
Score finaleArtiest
Deelnemend land
4
Teken het ERD
Netto-opbrengst en tekort op de winst gaan we niet opnemen in de normalisatie
5
Normaliseer het rapport
0NFProject = (ProjectID, Project, KlantID, Vereniging, Adres, Postcode, Gemeente,
VereistBedrag, {SponsorID, Voornaam, Familienaam, SponsorAdres, SponsorPostcode, SponsorGemeente, Bedrag, Datum}, {EvenementID, Evenement, EvenementDatum, {Uitgave, UitgaveBedrag}, Inkomsten})
1NFProject = (ProjectID, Project, KlantID, Vereniging, Adres, Postcode, Gemeente,
VereistBedrag)Sponsoring = (ProjectID, SponsorID, Voornaam, Familienaam, SponsorAdres,
SponsorPostcode, SponsorGemeente, Bedrag, Datum)Evenement = (ProjectID, EvenementID, Evenement, EvenementDatum, Inkomsten)
→ ProjectID hier geen sleutel omdat je anders niet weet bij welk project het evenement hoort EvenementID = enkelvoudige sleutel
Uitgave = (EvenementID, UitgaveID, Uitgave, UitgaveBedrag)→ EvenementID is geen sleutel UitgaveID = enkelvoudige sleutel
ProjectID bij de voorlaatste en EvenementID bij de laatste zijn geen sleutels omdat we er vanuit gaan dat een evenement / uitgave sowieso bij 1 project / evenement hoort → dus moet je niet meer expliciet vermelden, maar moet wel opgenomen worden in de tabel om de relatie met de vorige tabel aan te duiden
2NFProject = (ProjectID, Project, KlantID, Vereniging, Adres, Postcode, Gemeente,
VereistBedrag)Sponsoring = (ProjectID, SponsorID, Bedrag, Datum)Sponsor = (SponsorID, Voornaam, Familienaam, SponsorAdres,
SponsorPostcode, SponsorGemeente)
Klant Project
Evenement
Vereist bedrag
Sponsoring
Sponsor
Bedrag
Datum
UitgavePost
Omschrijving
Inkomsten
Omschrijving Bedrag
Sponsoring
6
Evenement = (ProjectID, EvenementID, Evenement, EvenementDatum, Inkomsten)Uitgave = (EvenementID, UitgaveID, Uitgave, UitgaveBedrag)
3NFProject = (ProjectID, Project, KlantID, VereistBedrag)Klant = (KlantID, Vereniging, Adres, Postcode)Gemeente = (Postcode, Gemeente)Sponsoring = (ProjectID, SponsorID, Bedrag, Datum)Sponsor = (SponsorID, Voornaam, Familienaam, SponsorAdres,
SponsorPostcode)SponsorGemeente = (SponsorPostcode, SponsorGemeente)
→ Want wordt al geheel vermeld in entiteit GemeenteEvenement = (ProjectID, EvenementID, Evenement, EvenementDatum, Inkomsten)Uitgave = (EvenementID, UitgaveID, Uitgave, UitgaveBedrag)
Oefening: De elektronische boekhandel
Een grote boekhandel beslist om een electronic bookshop te creëren via hun website. Bezoekers van de website krijgen een elektronische caddy. Telkens zij een boek wensen te kopen, nemen zij dit boek op in hun caddy. Bij het afsluiten van de aankopen, moet de klant zijn persoonlijke gegevens opgeven.Bestaande klanten vullen hiervoor hun klantnummer in waarna zijn persoonlijke gegevens worden opgehaald. Nieuwe klanten moeten in een apart formulier hun gegevens invullen, waarna een klantnummer wordt aangemaakt. Elke klant moet het nummer van zijn kredietkaart ingeven vooraleer de aankoop kan worden bevestigd. Een klant kan in principe bij elke aankoop een verschillende kredietkaart opgeven. Na het bevestigen van de caddy krijgt de klant volgende overzicht van zijn aankopen:
Teken het ERD
7
De nummer van het kredietkaart moet elke keer opnieuw opgegeven worden, dus dit nummer wordt niet verbonden met de klantgegevens
Begrippen:- Caddy- Customer- Book
Totaal boek → kan je opnemen in je ERD, maar dit is niet noodzakelijk. Het is een berekend attribuut
In cirkel met stippellijnen aan 'CaddyContent'
Normaliseer het rapport
0NFCaddy = (CaddyNumber, Date, CustomerNumber, Voornaam, Familienaam,
Address, Postalcode, Gemeente, CreditcardNumber, {ISBN, Title, {AuteurID, AuteurVoornaam, AuteurFamilienaam}, Quantity, Price})
1NFVoorbereidende stap:Caddy = (CaddyNumber, Date, CustomerNumber, Voornaam, Familienaam,
Address, Postalcode, Gemeente, CreditcardNumber)CaddyContent = (CaddyNumber, ISBN, Title, {AuteurID, AuteurVoornaam,
AuteurFamilienaam}, Quantity, Price)Volledig uitgewerkt:Caddy = (CaddyNumber, Date, CustomerNumber, Voornaam, Familienaam,
Address, Postalcode, Gemeente, CreditcardNumber)CaddyContent = (CaddyNumber, ISBN, Title, Quantity, Price) → samengestelde
sleutelAuteursteam = (ISBN, AuteurID, AuteurVoornaam, AuteurFamilienaam)
→ samengestelde sleutel
2NFCaddy = (CaddyNumber, Date, CustomerNumber, Voornaam, Familienaam,
Address, Postalcode, Gemeente, CreditcardNumber)CaddyContent = (CaddyNumber, ISBN, Quantity)
Klant CaddyCreditcardNumber
Caddy Content
Book
8
Book = (ISBN, Title, Price)Auteursteam = (ISBN, AuteurID)Auteur = (AuteurID, AuteurVoornaam, AuteurFamilienaam)
3NFCaddy = (CaddyNumber, Date, CustomerNumber, CreditcardNumber)Customer = (CustomerNumber, Voornaam, Familienaam, Address, Postalcode,
Gemeente)CaddyContent = (CaddyNumber, ISBN, Quantity)Book = (ISBN, Title, Price)Auteursteam = (ISBN, AuteurID)Auteur = (AuteurID, AuteurVoornaam, AuteurFamilienaam)Gemeente = (Postalcode, Gemeente)
Oefening: De souvenierverkoop
Een bedrijfje dat souveniers verkoopt, heeft niet alleen een winkel maar heeft ook een aantal verkopers in dienst die met hun souvenierkarretje erop uittrekken om souveniers te verkopen. Elke verkoper kiest elke week (van maandag tot zondag) een locatie uit waar hij de hele week blijft staan.De prijs van een souvenier kan verschillend zijn, afhankelijk van de plaats waar het souvenierkarretje is opgesteld (of met andere woorden: afhankelijk van de plaats waar het wordt verkocht). Op eenzelfde plaats geldt echter wel steeds dezelfde prijs voor dat souvenier, ongeacht de verkoper. Op het einde van elke dag brengt elke verkoper een overzicht binnen wat die dag precies werd verkocht.Normaliseer het volgende overzicht (voorzie extra velden voor de sleutels):
Aard van het rapport gaat een goede hint geven van de herhalende groepen
Teken het ERD
Begrippen:- Verkoper- Plaats- Weeknummer- Artikel- Plaats en artikel bepalen prijs
9
1°Als men een veel-op-veelrelatie wil oplossen in ERD → altijd samengestelde sleutel in uw normalisatie2°Als er meer dan 3 attributen zijn, zoals bij VerkoopDetail dan kan je 1 uniek attribuut maken, bv VerkoopDetailID. De 3 of meer andere attributen worden dan niet gebruikt in de normalisatie → vereenvoudiging
Hier: VerkoperID, PlaatsID, ArtikelID en Datum worden vervangen doorVerkoopDetailID
Normaliseer het rapport
0NFVerkoper = (VerkoperID, Voornaam, Familienaam, {PlaatsID, Plaats, Datum,
{ArtikelID, Artikel, Prijs, Aantal}})
1NF→ Zorgen dat er geen herhalende groepen meer zijnVerkoper = (VerkoperID, Voornaam, Familienaam)VerkoopLocatie = (VerkoperID, PlaatsID, Plaats, Datum)
→ Datum onderstreept: 1 verkoper op 1 datum op 1 plaatsVerkoperDetail = (VerkoperID, PlaatsID, Datum, ArtikelID, Artikel, Prijs, Aantal)
2NF→ Niet-sleutelvelden onafhankelijk makenVerkoper = (VerkoperID, Voornaam, Familienaam)VerkoopLocatie = (VerkoperID, PlaatsID, Datum)Plaats = (PlaatsID, Plaats)VerkoperDetail = (VerkoperID, PlaatsID, Datum, ArtikelID, Aantal)Artikel = (ArtikelID, Artikel)PrijsLocatie = (ArtikelID, PlaatsID, Prijs)
Verkoper Plaats
Verkoop Locatie
VerkoopDetail
Artikel
AanbodPlaatsID VerkoperID
PlaatsIDDatum
Prijs
ArtikelID
VerkoperID
PlaatsID
ArtikelID
Datum
VerkoperDetailID
10
3NF= 2NF
Oefening: Het facturatiesysteem
Sitautieschets:Een bedrijf verkoopt goederen aan haar klanten. Per order kan een klant meerdere producten bestellen. De prijzen van de goederen kunnen doorheen het jaar variëren, maar natuurlijk wil het bedrijf op het einde van het jaar de juiste omzet kunnen berekenen.De orders van de klanten worden niet in één keer naar de klant verzonden. Als een klant bv. 5 stuks van product X besteld en 7 stuks van product Y, dan is het mogelijk dat er eerst een verzending en facturatie gebeurt van 3 stuks van product X en 4 stuks van product Y en nadien een tweede verzending en facturatie van de overblijvende goederen. Bij één order kunnen dus meerdere facturen/verzendingen horen. Een factuur/verzending is natuurlijk gekoppeld aan één order. Op elke factuur wordt steeds nauwkeurig afgedrukt welke en hoeveel producten er worden gefactureerd. Het is ook mogelijk dat bij een order nog geen enkele verzending en facturatie is gebeurd.
Teken het ERD voor deze situatie.
Oefening: De consultants
De firma ABC Consultants verhuurt haar werknemers aan klanten waar zij meewerken aan projecten. Elk project krijgt een unieke identificatiecode. Een medewerker kan in dezelfde periode tegelijkertijd aan meerdere projecten bij verschillende klanten meewerken.Per project wordt een kilometervergoeding vastgelegd (aantal km + bedrag per km) dat geldig is voor alle werknemers die aan het betreffende project meewerken. Indien een werknemer niet bij de klant aan het project werkt, maar bij de firma ABC Consultants, worden 0 km opgegeven. Om de facturen te kunnen maken, moet elke medewerker een time sheet bijhouden. Hierbij noteert hij per dag aan welke projecten hij heeft gewerkt. De medewerkers noteren dit telkens per dagdeel (DAG = volledige dag, VM = voormiddag, NM= namiddag).
Teken het ERDNormaliseer het rapport
11
Oefening: oogartsenpraktijk
Een privépraktijk van oogartsen heeft verschillende mensen in dienst: oogartsen, medische assistenten, administratief personeel. Het administratief personeel ontvangt de patiënten, noteert afspraken, noteert de gegevens van nieuwe patiënten en wijst ze toe aan een oogarts. De medische assistenten voeren een aantal onderzoeken uit (bv. oogdrukmeting, meting gezichtsveld, …).Van elk personeelslid worden naast naam en adresgegevens ook de behaalde diploma’s genoteerd. Een personeelslid kan meerdere diploma’s hebben behaald.Van elke patiënt worden de persoonlijke gegevens genoteerd (naam, adresgegevens, geboortedatum). Elke patiënt krijgt ook een oogarts toegewezen.Patiënten komen op consultatie na vooraf gemaakte afspraken. Van elke afspraak wordt datum en uur genoteerd. Tevens wordt op dat moment meteen aangeduid welke onderzoeken er moeten worden uitgevoerd. Bij sommige patiënten is dit alleen ‘consultatie oogarts’, maar bij andere patiënten kan men ook aanduiden dat er tevens een oogdrukmeting en een onderzoek gezichtsveld moeten worden uitgevoerd. Het informatiesysteem bevat dus een lijst van alle mogelijke types onderzoeken.Niet alle medische assistenten kunnen alle onderzoeken uitvoeren. Het informatiesysteem moet kunnen bijhouden wie welke onderzoeken mag uitvoeren. Oogartsen kunnen uiteraard alle onderzoeken uitvoeren. Het administratief personeel mag geen enkel onderzoek uitvoeren.Zodra een patiënt zich voor een afspraak heeft aangeboden, duidt men aan dat de patiënt gekomen is. Door dit in apart aan te duiden, kan men later nagaan welke patiënten zich niet aan de afspraken houden. Men kan ze dan nadien eventueel contacteren. Telkens een patiënt zich aanbiedt op een afspraak ziet men ook meteen welke onderzoeken er moeten worden uitgevoerd. Indien er naast het standaard ‘consultatie oogarts’ nog andere onderzoeken moeten worden uitgevoerd, dan zullen de medische assistenten de patiënt ophalen uit de wachtkamer naargelang de onderzoeken die zij mogen uitvoeren. Elke medische assistent noteert steeds de uitslag van het onderzoek. Het informatiesysteem registreert automatisch welk
12
personeelslid het onderzoek heeft uitgevoerd. Ook bij het standaard ‘consultatie oogarts’ wordt de oogarts automatisch genoteerd. De reden hiervoor is dat men op die manier kan nagaan welke patiënten niet behandeld zijn geweest door zijn normale oogarts. Bij ziekte van een oogarts probeert men immers zijn patiënten te verwittigen en een nieuwe afspraak te maken. Bij dringende dossiers zal men trachten de patiënt door een andere oogarts te laten behandelen.Zodra alle voorbereidende onderzoeken zijn uitgevoerd, zal de patiënt door zijn oogarts in de wachtkamer worden opgehaald voor de consultatie. Ook de oogarts noteert de uitslag van zijn onderzoek.
Teken het ERD voor dit systeem en neem de belangrijkste attributen erin op zoals je ze uit deze beschrijving kunt afleiden.
Oefening: De masterproeven
Je bent aangesteld als coördinator van de meesterproeven. Je wilt hiervoor een database ontwerpen waarmee je de voorstellen en de verdedigingen van de meesterproeven kunt verwerken. Elke meesterproef heeft een promotor. Voor de verdediging moet je twee assessoren aanduiden en een datum, uur en lokaal vastleggen. Een personeelslid kan promotor zijn voor de ene meesterproef en assessor voor een andere meesterproef. Elk lokaal krijgt een lokaalNr of naam en is op een bepaalde campus gelegen. Het is de bedoeling om in je database ook de specificaties (aanwezig materiaal, aantal zitplaatsen, …) te kunnen verwerken. Van deze campus is het adres volledig gekend.Het is zeker de bedoeling om lijsten zoals het onderstaande rapport te kunnen afdrukken per academiejaar. Dus ook gegevens van voorgaande academiejaren moeten kunnen worden afgedrukt.Je wenst de nodige rapporten te kunnen afdrukken: overzichten verdedigingen per dag, per docent, per lokaal, ….
13
Normaliseer het bovenstaande rapport
Oefening: De wijnhandelaar
Je wordt in België wijnverdeler van Sloveense wijn. Je wenst hiervoor een database te ontwerpen waarin je alle gegevens van de sloveense wijnen en hun wijnbouwers kunt verwerken.Normaliseer de gegevens vanhet onderstaande rapport.Let op: een wijnsoort kan natuurlijk door meerdere wijnhuizen worden verkocht. Voorzie de nodige sleutels.
De kamporganisatie
Deel 1: ERDEen jeugdorganisatie organiseert elk jaar een zomerkamp. De organisatie heeft de beschikking over een terrein met verschillende blokhutten waarin telkens een 15-tal
14
deelnemers kunnen overnachten. Elke deelnemer wordt aan een blokhut toegewezen. Binnen de groep 'kampeerders' van een blokhut is er steeds een 'blokhutleider' die toezicht houdt. Er worden verschillende wedstrijden en activiteiten georganiseerd en alle leden van eenzelfde blokhut nemen telkens allemaal deel van een activiteit. Aan het begin van het zomerkamp beslissen alle deelnemers van een blokhut aan welke zij deelnemen. Het is niet de bedoeling dat de jeugdorganisatie ba het zomerkamp de gegevens (wie in welke blokhut zat of de activiteiten waaraan een blokhut deelnam) bijhoudt.
Teken het ERD en geef de belangrijkste attributen.
- Blokhut- Deelname- Leider: ja/nee veld- Activiteiten
Als je 1 deelnemer mist, klopt je databank niet meer → veel-op-veel relatie tussen deelnemer en activiteit deze relatie dus niet tekenen
Deel 2: NormalisatieNormaliseer het volgende rapport:
Blokhut Deelnemer
Deelname
Activiteit
LeiderHerhalende groep samenstelling
Herhalende groep van deelnemende activiteiten
15
0NVBlokhut = (BlokhutID, Omschrijving, {DeelnemerID, Naam, Voornaam,
Geboortedatum, Leider}, {Datum, ActiviteitID, OmschrijvingActiviteit,Bedrag, Score})
→ 1ste herhalende groep: Deelnemers→ 2de herhalende groep: DeelnemersActiviteit
1NVBlokhut = (BlokhutID, Omschrijving)Deelnemers = (BlokhutID, DeelnemerID, Naam, Voornaam, Geboortedatum, Leider)DeelnameActiviteit = (BlokhutID, Datum, ActiviteitID, OmschrijvingActiviteit, Bedrag,
Score)
2NVBlokhut = (BlokhutID, Omschrijving)Deelnemers = (BlokhutID, DeelnemerID, Naam, Voornaam, Geboortedatum, Leider)DeelnameActiviteit = (BlokhutID, ActiviteitID, Score)Activiteiten = (ActiviteitID, Datum, OmschrijvingActiviteit, Bedrag)
3NV = 2NV
Deel 3: SQLDe volgende database bevat de gegevens van de organisatoren van een zomerkamp.De deelnemers zijn ondergebracht in blokhutten, die aan activiteiten deelnemen. Alle deelnemers van een blokhut nemen steeds deel aan dezelfde activiteiten. Per blokhut is er een blokhutleider. De databank bevat gegevens van 1 zomerkamp.
16
Betekenis van de tabellen:- tblDeelnemers deelnemers aan het zomerkamp- tblBlokhutten de verschillende blokhutten die tijdens het zomerkamp
gebruikt kunnen worden- tblBlokhutSamenstelling geeft aan welke deelnemer in welke blokhut logeert. Het
veldje leider is een Yes/No veld dat aangeeft of diepersoon de blokhutleider is
- tblActiviteiten de verschillende activiteiten die worden georganiseerd- tblDeelname geeft per blokhut weer aan welke activiteiten de blokhut
deelneemt
Geef de SQL statements om volgende informatie uit de database te halen; benoem steeds eventueel berekende gegevens:
Blokhut
Blokhut samenstelling
Deelnemer
Deelname
Activiteit
BlokhutID
BlokhutID
DeelnemerID
DeelnemerID
Jaar
17
1. Welke blokhutten zijn tijdens het zomerkamp niet in gebruik? Geef enkel de omschrijving van deze blokhutten.
Eerste stap: welke blokhutten zijn wel in gebruik?SELECT BlokhutIDFROM tblBlokhutten INNER JOIN tblBlokhutSamenstelling ON
tblBlokhutten.BlokhutID = tblBlokhutSamenstelling.BlokhutID → Subquery
Tweede stap: selecteer alle blokhutten die niet in de voorgaande lijst voorkomenSELECT OmschrijvingFROM tblBlokhuttenWHERE BlokhutID NOT IN(SELECT BlokhutIDFROM tblBlokhutten INNER JOIN tblBlokhutSamenstelling ON
tblBlokhutten.BlokhutID = tblBlokhutSamenstelling.BlokhutID)
2. Voor sommige activiteiten moeten de deelnemers een extra bijdrage betalen (veldje Bedrag). Wat is de totale som die de kamporganisator hiervoor intvangt?(Tip: maakt eerst een query die het aantal deelnemers levert per activiteit en het te betalen bedrag voor die activiteit)
Query van de tipSELECT tblActiviteit.ActiviteitID, Count(DeelnemerID) As AantalDeelnemers, BedragFROM (((tblActiviteiten INNER JOIN tblDeelname ON tblActiviteiten.ActiviteitenID = tblDeelname.ActiviteitID) INNER JOIN tblBlokhutten ON tblBlokhutten.BlokhutID = tblDeelname.BlokhutID) INNER JOIN tblBlokhutSamenstelling ON tblBlokhutten.BlokhutID = tblBlokhutSamenstelling.BlokhutID)GROUP BY tblActiviteit.ActiviteitID, Bedrag
Oplossing:SELECT AantalDeelnemers * Bedrag AS TotaalBedragFROM (SELECT tblActiviteit.ActiviteitID, Count(DeelnemerID) As AantalDeelnemers, BedragFROM (((tblActiviteiten INNER JOIN tblDeelname ON tblActiviteiten.ActiviteitenID = tblDeelname.ActiviteitID) INNER JOIN tblBlokhutten ON tblBlokhutten.BlokhutID = tblDeelname.BlokhutID) INNER JOIN tblBlokhutSamenstelling ON tblBlokhutten.BlokhutID = tblBlokhutSamenstelling.BlokhutID)GROUP BY tblActiviteit.ActiviteitID, Bedrag)
3. Wie is de jongste leider? Geef de naam als een lange string, en zijn geboortedatum
Eerste stap: alle geboortedata verzamelenSELECT GeboortedatumFROM tblDeelnemers
Jongste persoon = persoon met geboortedatum <= aan alle andere geboortedata
18
Oplossing:SELECT Naam & “ “ & Voornaam AS Deelnemer, GeboortedatumFROM tblDeelnemersWHERE Geboortedatum <= ALL(SELECT GeboortedatumFROM tblDeelnemers)
OF:SELECT Naam & “ “ & Voornaam AS Deelnemer, GeboortedatumFROM tblDeelnemersWHERE Geboortedatum = (SELECT max(geboortedatum) FROM tblDeelnemers)
4. Aan welke activiteiten nemen meer dan 3 blokhutten deel? Geef de omschrijving van de blokhut en het aantal activiteiten
Selecteren op een groepstotaal → HAVING-component
SELECT Omschrijving, Count(BlokhutID) AS AantalFROM tblActiviteiten INNER JOIN tblDeelname ON tblActiviteiten.ActiviteitID = tblDeelname.ActiviteitIDGROUP BY OmschrijvingHAVING Count(BlokhutID) > 3
5. Geef per blokhut een overzicht van de deelnemers (naam als een lange string), per blokhut in dalende volgorde van geboortedatum. De output toont dus deelnemer, de blokhut en de geboortedatum
SELECT Omschrijving, Naam & “ “ & Voornaam AS Deelnemer, GeboortedatumFROM (tblBlokhutten INNER JOIN tblBlokhutSamenstelling ON tblBlokhut.BlokhutID = tblBlokhutSamenstelling.BlokhutID) INNER JOIN tblDeelnemers ON tblDeelnemers.DeelnemerID = tblBlokhutSamenstelling.DeelnemerIDORDER BY Omschrijving, Geboortedatum DESC
→ DESC = descending >< voor ascending moet je er niets bijzetten
De filmindustrie
19
Geef de SQL-statements voor volgende vragen:
1. In hoeveel films heeft elke acteur meegespeeld?
SELECT ActeurVoornaam & “ “ & ActeurFamilienaam AS Acteur, Count(FilmID) AS Aantal FROM Acteur INNER JOIN FilmPersonnages ON Acteur.ActeurID = Filmpersonnage.ActeurIDGROUP BY ActeurVoornaam & “ “ & ActeurFamilienaam
20
2. Hebben we productiehuizen in onze databank waarvan we geen films hebben geregistreerd?
SELECT Productiehuis→ Veldnaam
FROM Productiehuis→ Tabelnaam
WHERE ProductiehuisID NOT IN (SELECT ProductiehuisID FROM Film)
3. Hoeveel filmen hebben we met rating 'PG'?
SELECT Count(FilmID) AS AantalFROM FilmWHERE Rating = “PG”
4. Welke films hebben meer dan 10 acteurs?
SELECT Titel, Count(ActeurID) AS AantalFROM Film INNER JOIN FilmPersonnages ON Film.FilmID = FilmPersonnages.FilmIDGROUP BY TitelHAVING Count(ActeurID) >= 10
ORDER BY → sorteren en alle informatie tonenGROUP BY → sorteren en alles herleiden tot 1 lijntje per groep hij toont
5. Geef een volledig overzicht van de acteurs per film
SELECT Titel, ActeurVoornaam & “ “ & ActeurFamilienaam AS ActeurFROM Film INNER JOIN FilmPersonnagse ON Film.FilmID = FilmPersonnages.FilmID) INNER JOIN Acteurs ON Acteurs.ActeurID = FilmPersonnages.ActeurIDORDER BY Titel, ActeurFamilienaam, ActeurVoornaam
6. Welke acteurs hebben slechts voor 1 regisseur (= functie binnen technische ploeg) gewerkt?
SELECT ActeurVoornaam & “ “ & ActeurFamilienaam AS Acteur, Count(FunctieID) AS AantalRegisseursFROM ((Acteur INNER JOIN Filmpersonnage ON FilmPersonnage.ActeurID = Acteur.ActeurID) INNER JOIN Film ON Film.FilmID = FilmPersonnages.FilmID) INNER JOIN TechnPloeg ON Film.FilmID = TechnPloeg.FilmIDWHERE FunctieID = 4GROUP BY ActeurVoornaam & “ “ & ActeurFamilienaamHAVING Count(FunctieID) = 1
7. Welke acteur heeft in 2009 in geen enkele film gespeeld?
21
SELECT ActeurVoornaam & “ “ & Familienaam AS ActeurFROM ActeurWHERE ActeurID NOT IN(SELECT ActeurIDFROM FilmPersonnage INNER JOIN Film ON FilmPersonnage.FilmID = Film.FilmIDWHERE Year(ReleaseDATe) = 2009))
8. Welke functies komen meer dan 2 keer voor in eenzelfde film (geef ook de naam van deze film)?
SELECT Functie, Titel, Count(FilmID) AS AantalFROM (Film INNER JOIN TechnPloeg ON Film.FilmID = TechnPloeg.FilmID) INNER JOIN Functies ON TechnPloeg.FunctieID = Functies.FunctieIDGROUP BY Functie, TitelHAVING Count(FilmID) >2
9. Welke acteurs beelden in welke films meer dan 1 personage uit?
SELECT ActeurVoornaam & “ “ & Familienaam AS Acteur, Titel, Count(Personnage) AS AantalFROM (Acteur INNER JOIN FilmPersonnage ON Acteur.ActeurID = FilmPersonnage.ActeurID) INNER JOIN Film ON FilmPersonnage.FilmID = Film.FilmIDGROUP BY ActeurVoornaam & “ “ & Familienaam, TitelHAVING Count(Personnage) >1
10. Welke film werd het eerst uitgebracht?
SELECT TitelFROM FilmWHERE ReleaseDate <= ALL(SELECT ReleaseDate FROM Film)
22