sql >> Database >  >> RDS >> Database

SQL GROUP BY-clausule voor beginners

In SQL is de GROUP BY clausule kan worden gebruikt om de resultaten van een zoekopdracht in groepen rijen te verdelen.

Dit wordt meestal gedaan om een ​​of meer aggregaties op elke groep uit te voeren.

Voorbeeld 1

Hier is een voorbeeld om de GROUP BY . te demonstreren clausule.

Neem de volgende tabel:

SELECT * FROM Products;

Resultaat:

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

We kunnen de volgende query uitvoeren op die tabel.

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

Resultaat:

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

Hier gebruiken we de COUNT() aggregatiefunctie om het aantal rijen voor elke VendorId te retourneren , dan de GROUP BY clausule om de resultaten te groeperen.

Voorbeeld 2

In dit voorbeeld gebruiken we de SUM() aggregatiefunctie om de totale bevolking van alle steden binnen een district te retourneren, en vervolgens de GROUP BY clausule om de resultaten te groeperen.

Stel je voor dat we een tabel hebben met de naam City die plaatsnamen en hun bevolking opslaat, evenals hun respectievelijke landcodes en districten (in hun eigen afzonderlijke kolommen).

Zoals dit:

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

Resultaat:

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

Ik heb de resultaten teruggebracht tot slechts drie landen, anders zou de lijst way . zijn te lang voor dit artikel.

Stel nu dat we de bevolking van elk district willen hebben, en dat we elk district willen opsommen, samen met het aantal inwoners en de landcode.

We zouden dit kunnen doen.

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

Resultaat:

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

We kunnen zien dat onze resultaten zijn gegroepeerd zoals gespecificeerd, en we krijgen nu de volledige bevolking voor elk district (in tegenstelling tot de bevolking van de individuele steden, zoals ze zijn opgeslagen in de onderliggende tabel).

Merk op dat de GROUP BY clausule moet komen na een WHERE clausule en vóór een ORDER BY clausule.

Als we de bevolking van elk land wilden hebben in plaats van het district, wordt onze zoekopdracht nog compacter.

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

Resultaat:

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

Houd er rekening mee dat deze specifieke voorbeelddatabase erg verouderd is en dat de populatieaantallen niet overeenkomen met de huidige realiteit.

Voorbeeld 3 – De HAVING-clausule

U kunt de HAVING . opnemen clausule met uw GROUP BY clausule om de groepen te filteren.

Voorbeeld:

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;

Resultaat:

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

De HAVING clausule is vergelijkbaar met de WHERE clausule, behalve dat WHERE filtert individuele rijen, terwijl HAVING filtert groepen.

Ook de WHERE clausule filtert gegevens voor het is gegroepeerd, terwijl HAVING filtert gegevens na het is gegroepeerd.

De HAVING clausule accepteert dezelfde operatoren die u kunt gebruiken met de WHERE clausule (zoals = , ) Operator for Beginners">> , =) Operator for Beginners">>= , IN , LIKE , enz.).


  1. Hoe de standaardwaarde van de kolom in MySQL te verwijderen?

  2. Is er een manier om het rijnummer in Mysql te krijgen, zoals het rijnummer in orakel?

  3. TRIM() Functie in Oracle

  4. Sp_help_schedule gebruiken in SQL Server