Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Pengantar Pengelompokan dan Penjumlahan SQL

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 dalam Year ). Oleh karena itu, Anda menghitung nilai rata-rata dan kelompok dengan CSC101 untuk tahun 2021 terpisah dari Nilai Rata-rata untuk CSC101 untuk tahun 2021 . Kursus CSC101 untuk Tahun 2021 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) berdasarkan Course 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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana cara mengaktifkan koneksi ulang otomatis klien MySQL dengan MySQLdb?

  2. Cara Memesan berdasarkan Nama Bulan di MySQL

  3. 10 fakta &tips menarik tentang MySQL

  4. Mencari Pencarian Teks Lengkap Sederhana? Coba MySQL InnoDB + CakePHP dengan Word Stemming

  5. Bahasa Kueri Neo4j - Cypher