sql >> Database teknologi >  >> RDS >> Database

SQL GROUP BY-klausul for begyndere

I SQL er GROUP BY klausul kan bruges til at opdele resultaterne af en forespørgsel i grupper af rækker.

Dette gøres normalt for at udføre en eller flere sammenlægninger på hver gruppe.

Eksempel 1

Her er et eksempel for at demonstrere GROUP BY klausul.

Tag følgende tabel:

SELECT * FROM Products;

Resultat:

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

Vi kunne køre følgende forespørgsel mod den tabel.

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

Resultat:

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

Her bruger vi COUNT() aggregatfunktion til at returnere antallet af rækker for hver VendorId , derefter GROUP BY klausul for at gruppere resultaterne.

Eksempel 2

I dette eksempel bruger vi SUM() aggregeringsfunktion til at returnere den aggregerede befolkning for alle byerne i et distrikt, derefter GROUP BY klausul for at gruppere resultaterne.

Forestil dig, at vi har en tabel kaldet City der gemmer bynavne og deres befolkning samt deres respektive landekoder og distrikter (i deres egne separate kolonner).

Sådan:

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

Resultat:

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

Jeg reducerede resultaterne til kun tre lande, ellers ville listen være vej for lang til denne artikel.

Antag nu, at vi ønskede at få indbyggertallet i hvert distrikt, og vi ønskede at liste hvert distrikt sammen med dets befolkning og landekode.

Vi kunne gøre dette.

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

Resultat:

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

Vi kan se, at vores resultater er grupperet som specificeret, og vi får nu den fulde befolkning for hvert distrikt (i modsætning til befolkningen i de enkelte byer, som er, hvordan de er gemt i den underliggende tabel).

Bemærk, at GROUP BY klausul skal komme efter enhver WHERE klausul og før enhver ORDER BY klausul.

Hvis vi ønskede at få befolkningen i hvert land i stedet for distriktet, bliver vores forespørgsel endnu mere kompakt.

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

Resultat:

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

Husk på, at denne særlige prøvedatabase er meget forældet, og dens befolkningstal afspejler ikke den nuværende virkelighed.

Eksempel 3 – HAVING-klausulen

Du kan inkludere koden HAVING klausul med din GROUP BY klausul for at filtrere grupperne.

Eksempel:

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;

Resultat:

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

HAVING klausulen ligner WHERE klausul, bortset fra WHERE filtrerer individuelle rækker, mens HAVING filtrerer grupper.

Også WHERE klausul filtrerer data før den er grupperet, hvorimod HAVING filtrerer data efter den er grupperet.

HAVING klausulen accepterer de samme operatorer, som du kan bruge med WHERE klausul (såsom = , ) Operator for Beginners">> , =) Operator for Beginners">>= , IN , LIKE osv.).


  1. SELECTING med flere WHERE-betingelser i samme kolonne

  2. Kan ikke forbinde PostgreSQL til fjerndatabasen ved hjælp af pgAdmin

  3. Oracle SQL escape-tegn (for et '&')

  4. Sådan bestiller du efter månedsnavn i PostgreSQL eller Oracle