sql >> Base de Datos >  >> RDS >> Database

Cláusula SQL GROUP BY para principiantes

En SQL, el GROUP BY La cláusula se puede utilizar para dividir los resultados de una consulta en grupos de filas.

Esto generalmente se hace para realizar una o más agregaciones en cada grupo.

Ejemplo 1

Aquí hay un ejemplo para demostrar el GROUP BY cláusula.

Tome la siguiente tabla:

SELECT * FROM Products;

Resultado:

+-------------+------------+---------------------------------+----------------+-----------------------------------------+
| ProductId   | VendorId   | ProductName                     | ProductPrice   | ProductDescription                      |
|-------------+------------+---------------------------------+----------------+-----------------------------------------|
| 1           | 1001       | Left handed screwdriver         | 25.99          | Purple. Includes left handed carry box. |
| 2           | 1001       | Long Weight (blue)              | 14.75          | Includes a long wait.                   |
| 3           | 1001       | Long Weight (green)             | 11.99          | Approximate 30 minute waiting period.   |
| 4           | 1002       | Sledge Hammer                   | 33.49          | Wooden handle. Free wine glasses.       |
| 5           | 1003       | Chainsaw                        | 245.00         | Orange. Includes spare fingers.         |
| 6           | 1003       | Straw Dog Box                   | 55.99          | Tied with vines. Very chewable.         |
| 7           | 1004       | Bottomless Coffee Mugs (4 Pack) | 9.99           | Brown ceramic with solid handle.        |
+-------------+------------+---------------------------------+----------------+-----------------------------------------+

Podríamos ejecutar la siguiente consulta en esa tabla.

SELECT 
    VendorId,
    COUNT(VendorId) AS Count
FROM Products
GROUP BY VendorId;

Resultado:

+------------+---------+
| VendorId   | Count   |
|------------+---------|
| 1001       | 3       |
| 1002       | 1       |
| 1003       | 2       |
| 1004       | 1       |
+------------+---------+

Aquí, usamos el COUNT() función agregada para devolver el número de filas para cada VendorId , luego el GROUP BY cláusula para agrupar los resultados.

Ejemplo 2

En este ejemplo usamos SUM() función agregada para devolver la población agregada de todas las ciudades dentro de un distrito, luego el GROUP BY cláusula para agrupar los resultados.

Imagina que tenemos una tabla llamada City que almacena los nombres de las ciudades y su población, así como sus respectivos códigos de países y distritos (en sus propias columnas separadas).

Así:

SELECT * FROM city
WHERE CountryCode IN ('AGO', 'ARE', 'AUS');

Resultado:

+------+---------------+---------------+-----------------+--------------+
| ID   | Name          | CountryCode   | District        | Population   |
|------+---------------+---------------+-----------------+--------------|
| 56   | Luanda        | AGO           | Luanda          | 2022000      |
| 57   | Huambo        | AGO           | Huambo          | 163100       |
| 58   | Lobito        | AGO           | Benguela        | 130000       |
| 59   | Benguela      | AGO           | Benguela        | 128300       |
| 60   | Namibe        | AGO           | Namibe          | 118200       |
| 64   | Dubai         | ARE           | Dubai           | 669181       |
| 65   | Abu Dhabi     | ARE           | Abu Dhabi       | 398695       |
| 66   | Sharja        | ARE           | Sharja          | 320095       |
| 67   | al-Ayn        | ARE           | Abu Dhabi       | 225970       |
| 68   | Ajman         | ARE           | Ajman           | 114395       |
| 130  | Sydney        | AUS           | New South Wales | 3276207      |
| 131  | Melbourne     | AUS           | Victoria        | 2865329      |
| 132  | Brisbane      | AUS           | Queensland      | 1291117      |
| 133  | Perth         | AUS           | West Australia  | 1096829      |
| 134  | Adelaide      | AUS           | South Australia | 978100       |
| 135  | Canberra      | AUS           | Capital Region  | 322723       |
| 136  | Gold Coast    | AUS           | Queensland      | 311932       |
| 137  | Newcastle     | AUS           | New South Wales | 270324       |
| 138  | Central Coast | AUS           | New South Wales | 227657       |
| 139  | Wollongong    | AUS           | New South Wales | 219761       |
| 140  | Hobart        | AUS           | Tasmania        | 126118       |
| 141  | Geelong       | AUS           | Victoria        | 125382       |
| 142  | Townsville    | AUS           | Queensland      | 109914       |
| 143  | Cairns        | AUS           | Queensland      | 92273        |
+------+---------------+---------------+-----------------+--------------+

