¿Cuál es la diferencia entre GROUP BY y ORDER BY en sql?

119

¿Cuándo usas cuál en general? ¡Se recomiendan mucho ejemplos!

Me refiero a MySql, pero no puedo imaginar que el concepto sea diferente en otro DBMS

vehomzzz
fuente

Respuestas:

79

ORDER BY altera el orden en el que se devuelven los artículos.

GROUP BY agregará registros por las columnas especificadas, lo que le permite realizar funciones de agregación en columnas no agrupadas (como SUM, COUNT, AVG, etc.).

CMerat
fuente
130
Esta afirmación prácticamente no tiene sentido sin un ejemplo que la acompañe.
JohnMerlino
2
Creo que el segundo ejemplo en la página del enlace es suficiente para comprender la diferencia tutorialspoint.com/sql/sql-group-by.htm
nishantbhardwaj2002
¿Puede darnos un ejemplo?
Rice
249

ORDER BY altera el orden en el que se devuelven los artículos.

GROUP BY agregará registros por las columnas especificadas, lo que le permite realizar funciones de agregación en columnas no agrupadas (como 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
fuente
2
¿Qué pasa si la tabla tiene una agecolumna, con Peters tiene diferentes edades y la consulta es SELECCIONAR NOMBRE, EDAD DEL GRUPO DE LA TABLA POR NOMBRE?
Varun
1
No puede devolver columnas que no estén en su grupo o que no tengan un método. Entonces, necesitaría agregar la edad al grupo por, o hacer algo como Max (Edad).
RiddlerDev
78

ORDER BY: ordena los datos en orden ascendente o descendente.

Considere la tabla CLIENTES :

+----+----------+-----+-----------+----------+
| 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 |
+----+----------+-----+-----------+----------+

A continuación se muestra un ejemplo, que clasificaría el resultado en orden ascendente por NOMBRE:

SQL> SELECT * FROM CUSTOMERS
     ORDER BY NAME;

Esto produciría el siguiente resultado:

+----+----------+-----+-----------+----------+
| 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: organiza los datos idénticos en grupos.

Ahora, la tabla CUSTOMERS tiene los siguientes registros con nombres duplicados:

+----+----------+-----+-----------+----------+
| 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 desea agrupar nombres idénticos en un solo nombre, la consulta GROUP BY sería la siguiente:

SQL> SELECT * FROM CUSTOMERS
     GROUP BY NAME;

Esto produciría el siguiente resultado: (para nombres idénticos, elegiría el último y finalmente ordenaría la columna en orden ascendente)

    +----+----------+-----+-----------+----------+   
    | 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 |
    +----+----------+-----+-----------+----------+

como ha inferido que no sirve de nada sin funciones SQL como sum, avg, etc.

así que revise esta definición para comprender el uso adecuado de GROUP BY:

Una cláusula GROUP BY funciona en las filas devueltas por una consulta al resumir filas idénticas en un grupo único / distinto y devuelve una sola fila con el resumen de cada grupo, mediante el uso de la función Aggregate adecuada en la lista SELECT, como COUNT (), SUM (), MIN (), MAX (), AVG (), etc.

Ahora, si desea saber la cantidad total de salario de cada cliente (nombre), la consulta GROUP BY sería la siguiente:

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

Esto produciría el siguiente resultado: (suma de los salarios de nombres idénticos y ordena la columna NAME después de eliminar nombres idénticos)

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

La diferencia es exactamente lo que el nombre implica: un grupo por realiza una operación de agrupación y un orden por géneros.

Si lo hace SELECT * FROM Customers ORDER BY Name, obtendrá la lista de resultados ordenada por el nombre del cliente.

Si lo hace SELECT IsActive, COUNT(*) FROM Customers GROUP BY IsActive, obtiene un recuento de clientes activos e inactivos. El grupo por agregó los resultados según el campo que especificó.

Max Schmeling
fuente
3
Además: si AGRUPA, los resultados no se ordenan necesariamente; aunque en muchos casos pueden aparecer en un orden intuitivo, la cláusula GROUP no lo garantiza. Si desea que sus grupos estén ordenados, utilice siempre un ORDER BY explícito después de GROUP BY.
Dave Costa
16

Tienen un significado totalmente diferente y no están realmente relacionados en absoluto.

ORDER BY le permite ordenar el conjunto de resultados de acuerdo con diferentes criterios, como primero ordenar por nombre desde az, luego ordenar por precio de mayor a menor.

(ORDEN POR nombre, precio DESC)

GROUP BY le permite tomar su conjunto de resultados, agruparlo en grupos lógicos y luego ejecutar consultas agregadas en esos grupos. Por ejemplo, podría seleccionar a todos los empleados, agruparlos por la ubicación de su lugar de trabajo y calcular el salario promedio de todos los empleados de cada lugar de trabajo.

PatrikAkerstrand
fuente
8

Simple, ORDER BYordena los datos y GROUP BYagrupa, o combina los datos.

ORDER BY ordena el conjunto de resultados según el campo mencionado, por defecto en orden ascendente.

Suponga que está lanzando una consulta como ORDER BY (student_roll_number), le mostrará el resultado en orden ascendente de los números de lista de los estudiantes. Aquí, la student_roll_numberentrada puede ocurrir más de una vez.

En GROUP BYcaso de que usemos esto con funciones agregadas, y agrupa los datos según la función agregada, y obtenemos el resultado. Aquí, si nuestra consulta tiene SUM (marks)junto con GROUP BY (student_first_name)ella, se mostrará la suma de las notas de los estudiantes que pertenecen a cada grupo (donde todos los miembros de un grupo tendrán el mismo nombre).

Swapnil Chincholkar
fuente
4

GROUP BY se usa para agrupar filas en una selección, generalmente al agregar filas (por ejemplo, calcular totales, promedios, etc. para un conjunto de filas con los mismos valores para algunos campos).

ORDER BY se utiliza para ordenar las filas resultantes de una instrucción de selección.

Cătălin Pitiș
fuente
4

Algunos buenos ejemplos allí. Al igual que agregar el mío desde la hoja de cheques web, que brinda buenos ejemplos claros, además de permitirle ejecutar su propio SQL.

Orden de SQL por

Grupo SQL por

kevchadders
fuente
1

ORDER BYmuestra un campo en orden ascendente o descendente. Si bien GROUP BYmuestra los mismos nombres de campo, id's, etc.en una sola salida.

Im_khan
fuente
4
Esta respuesta no proporciona información adicional que la respuesta aceptada, o cualquier otra respuesta dada, no indique ya.
mobiliario nuevo
1
  1. GROUP BY agregará registros por la columna especificada que le permite realizar funciones de agregación en columnas no agrupadas (como SUM, COUNT, AVG, etc.). ORDER BY altera el orden en el que se devuelven los artículos.
  2. Si selecciona IsActive, COUNT (*) FROM Clientes GROUP BY IsActive obtendrá un recuento de clientes activos e inactivos. El grupo por agregó los resultados según el campo que especificó. Si SELECCIONA * DE Clientes ORDER BY Name, obtendrá la lista de resultados ordenada por el nombre del cliente.
  3. Si AGRUPA, los resultados no están necesariamente ordenados; aunque en muchos casos pueden aparecer en un orden intuitivo, la cláusula GROUP no lo garantiza. Si desea que sus grupos estén ordenados, utilice siempre un ORDER BY explícitamente después de GROUP BY.
  4. Los datos agrupados no se pueden filtrar mediante la cláusula WHERE. Los datos del pedido se pueden filtrar mediante la cláusula WHERE.
Khadija
fuente
0

Cabe señalar GROUP BYque no siempre es necesario ya que (al menos en PostgreSQL, y probablemente en otras variantes de SQL) puede usar ORDER BYcon una lista y aún puede usar ASCo DESC por columna ...

SELECT name_first, name_last, dob 
FROM those_guys 
ORDER BY name_last ASC, name_first ASC, dob DESC;
Juan
fuente