quelle est la différence entre GROUP BY et ORDER BY en sql

119

Quand utilisez-vous lequel en général? Les exemples sont fortement encouragés!

Je parle donc de MySql, mais je ne peux pas imaginer que le concept soit différent sur un autre SGBD

vehomzzz
la source

Réponses:

79

ORDER BY modifie l'ordre dans lequel les articles sont retournés.

GROUP BY agrégera les enregistrements par les colonnes spécifiées, ce qui vous permet d'exécuter des fonctions d'agrégation sur des colonnes non groupées (telles que SUM, COUNT, AVG, etc.).

CMérat
la source
130
Cette déclaration n'a pratiquement aucun sens sans un exemple d'accompagnement.
JohnMerlino
2
je pense que le deuxième exemple sur la page dans le lien est suffisant pour comprendre la différence tutorialspoint.com/sql/sql-group-by.htm
nishantbhardwaj2002
Pouvez-vous donner un exemple?
Rice
249

ORDER BY modifie l'ordre dans lequel les articles sont retournés.

GROUP BY agrégera les enregistrements par les colonnes spécifiées, ce qui vous permet d'exécuter des fonctions d'agrégation sur des colonnes non groupées (telles que SUM, COUNT, AVG, etc.).

TABLE:
ID NAME
1  Peter
2  John
3  Greg
4  Peter

SELECT *
FROM TABLE
ORDER BY NAME

= 
3 Greg
2 John
1 Peter
4 Peter

SELECT Count(ID), NAME
FROM TABLE
GROUP BY NAME

= 
1 Greg
1 John 
2 Peter

SELECT NAME
FROM TABLE
GROUP BY NAME
HAVING Count(ID) > 1

=
Peter
RiddlerDev
la source
2
Que faire si la table a une agecolonne, avec Peters ayant des âges différents et la requête est SELECT NAME, AGE FROM TABLE GROUP BY NAME?
Varun
1
Vous ne pouvez pas renvoyer des colonnes qui ne sont pas dans votre groupe par ou qui ont une méthode. Vous devrez donc soit ajouter l'âge au groupe par, soit faire quelque chose comme Max (Âge).
RiddlerDev
78

ORDER BY: triez les données par ordre croissant ou décroissant.

Considérez le tableau CLIENTS :

+----+----------+-----+-----------+----------+
| ID | NAME     | AGE | ADDRESS   | SALARY   |
+----+----------+-----+-----------+----------+
|  1 | Ramesh   |  32 | Ahmedabad |  2000.00 |
|  2 | Khilan   |  25 | Delhi     |  1500.00 |
|  3 | kaushik  |  23 | Kota      |  2000.00 |
|  4 | Chaitali |  25 | Mumbai    |  6500.00 |
|  5 | Hardik   |  27 | Bhopal    |  8500.00 |
|  6 | Komal    |  22 | MP        |  4500.00 |
|  7 | Muffy    |  24 | Indore    | 10000.00 |
+----+----------+-----+-----------+----------+

Voici un exemple, qui trierait le résultat par ordre croissant par NOM:

SQL> SELECT * FROM CUSTOMERS
     ORDER BY NAME;

Cela produirait le résultat suivant:

+----+----------+-----+-----------+----------+
| ID | NAME     | AGE | ADDRESS   | SALARY   |
+----+----------+-----+-----------+----------+
|  4 | Chaitali |  25 | Mumbai    |  6500.00 |
|  5 | Hardik   |  27 | Bhopal    |  8500.00 |
|  3 | kaushik  |  23 | Kota      |  2000.00 |
|  2 | Khilan   |  25 | Delhi     |  1500.00 |
|  6 | Komal    |  22 | MP        |  4500.00 |
|  7 | Muffy    |  24 | Indore    | 10000.00 |
|  1 | Ramesh   |  32 | Ahmedabad |  2000.00 |
+----+----------+-----+-----------+----------+

GROUP BY: organiser les données identiques en groupes.

