ANALYSE 3 INFANL01-3 WEEK CMI Informatica
ANALYSE 3- INFANL01-3 ▸ Vorige les ▸ Omzetten van een datamodel in een databaseontwerp ▸ SET functies (COUNT, MIN, MAX, SUM, AVG, STDEV) ▸ GROUP BY en HAVING.
VORIGE LES
Volgorde uitvoeren SELECT FROM - WHERE - SELECT - ORDER BY Referentiële integriteit FOREIGN KEY spelersnr REFERENCES spelers (spelersnr) ON DELETE/UPDATE RESTRICT/CASCADE/SET NULL Vorige les
SELECT instructie: volgorde van uitvoeren (intern) SELECT [kolommen] [3] FROM [tabellen][1] WHERE [voorwaarde voor rij][2] ORDER BY [kolom][4] 1. FROM2. WHERE a b 3. SELECT4. ORDER BY
Referentiele Integriteit spelernsnr in TEAMS verwijst altijd naar een bestaand spelersnr in SPELERS, dus moeten gesynchroniseerd blijven primary key foreign key
Referentiele Integriteit refererende acties alternatief 1: ON UPDATE CASCADE ON DELETE CASCADE (dwz update/delete van een spelersnr in de SPELERS tabel triggert automatisch een update/delete in TEAMS) alternatief 2: ON UPDATE SET NULL ON DELETE SET NULL
Referentiele Integriteit refererende acties default (SOLID): ON UPDATE RESTRICT ON DELETE RESTRICT (dwz wijzigen/verwijderen van een spelersnr in de SPELERS tabel wordt tegengehouden als spelersnr in TEAMS voorkomt)
OMZETTEN VAN EEN DATAMODEL IN EEN DATABASEONTWERP
Omzetten ERD -> fysieke database ▸ Entiteit-> Tabel (geen spaties, speciale tekens zoals #,%, mag niet met een getal beginnen) ▸ Instantie-> Rij ▸ Attribuut-> Kolom (naam moet unieke zijn binnen een tabel) ▸ Relatie-> Verwijssleutel (FK) (optionaliteit hangt van de relatie af)
Omzetten van een-op-een relatie Hoe wordt een verplichte een-op-een relatie omgezet?
Omzetten van XOR relatie
XOR - 2
Omzetten van een-op-meer relatie Let op de referentiele Integriteit en refererende acties ON UPDATE ON DELETE
Omzetten van supertypen en subtypen (een tabel)
Omzetten van supertypen en subtypen (meerdere tabelen)
JOINs
Join in SQL Een join-tabel is een tabel die afgeleid is van twee of meer tabellen. Afhankelijk van het soort join worden kolommen gecombineerd die dezelfde waarden hebben. Je kan verschillende soorten joins in een query combineren. CROSS JOIN INNER JOIN, NATURAL JOIN OUTER JOIN SELF JOIN
CROSS JOIN Cross join toont een cartesisch product van rijen uit de genoemde tabellen in de join-query. Expliciet: SELECT * FROM employee CROSS JOIN department; Impliciet SELECT * FROM employee, department;
NATURAL JOIN Natural join is gebaseerde op kolommen uit twee of meerdere tabellen. Deze kolommen hebben dezelfde naam. De waarden van deze kolommen moeten gelijk zijn. Resulterende tabel heeft maar een kolom met dezelfde naam Voorbeeld: Select * FROM employee NATURAL JOIN department;
INNER JOIN Inner join is gebaseerde op kolommen uit twee of meerdere tabellen. De waarden van deze kolommen moeten gelijk zijn. Resulterende tabel filtert de kolommen niet zoals bij natural join Voorbeeld: Expliciet: SELECT * FROM employee INNER JOIN department ON employee.DepartmentID = department.DepartmentID; Impliciet: SELECT * FROM employee, department WHERE employee.DepartmentID = department.DepartmentID;
OUTER JOIN Outer join is gebaseerde op kolommen uit twee of meerdere tabellen. Deze kolommen hebben dezelfde naam. De waarden van deze kolommen hoeven niet gelijk te zijn. Resulterende tabel filtert de kolommen niet Outer join kent drie varianten: left,right full Voorbeeld: SELECT * FROM employee LEFT OUTER JOIN department ON employee.DepartmentID = department.DepartmentID;
INNER JOIN en OUTER JOIN Bij join-queries zijn de woorden “inner” en “outer” optioneel te noemen. Default is “inner join” Left, right en full impliceren een outer join
Equi-Join Door het gebruik van vergelijkingsoperator “=” wordt de join ook equi-join genoemd. Voorbeeld: SELECT * FROM employee, department WHERE employee.DepartmentID = department.DepartmentID; Een andere wijze om een equi-join te schrijven is “USING” te gebruiken als de kolommen dezelfde naam hebben. Voorbeeld: SELECT * FROM employee INNER JOIN department USING (DepartmentID);
Self-JOIN Je kan een tabel met zich self joinen als er bijvoorbeeld recursieve relatie is Voorbeeld: SELECT F.EmployeeID, F.LastName, S.EmployeeID, S.LastName, F.Country FROM Employee F INNER JOIN Employee S ON F.Country = S.Country WHERE F.EmployeeID < S.EmployeeID ORDER BY F.EmployeeID, S.EmployeeID;
SET FUNCTIES
SET functies Wat zijn set-functies ? functies met een verzameling (Eng. SET) waarden als input en één enkele waarde als output Welke set-functies zijn er ? COUNT, MIN, MAX, AVG, STDEV Waar zijn set-functies ‘toegestaan’ ? op die plaatsen in een SQL statement waar een verzameling waarden beschikbaar is
SET functies in SELECT component In SELECT component is (als tussenresultaat) beschikbaar: de verzameling rijen beschikbaar die voldoet aan de voorwaarde in de WHERE component voorbeelden: SELECT COUNT(*) FROM spelers; SELECT COUNT(DISTINCT plaats) FROM spelers;
SET functies niet in WHERE component In de WHERE component wordt per rij bekeken of rij-voorwaarde waar is. In rij-voorwaarde is maar één enkele rij beschikbaar, geen verzameling, dus SET functies kunnen niet worden gebruikt in WHERE component.
SET functies niet in WHERE component SELECT * FROM boetes WHERE SUM(bedrag) > 100; //FOUT!! SELECT SUM(bedrag) FROM boetes WHERE bedrag >100; SELECT COUNT(*) FROM boetes WHERE bedrag >100;
SET functies COUNT : aantal waardes MIN : kleinste waarde MAX : grootste waarde SUM : som van een aantal waardes AVG : gemiddelde STDEV: standaard afwijking
COUNT voorbeelden SELECT COUNT(*) FROM boetes;8 SELECT COUNT(bedrag) FROM boetes;7 SELECT COUNT(DISTINCT bedrag) FROM boetes; 4
MIN, MAX voorbeelden SELECT MIN(bedrag) FROM boetes; 25 SELECT MAX(bedrag) FROM boetes; 85
SUM, AVG, STDEV voorbeelden SELECT SUM(bedrag) FROM boetes;420 SELECT AVG(bedrag) FROM boetes;60 SELECT SUM(bedrag)/ COUNT(bedrag);60 SELECT STDEV(bedrag);27
SET functies in SELECT zonder GROUP BY aggregeren over alle rijen van de tabel d.w.z. Behandelen de hele tabel als één groep. NIET toegestaan is: SELECT betalingsnr, MIN(bedrag) FROM boetes; Want: meer waarden voor betalingsnr één waarde MIN(bedrag)
GROUP BY, HAVING definitie SELECT: ::= [ ]
GROUP BY, HAVING GROUP BY [kolom]: groepeert rijen die dezelfde waarde in een kolom hebben (dezelfde waarden van een bepaald attribuut hebben) bijv. GROUP BY kleur HAVING [groep-voorwaarde]: selecteert groepen die aan voorwaarde voldoen
SELECT instructie: volgorde van uitvoeren (intern) volgorde SELECT [kolommen] [5] FROM [tabellen][1] WHERE [voorwaarde voor rij][2] GROUP BY [kolom(men)][3] HAVING [voorwaarde voor groep][4] ORDER BY [kolom][6]
SELECT instructie: volgorde van uitvoeren (intern) volgorde SELECT [kolommen] [5] FROM [tabellen][1] WHERE [voorwaarde voor rij][2] GROUP BY [kolommen][3] HAVING [voorwaarde voor groep][4] ORDER BY [kolom][6]
GROUP BY hoe werkt het (1) FROM BOETESGROUP BY SPELERSNR
GROUP BY hoe werkt het (2) SELECT SPELERSNR, COUNT(BEDRAG) -> SELECT SPELERSNR, SUM(BEDRAG) ->
GROUP BY hoe werkt het (3) zonder GROUP BY ‘zien’ de SET functies maar 1 groep: de hele tabel met GROUP BY ‘zien’ de SET functies meer groepen, en aggregeren over de waarden binnen die groepen !! het kleinste niveau van detail is de groep; dit kan dus NIET: SELECT betalingsnr, spelersnr FROM boetes GROUP BY spelersnr;
HAVING hoe werkt het (1) HAVING selecteert groepen die aan ‘groep-voorwaarde’ voldoen een ‘groep-voorwaarde’ test waarden waarvan er maar 1 per groep is, d.w.z.: waarden van attributen waarop gegroepeerd is (spelersnr), of geaggregeerde waarden binnen een groep (SUM(bedrag))
HAVING hoe werkt het (2) SELECT spelersnr, COUNT(bedrag) FROM boetes GROUP BY spelersnr HAVING SUM(bedrag)>=100 FOUT: SELECT spelersnr, COUNT(bedrag) FROM boetes GROUP BY spelersnr HAVING bedrag >=100
Nogmaals: SELECT instructie in volgorde FROM => hele tabel of join WHERE => selecteert rijen GROUP BY => voegt rijen samen (met zelfde waarde in kolom) HAVING => selecteert groepen SELECT=> maakt nieuwe tabel (zorg ervoor dat een rij precies 1 waarde voor een attribuut heeft) ORDER BY=> sorteert eindresultaat
Opgave: 1. Geef voor elke speler met 2 of meer boetes het totaalbedrag van zijn/haar boetes 2. Als 1, maar negeer boetes van € 25 of minder
Antwoord: 1. SELECT spelersnr, sum(bedrag) FROM boetes GROUP BY spelersnr HAVING COUNT(bedrag)>=2; 2. voeg toe (na FROM): WHERE bedrag>25
Relaties tussen tabellen voorbeeld: administratie van bestelde boeken Voor wie : de werknemers van Internet boekhandel FatBooks.com Functie : het geven van een actueel overzicht van boeken die besteld zijn en nog niet geleverd; bovendien per bestelling wie de bestelling heeft geplaatst
Relaties tussen tabellen entiteiten : klanten, bestellingen, boeken, bestelling is voor 1 klant, maar 1 klant kan N bestellingen doen, dus klanten bestellingen is een 1 : N relatie
Relaties tussen tabellen 1:N Hoe realiseer je een 1:N relatie ? verwijs in de tabel aan de ‘N’ kant van de relatie met een FOREIGN KEY naar de PRIMARY KEY van de tabel aan de ‘1’ kant van de relatie 1N
Relaties tussen tabellen 1:N Er zijn meer bestellingen die naar dezelfde klant verwijzen
Relaties tussen tabellen vraag Vraag : geef de SQL opdracht om de naam en de bestellingen van de klant met KLANTNR = 11 te zien 1 N
Relaties tussen tabellen antwoord Antwoord : SELECT naam, bestelnr FROM klanten, bestellingen WHERE klanten.KLANTNR=bestellingen.KLANTNR AND klanten.KLANTNR=11; om de bestellingen van een klant te vinden moet je dus aan de ‘andere’ kant beginnen: door de bestellingen voor een bepaalde klant te selecteren 1 N
Relaties tussen tabellen M:N Relatie: bestellingen boeken 1 bestelling omvat meer boeken 1 boek(titel) komt voor op meer bestellingen, dus bestellingen boeken is een M : N relatie (veel op veel)
Relaties tussen tabellen M:N Hoe realiseer je een M:N relatie ? maak een extra tabel waarin elke rij aan de ene kant verwijst naar een bestelling aan de andere kant verwijst naar een boek (de M:N relatie wordt dus gesplitst in een 1:M en een 1:N relatie)
Relaties tussen tabellen M:N Elke bestelregel verwijst enerzijds naar 1 bestelling, en tegelijkertijd anderzijds naar 1 boek
Relaties tussen tabellen M:N vraag Vraag: Geef de SQL opdracht om van de bestelling met bestelnr = 1 te zien: –de naam van de klant –de nrs en auteurs van de bestelde boeken
Relaties tussen tabellen M:N antwoord Antwoord: SELECT naam, boeken.boeknr, auteur FROM klanten, boeken, bestellingen, bestelregel WHERE bestellingen.bestelnr = 1 AND bestellingen.klantnr = klanten.klantnr AND bestellingen.bestelnr = bestelregel.bestelnr AND bestelregel.boeknr = boeken.boeknr;
NULL waarde
NULL In SQL de waarde “NULL” is een markering dat de data nog onbekend “NULL” is geen waarde op zich Wat is het effect van “NULL” op je query? Wat is de uitslag van “SELECT 10 * NULL”? Wat is de uitslag van deze query? SELECT * FROM emp WHERE age > 45
SET functies en NULL SET functies zoals count, avg enz. elimineren NULL waardes en worden niet berekend. SELECT avg(i),avg(j) FROM table Wat is het resultaat? Er zijn twee predicaten voor NULL waardes IS NULL en IS NOT NULL SELECT * FROM emp WHERE age IS NOT NULL