Salah satu aspek yang paling kuat dari SQL adalah kemampuan untuk melakukan agregasi data. Dua dari alat agregasi data SQL yang paling kuat adalah pengelompokan dan total . Dalam panduan ini, Anda mempelajari agregasi data SQL menggunakan pengelompokan dan penjumlahan.
Fungsi SQL Agregat
Dalam SQL, agregasi adalah proses mengoperasikan atau menghitung sekumpulan nilai. Tujuannya adalah untuk mengembalikan nilai ringkasan tunggal. SQL menyertakan beberapa Fungsi Agregat yang sangat kuat seperti AVG()
, COUNT()
, SUM()
, MAX()
, dan MIN()
. Fungsi-fungsi ini, pada gilirannya, paling sering ditemukan dalam pernyataan SQL yang mengimplementasikan GROUP BY
ayat. Namun, fungsi ini tidak perlu dikaitkan dengan klausa tersebut.
Catatan Kecuali disebutkan sebaliknya, semua perintah database yang ditunjukkan dalam panduan ini berfungsi dengan baik di MySQL dan PostgreSQL .
Panduan ini menggunakan CourseTaken
tabel untuk mendemonstrasikan fungsi agregat. Dari baris perintah, buat CourseTaken
tabel.
CREATE TABLE CourseTaken (
SSNumber CHAR(9) NOT NULL,
CourseId CHAR(6) NOT NULL,
NumericGrade INT NOT NULL,
YearTaken INT NOT NULL
);
CourseTaken
tabel berisi data kolom berikut:
SSNumber | Id Kursus | NumericGrade | YearDiambil |
---|---|---|---|
111111111 | CSC101 | 98 | 2021 |
111111111 | ENG101 | 95 | 2020 |
2222222222 | CSC101 | 100 | 2020 |
2222222222 | EEE101 | 75 | 2020 |
3333333333 | POL101 | 92 | 2021 |
3333333333 | CSC101 | 84 | 2020 |
Gunakan Fungsi Agregat SQL untuk Menghitung Nilai Ringkasan Tunggal
Bagian di bawah ini memberikan contoh berbeda yang menggunakan fungsi agregat untuk mengembalikan nilai ringkasan tunggal. Semua contoh menggunakan CourseTaken
tabel yang dibuat di bagian Fungsi Agregat pada panduan.
Contoh 1:
Dalam contoh ini, fungsi agregat mengembalikan nilai rata-rata numerik untuk semua siswa yang mengambil kursus CSC101
pada tahun 2022.
SELECT AVG(NumericGrade) AS 'Avg Grade'
FROM CourseTaken
WHERE CourseId = 'CSC101
AND YearTaken = 2022;
SQL mengembalikan nilai rata-rata berikut:
Avg Grade
---------
92
Contoh 2:
Fungsi agregat di bawah ini mengembalikan hitungan jumlah siswa yang mengambil kursus CSC101
sebelum tahun 2022.
SELECT COUNT(SSNumber) AS 'Student Count'
FROM CourseTaken
WHERE CourseId = 'CSC101'
AND YearTaken < 2022;
Hitungan berikut dikembalikan:
Student Count
---------
1
Contoh 3:
Dalam contoh ini, fungsi agregat digunakan untuk mendapatkan nilai numerik maksimum yang dicatat pada tahun mana pun oleh Siswa yang mengambil CSC101
.
SELECT MAX(NumericGrade) AS 'Max Grade'
FROM CourseTaken
WHERE CourseId = 'CSC101'
Nilai maksimum yang dikembalikan adalah sebagai berikut:
Max Grade
---------
100
Agregat Data Menggunakan Fungsi Grup
Contoh berikut menunjukkan penggunaan GROUP BY
klausa menggunakan data dari CourseTaken
tabel.
Contoh 1:
Contoh di bawah ini menentukan nilai rata-rata untuk setiap siswa untuk semua mata kuliah yang telah mereka ambil hingga saat ini. Untuk menjalankan ini, gunakan SQL Group By
klausa untuk dikelompokkan berdasarkan Siswa (dalam hal ini, SSNumber
kolom).
SELECT SSNumber, AVG(NumericGrade) AS 'Avg Grade'
FROM CourseTaken
GROUP BY SSNumber
Output mengembalikan nilai rata-rata untuk setiap siswa.
+-----------+----------+
| SSNumber | Avg Grade|
+-----------+----------+
| 111111111 | 96.5 |
| 222222222 | 87.5 |
| 333333333 | 88 |
+-----------+----------+
Contoh 2:
Fungsi agregat di bawah ini menemukan nilai rata-rata yang diterima di setiap CourseId
di CourseTaken
meja. Untuk melakukannya, kelompokkan menurut CourseId
dalam YearTaken
dengan kode SQL berikut:
SELECT CourseId AS 'Course', YearTaken AS 'Year',
AVG(NumericGrade) AS 'Avg Grade'
FROM CourseTaken
GROUP BY CourseId, YearTaken
ORDER BY CourseId, YearTaken
Anda akan melihat output berikut:
+--------+------+-----------+
| Course | Year | Avg Grade |
+--------+------+-----------+
| CSC101 | 2021 | 98 |
| POL101 | 2021 | 92 |
| CSC101 | 2022 | 92 |
| EEE101 | 2022 | 75 |
| ENG101 | 2022 | 95 |
+--------+------+-----------+
Catatan Contoh di atas sedikit lebih kompleks. Anda mengelompokkan menurut dua kolom, bukan satu (CourseId
dalamYear
). Oleh karena itu, Anda menghitung nilai rata-rata dan kelompok denganCSC101
untuk tahun2021
terpisah dari Nilai Rata-rata untukCSC101
untuk tahun2021
. KursusCSC101
untuk Tahun2021
adalah agregasi dari dua baris, sedangkan semua baris Group By lainnya adalah agregasi dari satu baris. Selain itu, dari konsep Memesan (Order By
klausa) Anda dapat menampilkan hasil yang diurutkan (diurutkan) berdasarkanCourse
dalam satu Tahun tertentu.
Contoh 3:
Dari kueri SQL pada contoh sebelumnya, Anda dapat membatasi jumlah baris yang Anda operasikan dengan menambahkan WHERE
klausa ke kueri. Misalnya, untuk menghasilkan nilai rata-rata yang diterima siswa hanya untuk CourseId
CSC101
, kelompokkan menurut CourseId
dalam YearTaken
. Kode SQL berikut dapat melakukannya:
SELECT CourseId AS 'Course', YearTaken AS 'Year',
AVG(NumericGrade) AS 'Avg Grade'
FROM CourseTaken
WHERE CourseId = 'CSC101'
GROUP BY CourseId, YearTaken
ORDER BY CourseId, YearTaken
Dalam kode SQL di atas, Anda menambahkan kondisi (melalui WHERE
klausa) sebelum agregasi grup yang sebenarnya dilakukan (melalui GROUP BY
klausa).
Output berikut dikembalikan:
+--------+------+-----------+
| Course | Year | Avg Grade |
+--------+------+-----------+
| CSC101 | 2021 | 98 |
| CSC101 | 2022 | 92 |
+--------+------+-----------+
Contoh 4:
Dari kueri SQL di Contoh 2, Anda dapat menerapkan kondisi sebelum hasil akhir dikembalikan. Untuk mencapai ini gunakan SQL Having
ayat. Anda dapat menentukan nilai rata-rata di setiap CourseId
, di mana nilai rata-rata gabungan lebih besar dari 90
. Anda dapat kembali mengelompokkan berdasarkan CourseId
dalam YearTaken
. Kode SQL berikut dapat melakukannya:
SELECT CourseId AS ‘Course’, YearTaken AS ‘Year’,
AVG(NumericGrade) AS ‘Avg Grade’
FROM CourseTaken
GROUP BY CourseId, YearTaken
HAVING AVG(NumericGrade) > 90
ORDER BY CourseId, YearTaken
Outputnya adalah sebagai berikut:
+--------+------+-----------+
| Course | Year | Avg Grade |
+--------+------+-----------+
| CSC101 | 2021 | 98 |
| POL101 | 2021 | 92 |
| CSC101 | 2022 | 92 |
| ENG101 | 2022 | 95 |
+--------+------+-----------+
Baris untuk CourseId
EEE101
tidak dikembalikan. Ini karena Having
klausa memfilternya setelah GROUP BY
klausa dieksekusi (CourseId
EEE101
nilai rata-rata di bawah 90).
Contoh 5:
Membangun kode SQL dari Contoh 3 dan Contoh 4 , Anda dapat membuat kueri agregasi yang memanfaatkan Where
dan Having
ayat. Misalnya, Anda dapat menentukan mata kuliah yang diambil pada 2021
, di mana nilai rata-rata untuk mata kuliah yang diambil lebih besar dari 93
. Di sini, Where
klausa menyaring hasil sebelum Group By
agregasi data dilakukan, dan Having
klausa menyaring hasil yang dikembalikan setelah Group By
agregasi data dilakukan. Kode SQL berikut dapat melakukannya:
SELECT CourseId AS ‘Course’, YearTaken AS ‘Year’,
AVG(NumericGrade) AS ‘Avg Grade’
FROM CourseTaken
WHERE YearTaken = 2021
GROUP BY CourseId, YearTaken
HAVING AVG(NumericGrade) > 93
ORDER BY CourseId
Output yang dikembalikan adalah sebagai berikut:
+--------+------+-----------+
| Course | Year | Avg Grade |
+--------+------+-----------+
| CSC101 | 2021 | 98 |
+--------+------+-----------+
Contoh 6:
Anda dapat menghitung jumlah baris yang terkait dengan setiap Group By
agregasi dalam kueri. Berdasarkan contoh kode SQL sebelumnya, Anda dapat menghasilkan nilai rata-rata yang diterima oleh Students
hanya untuk CourseId
CSC101
, dikelompokkan berdasarkan CourseId
dalam YearTaken
. Kode harus memberikan jumlah siswa (hitungan) yang terkait dengan masing-masing kelompok. Kode SQL berikut dapat melakukannya:
SELECT CourseId AS ‘Course’, YearTaken AS ‘Year’,
AVG(NumericGrade) AS ‘Avg Grade’,
Count(SSNumber) AS ‘Count’
FROM CourseTaken
WHERE CourseId = ‘CSC101’
GROUP BY CourseId, YearTaken
ORDER BY CourseId, YearTaken
Count(SSNumber)
di SELECT
klausa dapat ditentukan sebagai Count(*)
. Perbedaan antara kedua sintaks tersebut adalah Count(*)
termasuk baris yang memiliki NULL
nilai-nilai di dalamnya juga. Sesuai dengan CourseTaken
definisi tabel di atas, semua kolom di CourseTaken
tabel harus berisi nilai bukan nol (NOT NULL
atribut menjamin ini). Count(SSNumber)
dan Count(*)
akan setara secara fungsional dalam contoh ini.
Output berikut dikembalikan:
+--------+------+-----------+-------+
| Course | Year | Avg Grade | Count |
+--------+------+-----------+-------+
| CSC101 | 2021 | 98 | 1 |
| CSC101 | 2022 | 92 | 2 |
+--------+------+-----------+-------+
Kesimpulan
Panduan ini menyediakan blok pembangun untuk operasi agregasi data SQL yang kuat untuk pengelompokan dan penjumlahan. Seperti yang disebutkan, Anda dapat membatasi nilai yang menjadi bagian dari grup ini dengan menggunakan Where
klausa dalam kueri sebelum agregasi dilakukan. Anda dapat memfilter baris hasil yang dikelompokkan (setelah agregasi dilakukan) dengan menggunakan Having
klausa dalam kueri SQL.