Basis van databases
Uit de tabel Medewerker (MedewerkerNr, Afdeling, Salaris) moeten de afdelingen met een gemiddeld salaris van 300 of meer worden opgevraagd, samen met dat gemiddelde. Welk SQL-statement is juist?
- ASELECT Afdeling, AVG(Salaris) FROM Medewerker GROUP BY Afdeling HAVING AVG(Salaris) >= 300
- BSELECT Afdeling, AVG(Salaris) FROM Medewerker WHERE AVG(Salaris) >= 300 GROUP BY Afdeling
- CSELECT Afdeling, AVG(Salaris) FROM Medewerker WHERE Salaris >= 300 GROUP BY Afdeling
Antwoord en toelichting tonen
Antwoord: A. SELECT Afdeling, AVG(Salaris) FROM Medewerker GROUP BY Afdeling HAVING AVG(Salaris) >= 300
Denk bij de verwerking van SQL in deze volgorde: WHERE selecteert rijen uit de tabel in FROM, GROUP BY bundelt ze in groepen, en HAVING selecteert groepen. WHERE is een voorwaarde op afzonderlijke rijen die vóór het groeperen wordt geëvalueerd, dus aggregatiefuncties zoals AVG kunnen er niet in staan. Een voorwaarde op het aggregaat van elke groep hoort in HAVING, dus HAVING AVG(Salaris) >= 300 is de juiste vorm. Met WHERE Salaris >= 300 worden vóór het middelen alleen de medewerkers met een salaris van 300 of meer geselecteerd, wat iets anders betekent, namelijk het gemiddelde over alleen die medewerkers; een afdeling waarvan het totale gemiddelde onder 300 ligt, verschijnt dan toch in het resultaat zolang minstens één van haar medewerkers 300 of meer verdient.