Il y a une raison de plus pour pourquoi SQL exige-t-il que je spécifie sur quels attributs grouper.
Disons que nous avons deux tableaux simples : friend
et car
où nous stockons des informations sur nos amis et leurs voitures.
Et disons que nous voulons montrer les données de tous nos amis (de la table friend
) et pour chacun de nos amis, le nombre de voitures qu'ils possèdent actuellement, qu'ils ont vendues, qu'ils ont accidentées et le nombre total. Oh, et on veut les anciens en premier, les jeunes en dernier.
Nous ferions quelque chose comme :
SELECT f.id
, f.firstname
, f.lastname
, f.birthdate
, COUNT(NOT c.sold AND NOT c.crashed) AS owned
, COUNT(c.sold) AS sold
, COUNT(c.crashed) AS crashed
, COUNT(c.friendid) AS totalcars
FROM friend f
LEFT JOIN car c <--to catch (shame!) those friends who have never had a car
ON f.id = c.friendid
GROUP BY f.id
, f.firstname
, f.lastname
, f.birthdate
ORDER BY f.birthdate DESC
Mais avons-nous vraiment besoin de tous ces champs dans la base de données des GROUP BY
? Chaque ami n'est-il pas déterminé de manière unique par son id
? En d'autres termes, est-ce que les firstname, lastname and birthdate
dépendent fonctionnellement de la f.id
? Pourquoi ne pas simplement faire (comme on peut le faire dans MySQL) :
SELECT f.id
, f.firstname
, f.lastname
, f.birthdate
, COUNT(NOT c.sold AND NOT c.crashed) AS owned
, COUNT(c.sold) AS sold
, COUNT(c.crashed) AS crashed
, COUNT(c.friendid) AS totalcars
FROM friend f
LEFT JOIN car c <--to catch (shame!) those friends who have never had a car
ON f.id = c.friendid
GROUP BY f.id
ORDER BY f.birthdate
Et si nous avions 20 champs dans le SELECT
(plus ORDER BY
) ? La seconde requête n'est-elle pas plus courte, plus claire et probablement plus rapide (dans les SGBDR qui l'acceptent) ?
Je dis oui. Alors, les spécifications de SQL 1999 et 2003 disent-elles, si cet article est correct : Démystifier le groupe par les mythes