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?

  1. ASELECT Afdeling, AVG(Salaris) FROM Medewerker GROUP BY Afdeling HAVING AVG(Salaris) >= 300
  2. BSELECT Afdeling, AVG(Salaris) FROM Medewerker WHERE AVG(Salaris) >= 300 GROUP BY Afdeling
  3. 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.

Dit onderwerp oefenen Naar de onderwerppagina

Meer vragen over Basis van databases

  1. De tabel Omzet (Filiaal, Bedrag) bevat zeven rijen: (A, 500), (A, 700), (B, 300), (B, 400), (C, 1200), (D, 200), (D, 900). Hoeveel rijen geeft SELECT Filiaal, SUM(Bedrag) FROM Omzet GROUP BY Filiaal HAVING SUM(Bedrag) >= 1000?
  2. De tabel Medewerker (Naam, Afdeling, Salaris) heeft acht rijen, met per afdeling de volgende salarissen: Verkoop 320, 280, 350; Ontwikkeling 400, 310; Administratie 260, 300; Planning 330. Hoeveel rijen geeft SELECT Afdeling, COUNT(*) FROM Medewerker WHERE Salaris >= 300 GROUP BY Afdeling HAVING COUNT(*) >= 2?
  3. De tabel Medewerker (MedewerkerNr, Naam, AfdelingID) heeft vier rijen met als waarden voor AfdelingID achtereenvolgens 10, 20, 10 en NULL. De tabel Afdeling (AfdelingID, Afdelingsnaam) heeft drie rijen met AfdelingID 10, 20 en 30. Hoeveel rijen geeft SELECT Medewerker.Naam, Afdeling.Afdelingsnaam FROM Medewerker INNER JOIN Afdeling ON Medewerker.AfdelingID = Afdeling.AfdelingID?
  4. De tabel Medewerker (MedewerkerNr, Naam, AfdelingID) heeft vijf rijen met als waarden voor AfdelingID achtereenvolgens 10, 20, 10, NULL en NULL. De tabel Afdeling (AfdelingID, Afdelingsnaam) heeft drie rijen met AfdelingID 10, 20 en 30. Hoeveel rijen geeft SELECT Afdeling.Afdelingsnaam, Medewerker.Naam FROM Afdeling LEFT OUTER JOIN Medewerker ON Afdeling.AfdelingID = Medewerker.AfdelingID?
  5. Kolom x van tabel R heeft vier rijen met de waarden 1, 1, 2, 3, en kolom x van tabel S heeft vier rijen met de waarden 1, 1, 2, 4. Hoeveel rijen geeft SELECT * FROM R INNER JOIN S ON R.x = S.x?