Reduje los resultados a solo tres países, de lo contrario, la lista sería muy demasiado largo para este artículo.

Ahora, supongamos que queremos obtener la población de cada distrito y queremos enumerar cada distrito, junto con su población y código de país.

Podríamos hacer esto.

SELECT
    CountryCode,
    District,
    SUM(Population) AS Population
FROM City
WHERE CountryCode IN ('AGO', 'ARE', 'AUS')
GROUP BY CountryCode, District
ORDER BY CountryCode;

Resultado:

+---------------+-----------------+--------------+
| CountryCode   | District        | Population   |
|---------------+-----------------+--------------|
| AGO           | Benguela        | 258300       |
| AGO           | Huambo          | 163100       |
| AGO           | Luanda          | 2022000      |
| AGO           | Namibe          | 118200       |
| ARE           | Abu Dhabi       | 624665       |
| ARE           | Ajman           | 114395       |
| ARE           | Dubai           | 669181       |
| ARE           | Sharja          | 320095       |
| AUS           | Capital Region  | 322723       |
| AUS           | New South Wales | 3993949      |
| AUS           | Queensland      | 1805236      |
| AUS           | South Australia | 978100       |
| AUS           | Tasmania        | 126118       |
| AUS           | Victoria        | 2990711      |
| AUS           | West Australia  | 1096829      |
+---------------+-----------------+--------------+

Podemos ver que nuestros resultados se agrupan como se especifica, y ahora obtenemos la población completa de cada distrito (a diferencia de la población de las ciudades individuales, que es como se almacenan en la tabla subyacente).

Tenga en cuenta que GROUP BY la cláusula debe ir después de cualquier WHERE cláusula y antes de cualquier ORDER BY cláusula.

Si quisiéramos obtener la población de cada país en lugar del distrito, nuestra consulta se vuelve aún más compacta.

SELECT
    CountryCode,
    SUM(Population) AS Population
FROM City
WHERE CountryCode IN ('AGO', 'ARE', 'AUS')
GROUP BY CountryCode
ORDER BY CountryCode;

Resultado:

+---------------+--------------+
| CountryCode   | Population   |
|---------------+--------------|
| AGO           | 2561600      |
| ARE           | 1728336      |
| AUS           | 11313666     |
+---------------+--------------+

Tenga en cuenta que esta base de datos de muestra en particular está muy desactualizada y sus números de población no reflejan la realidad actual.

Ejemplo 3:la cláusula HAVING

Puedes incluir el HAVING cláusula con su GROUP BY cláusula para filtrar los grupos.

Ejemplo:

SELECT
    CountryCode,
    District,
    SUM(Population) AS Population
FROM City
WHERE CountryCode IN ('AGO', 'ARE', 'AUS')
GROUP BY CountryCode, District
HAVING SUM(Population) > 1000000
ORDER BY CountryCode;

Resultado:

+---------------+-----------------+--------------+
| CountryCode   | District        | Population   |
|---------------+-----------------+--------------|
| AGO           | Luanda          | 2022000      |
| AUS           | New South Wales | 3993949      |
| AUS           | Queensland      | 1805236      |
| AUS           | Victoria        | 2990711      |
| AUS           | West Australia  | 1096829      |
+---------------+-----------------+--------------+

El HAVING la cláusula es similar a WHERE cláusula, excepto que WHERE filtra filas individuales, mientras que HAVING grupos de filtros.

Además, el WHERE la cláusula filtra los datos antes está agrupado, mientras que HAVING filtra los datos después está agrupado.

El HAVING La cláusula acepta los mismos operadores que puede usar con WHERE cláusula (como = , ) Operator for Beginners">> , =) Operator for Beginners">>= , IN , LIKE , etc.).