Maison >base de données >tutoriel mysql >Comment la clause GROUP BY de SQL fonctionne-t-elle avec et sans fonctions d'agrégation ?
Clause GROUP BY
de SQL : une analyse approfondie
La clause SQL GROUP BY
est un outil puissant pour regrouper des lignes en fonction de colonnes spécifiées, permettant des calculs agrégés (comme SUM
, COUNT
, AVG
) sur des données groupées. Explorons son comportement avec et sans fonctions d'agrégation.
GROUP BY
Sans fonctions agrégées : le piège
L'utilisation de GROUP BY
sans fonction d'agrégation entraîne une erreur. Prenons cet exemple :
<code class="language-sql">SELECT * FROM order_details GROUP BY order_no</code>
Cela échoue car GROUP BY
nécessite que toutes les colonnes non agrégées de la liste SELECT
soient également incluses dans la clause GROUP BY
. Le caractère générique *
sélectionne toutes les colonnes, ce qui rend la requête ambiguë puisque la base de données ne peut pas déterminer la valeur à renvoyer pour les colonnes non groupées au sein de chaque order_no
groupe.
GROUP BY
Avec les fonctions d'agrégation : la solution
Le problème est résolu lors de l'utilisation d'une fonction d'agrégation. Les fonctions d'agrégation fonctionnent sur l'ensemble du groupe, permettant à la requête de produire des résultats significatifs. Par exemple, calculer le prix total de chaque commande :
<code class="language-sql">SELECT SUM(order_price) FROM order_details GROUP BY order_no</code>
Cette requête renvoie avec succès la somme de order_price
pour chaque order_no
unique.
Fonctions agrégées et données groupées : dévoiler les attributs cachés
Les fonctions d'agrégation offrent un moyen d'accéder aux attributs au sein de chaque groupe. La fonction SUM
, dans l'exemple précédent, calcule la somme pour chaque groupe order_no
. Cela démontre la capacité des fonctions d'agrégation à « explorer » des groupes et à récupérer des informations résumées.
Conformité SQL standard : la GROUP BY
règle
Le SQL standard (contrairement à l'approche plus indulgente de MySQL) exige que toutes les colonnes non agrégées de la liste SELECT
apparaissent dans la clause GROUP BY
. Ainsi, la requête suivante est valide :
<code class="language-sql">SELECT order_no, SUM(order_price) FROM order_details GROUP BY order_no</code>
Ceci est valide car order_no
, la colonne non agrégée, est présente dans la clause GROUP BY
. Le même principe s'applique aux requêtes comportant plusieurs colonnes groupées et fonctions d'agrégation :
<code class="language-sql">SELECT order_no, order_price, MAX(order_item) FROM order_details GROUP BY order_no, order_price</code>
Cette requête est valide car order_no
et order_price
sont inclus dans la clause GROUP BY
.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!