Désormais, la table CUSTOMERS contient les enregistrements suivants avec des noms en double:

+----+----------+-----+-----------+----------+
| ID | NAME     | AGE | ADDRESS   | SALARY   |
+----+----------+-----+-----------+----------+
|  1 | Ramesh   |  32 | Ahmedabad |  2000.00 |
|  2 | Ramesh   |  25 | Delhi     |  1500.00 |
|  3 | kaushik  |  23 | Kota      |  2000.00 |
|  4 | kaushik  |  25 | Mumbai    |  6500.00 |
|  5 | Hardik   |  27 | Bhopal    |  8500.00 |
|  6 | Komal    |  22 | MP        |  4500.00 |
|  7 | Muffy    |  24 | Indore    | 10000.00 |
+----+----------+-----+-----------+----------+

si vous souhaitez regrouper des noms identiques en un seul nom, la requête GROUP BY serait la suivante:

SQL> SELECT * FROM CUSTOMERS
     GROUP BY NAME;

Cela produirait le résultat suivant: (pour des noms identiques, il choisirait le dernier et trierait finalement la colonne dans l'ordre croissant)

    +----+----------+-----+-----------+----------+   
    | ID | NAME     | AGE | ADDRESS   | SALARY   |
    +----+----------+-----+-----------+----------+
    |  5 | Hardik   |  27 | Bhopal    |  8500.00 |
    |  4 | kaushik  |  25 | Mumbai    |  6500.00 |
    |  6 | Komal    |  22 | MP        |  4500.00 |
    |  7 | Muffy    |  24 | Indore    | 10000.00 |
    |  2 | Ramesh   |  25 | Delhi     |  1500.00 |
    +----+----------+-----+-----------+----------+

comme vous l'avez déduit qu'il ne sert à rien sans les fonctions SQL comme sum, avg etc.

alors parcourez cette définition pour comprendre la bonne utilisation de GROUP BY:

Une clause GROUP BY fonctionne sur les lignes renvoyées par une requête en résumant les lignes identiques dans un groupe unique / distinct et renvoie une seule ligne avec le résumé de chaque groupe, en utilisant la fonction Aggregate appropriée dans la liste SELECT, comme COUNT (), SUM (), MIN (), MAX (), AVG (), etc.

Maintenant, si vous voulez connaître le montant total du salaire de chaque client (nom), la requête GROUP BY serait la suivante:

SQL> SELECT NAME, SUM(SALARY) FROM CUSTOMERS
     GROUP BY NAME;

Cela produirait le résultat suivant: (somme des salaires de noms identiques et trier la colonne NOM après avoir supprimé les noms identiques)

+---------+-------------+
| NAME    | SUM(SALARY) |
+---------+-------------+
| Hardik  |     8500.00 |
| kaushik |     8500.00 |
| Komal   |     4500.00 |
| Muffy   |    10000.00 |
| Ramesh  |     3500.00 |
+---------+-------------+
JerryGoyal
la source
25

La différence est exactement ce que le nom implique: un groupe par effectue une opération de regroupement et un ordre par tris.

Si vous le faites, SELECT * FROM Customers ORDER BY Namevous obtenez la liste des résultats triée par nom du client.

Si vous le faites, SELECT IsActive, COUNT(*) FROM Customers GROUP BY IsActivevous obtenez un nombre de clients actifs et inactifs. Le groupe a agrégé les résultats en fonction du champ que vous avez spécifié.

Max Schmeling
la source
3
De plus: si vous GROUPEZ, les résultats ne sont pas forcément triés; bien que dans de nombreux cas, ils puissent sortir dans un ordre intuitif, ce n'est pas garanti par la clause GROUP. Si vous voulez que vos groupes soient triés, utilisez toujours un ORDER BY explicite après le GROUP BY.
Dave Costa
16

Ils ont une signification totalement différente et ne sont pas vraiment liés du tout.

ORDER BY vous permet de trier le jeu de résultats en fonction de différents critères, comme d'abord trier par nom à partir de az, puis trier par prix du plus élevé au plus bas.

(COMMANDEZ PAR nom, prix DESC)

GROUP BY vous permet de prendre votre jeu de résultats, de le regrouper en groupes logiques, puis d'exécuter des requêtes agrégées sur ces groupes. Vous pouvez par exemple sélectionner tous les employés, les regrouper en fonction de leur lieu de travail et calculer le salaire moyen de tous les employés de chaque lieu de travail.

PatrikAkerstrand
la source
8

Simple, ORDER BYclasse les données et les GROUP BYgroupes, ou combine les données.

ORDER BY classe l'ensemble de résultats selon le champ mentionné, par défaut dans l'ordre croissant.

Supposons que vous lanciez une requête comme ORDER BY (student_roll_number), elle affichera le résultat dans l'ordre croissant des numéros de rôle des élèves. Ici,student_roll_number entrée peut se produire plus d'une fois.

Au GROUP BYcas où, nous l'utilisons avec des fonctions d'agrégation, et cela regroupe les données selon la fonction d'agrégation, et nous obtenons le résultat. Ici, si notre requête a SUM (marks)avec GROUP BY (student_first_name)elle affichera la somme des notes des étudiants appartenant à chaque groupe (où tous les membres d'un groupe auront le même prénom).

