Dalam SQL, GROUP BY
klausa dapat digunakan untuk membagi hasil kueri ke dalam kelompok baris.
Ini biasanya dilakukan untuk melakukan satu atau lebih agregasi pada setiap grup.
Contoh 1
Berikut adalah contoh untuk mendemonstrasikan GROUP BY
klausa.
Ambil tabel berikut:
SELECT * FROM Products;
Hasil:
+-------------+------------+---------------------------------+----------------+-----------------------------------------+ | 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. | +-------------+------------+---------------------------------+----------------+-----------------------------------------+
Kita bisa menjalankan kueri berikut terhadap tabel itu.
SELECT
VendorId,
COUNT(VendorId) AS Count
FROM Products
GROUP BY VendorId;
Hasil:
+------------+---------+ | VendorId | Count | |------------+---------| | 1001 | 3 | | 1002 | 1 | | 1003 | 2 | | 1004 | 1 | +------------+---------+
Di sini, kami menggunakan COUNT()
fungsi agregat untuk mengembalikan jumlah baris untuk setiap VendorId
, lalu GROUP BY
klausa untuk mengelompokkan hasil.
Contoh 2
Dalam contoh ini kita menggunakan SUM()
fungsi agregat untuk mengembalikan agregat penduduk semua kota dalam suatu kabupaten, kemudian GROUP BY
klausa untuk mengelompokkan hasil.
Bayangkan kita memiliki tabel bernama City
yang menyimpan nama kota dan populasinya, serta kode negara dan distriknya masing-masing (dalam kolom tersendiri).
Seperti ini:
SELECT * FROM city
WHERE CountryCode IN ('AGO', 'ARE', 'AUS');
Hasil:
+------+---------------+---------------+-----------------+--------------+ | 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 | +------+---------------+---------------+-----------------+--------------+
Saya mengurangi hasilnya menjadi hanya tiga negara, jika tidak daftarnya akan menjadi cara terlalu panjang untuk artikel ini.
Sekarang, misalkan kita ingin mendapatkan populasi setiap distrik, dan kita ingin membuat daftar setiap distrik, bersama dengan populasi dan kode negaranya.
Kita bisa melakukan ini.
SELECT
CountryCode,
District,
SUM(Population) AS Population
FROM City
WHERE CountryCode IN ('AGO', 'ARE', 'AUS')
GROUP BY CountryCode, District
ORDER BY CountryCode;
Hasil:
+---------------+-----------------+--------------+ | 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 | +---------------+-----------------+--------------+
Kami dapat melihat bahwa hasil kami dikelompokkan seperti yang ditentukan, dan sekarang kami mendapatkan populasi penuh untuk setiap distrik (berlawanan dengan populasi masing-masing kota, yang merupakan cara mereka disimpan di tabel yang mendasarinya).
Perhatikan bahwa GROUP BY
klausa harus muncul setelah WHERE
klausa dan sebelum ORDER BY
klausa.
Jika kami ingin mendapatkan populasi setiap negara dan bukan distrik, kueri kami menjadi lebih ringkas.
SELECT
CountryCode,
SUM(Population) AS Population
FROM City
WHERE CountryCode IN ('AGO', 'ARE', 'AUS')
GROUP BY CountryCode
ORDER BY CountryCode;
Hasil:
+---------------+--------------+ | CountryCode | Population | |---------------+--------------| | AGO | 2561600 | | ARE | 1728336 | | AUS | 11313666 | +---------------+--------------+
Ingatlah bahwa basis data sampel khusus ini sangat ketinggalan zaman, dan jumlah populasinya tidak mencerminkan kenyataan saat ini.
Contoh 3 – Klausa HAVING
Anda dapat menyertakan HAVING
klausa dengan GROUP BY
. Anda klausa untuk memfilter grup.
Contoh:
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;
Hasil:
+---------------+-----------------+--------------+ | CountryCode | District | Population | |---------------+-----------------+--------------| | AGO | Luanda | 2022000 | | AUS | New South Wales | 3993949 | | AUS | Queensland | 1805236 | | AUS | Victoria | 2990711 | | AUS | West Australia | 1096829 | +---------------+-----------------+--------------+
HAVING
klausanya mirip dengan WHERE
klausa, kecuali WHERE
memfilter baris individual, sedangkan HAVING
kelompok filter.
Juga, WHERE
klausa menyaring data sebelum itu dikelompokkan, sedangkan HAVING
memfilter data setelah itu dikelompokkan.
Kode HAVING
klausa menerima operator yang sama yang dapat Anda gunakan dengan WHERE
klausa (seperti =
, ) Operator for Beginners">>
, =) Operator for Beginners">>=
, IN
, LIKE
, dll).