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 ?
- ASELECT Service, AVG(Salaire) FROM Employe GROUP BY Service HAVING AVG(Salaire) >= 300
- BSELECT Service, AVG(Salaire) FROM Employe WHERE AVG(Salaire) >= 300 GROUP BY Service
- 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.
Continuer : 9 autres questions sur Bases des bases de données