Swapnil Chincholkar
la source
4

GROUP BY est utilisé pour regrouper des lignes dans une sélection, généralement lors de l'agrégation de lignes (par exemple, calculer des totaux, des moyennes, etc. pour un ensemble de lignes avec les mêmes valeurs pour certains champs).

ORDER BY est utilisé pour classer les lignes résultant d'une instruction select.

Cătălin Pitiș
la source
4

Quelques bons exemples là-bas. Je voudrais juste ajouter le mien à partir d'une feuille de travail Web qui donne de bons exemples clairs, ainsi que vous permettant d'exécuter votre propre SQL.

Ordre SQL par

Groupe SQL par

kevchadders
la source
1

ORDER BYaffiche un champ par ordre croissant ou décroissant. While GROUP BYaffiche les mêmes noms de champ, id, etc. dans une seule sortie.

Im_khan
la source
4
Cette réponse ne fournit aucune information supplémentaire que la réponse acceptée, ou toute autre réponse donnée, n'indique pas déjà.
newfurniturey
1
  1. GROUP BY agrégera les enregistrements par la colonne spécifiée, ce qui vous permet d'exécuter des fonctions d'agrégation sur des colonnes non groupées (telles que SUM, COUNT, AVG, etc.). ORDER BY modifie l'ordre dans lequel les articles sont retournés.
  2. Si vous faites SELECT IsActive, COUNT (*) FROM Clients GROUP BY IsActive, vous obtenez un nombre de clients actifs et inactifs. Le groupe a agrégé les résultats en fonction du champ que vous avez spécifié. Si vous faites SELECT * FROM Clients ORDER BY Name, vous obtenez la liste des résultats triée par nom du client.
  3. Si vous GROUP, les résultats ne sont pas nécessairement triés; bien que dans de nombreux cas, ils puissent sortir dans un ordre intuitif, ce n'est pas garanti par la clause GROUP. Si vous voulez que vos groupes soient triés, utilisez toujours un ORDER BY explicitement après le GROUP BY.
  4. Les données groupées ne peuvent pas être filtrées par la clause WHERE. Les données de commande peuvent être filtrées par la clause WHERE.
Khadija
la source
0

Il convient de noter que ce GROUP BYn'est pas toujours nécessaire car (au moins dans PostgreSQL, et probablement dans d'autres variantes SQL), vous pouvez utiliser ORDER BYavec une liste et vous pouvez toujours utiliser ASCou DESC par colonne ...

SELECT name_first, name_last, dob 
FROM those_guys 
ORDER BY name_last ASC, name_first ASC, dob DESC;
John
la source