Database
 sql >> Base de données >  >> RDS >> Database

Clause SQL GROUP BY pour les débutants

En SQL, le GROUP BY La clause peut être utilisée pour diviser les résultats d'une requête en groupes de lignes.

Ceci est généralement fait afin d'effectuer une ou plusieurs agrégations sur chaque groupe.

Exemple 1

Voici un exemple pour illustrer le GROUP BY clause.

Prenez le tableau suivant :

SELECT * FROM Products;

Résultat :

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

Nous pourrions exécuter la requête suivante sur cette table.

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

Résultat :

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

Ici, nous utilisons le COUNT() fonction d'agrégation pour renvoyer le nombre de lignes pour chaque VendorId , puis le GROUP BY clause pour regrouper les résultats.

Exemple 2

Dans cet exemple, nous utilisons le SUM() fonction d'agrégation pour renvoyer la population agrégée de toutes les villes d'un district, puis le GROUP BY clause pour regrouper les résultats.

Imaginez que nous ayons une table appelée City qui stocke les noms de villes et leur population, ainsi que leurs codes de pays et districts respectifs (dans leurs propres colonnes séparées).

Comme ceci :

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

Résultat :

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

J'ai réduit les résultats à seulement trois pays, sinon la liste serait longue trop long pour cet article.

Maintenant, supposons que nous voulions obtenir la population de chaque district, et que nous voulions répertorier chaque district, ainsi que sa population et son code pays.

Nous pourrions le faire.

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

Résultat :

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

Nous pouvons voir que nos résultats sont regroupés comme spécifié, et nous obtenons maintenant la population complète de chaque district (par opposition à la population des villes individuelles, qui est la façon dont elles sont stockées dans la table sous-jacente).

Notez que le GROUP BY la clause doit venir après tout WHERE clause et avant tout ORDER BY clause.

Si nous voulions obtenir la population de chaque pays au lieu du district, notre requête devient encore plus compacte.

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

Résultat :

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

Gardez à l'esprit que cet exemple de base de données particulier est très obsolète et que ses chiffres de population ne reflètent pas la réalité actuelle.

Exemple 3 - La clause HAVING

Vous pouvez inclure le HAVING clause avec votre GROUP BY clause pour filtrer les groupes.

Exemple :

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;

Résultat :

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

Le HAVING la clause est similaire à WHERE clause, sauf que WHERE filtre les lignes individuelles, tandis que HAVING groupes de filtres.

Aussi, le WHERE la clause filtre les données avant il est groupé, alors que HAVING filtre les données après il est groupé.

Le HAVING La clause accepte les mêmes opérateurs que vous pouvez utiliser avec WHERE clause (telle que = , ) Operator for Beginners">> , =) Operator for Beginners">>= , IN , LIKE , etc.).