Bases des bases de données

À partir d'une table Employe(NumEmploye, Service, Salaire), on veut obtenir les services dont le salaire moyen est supérieur ou égal à 300, ainsi que ce salaire moyen. Quelle instruction SQL est correcte ?

  1. ASELECT Service, AVG(Salaire) FROM Employe GROUP BY Service HAVING AVG(Salaire) >= 300
  2. BSELECT Service, AVG(Salaire) FROM Employe WHERE AVG(Salaire) >= 300 GROUP BY Service
  3. CSELECT Service, AVG(Salaire) FROM Employe WHERE Salaire >= 300 GROUP BY Service
Afficher la réponse et l'explication

Réponse : A. SELECT Service, AVG(Salaire) FROM Employe GROUP BY Service HAVING AVG(Salaire) >= 300

On raisonne sur le traitement SQL dans cet ordre : WHERE sélectionne des lignes de la table indiquée dans FROM, GROUP BY les rassemble en groupes, et HAVING sélectionne des groupes. WHERE est une condition sur les lignes individuelles, évaluée avant le regroupement ; on ne peut donc pas y écrire de fonctions d'agrégation comme AVG. Une condition sur le résultat agrégé de chaque groupe se place dans HAVING ; HAVING AVG(Salaire) >= 300 est donc la forme correcte. Avec WHERE Salaire >= 300, seuls les employés gagnant 300 ou plus sont sélectionnés avant le calcul de la moyenne, ce qui signifie autre chose, la moyenne sur ces seuls employés ; un service dont la moyenne globale est inférieure à 300 apparaît alors quand même dans le résultat dès qu'au moins un de ses employés gagne 300 ou plus.

S'entraîner sur ce thème Retour au thème

Autres questions sur Bases des bases de données

  1. Une table Vente(Magasin, Montant) contient 7 lignes : (A, 500), (A, 700), (B, 300), (B, 400), (C, 1200), (D, 200), (D, 900). Combien de lignes renvoie SELECT Magasin, SUM(Montant) FROM Vente GROUP BY Magasin HAVING SUM(Montant) >= 1000 ?
  2. Une table Employe(Nom, Service, Salaire) contient 8 lignes ; les salaires par service sont : Commercial 320, 280, 350 ; Développement 400, 310 ; Administration 260, 300 ; Planification 330. Combien de lignes renvoie SELECT Service, COUNT(*) FROM Employe WHERE Salaire >= 300 GROUP BY Service HAVING COUNT(*) >= 2 ?
  3. Une table Employe(NumEmploye, Nom, IdService) contient 4 lignes dont les valeurs IdService sont, dans l'ordre, 10, 20, 10 et NULL. Une table Service(IdService, NomService) contient 3 lignes dont IdService vaut 10, 20 et 30. Combien de lignes renvoie SELECT Employe.Nom, Service.NomService FROM Employe INNER JOIN Service ON Employe.IdService = Service.IdService ?
  4. Une table Employe(NumEmploye, Nom, IdService) contient 5 lignes dont les valeurs IdService sont, dans l'ordre, 10, 20, 10, NULL et NULL. Une table Service(IdService, NomService) contient 3 lignes dont IdService vaut 10, 20 et 30. Combien de lignes renvoie SELECT Service.NomService, Employe.Nom FROM Service LEFT OUTER JOIN Employe ON Service.IdService = Employe.IdService ?
  5. La colonne x de la table R contient 4 lignes de valeurs 1, 1, 2, 3, et la colonne x de la table S contient 4 lignes de valeurs 1, 1, 2, 4. Combien de lignes renvoie SELECT * FROM R INNER JOIN S ON R.x = S.x ?