Một trong những khía cạnh mạnh mẽ nhất của SQL là khả năng thực hiện tổng hợp dữ liệu. Hai trong số các công cụ tổng hợp dữ liệu SQL mạnh mẽ nhất là phân nhóm và tổng cộng . Trong hướng dẫn này, bạn học tập hợp dữ liệu SQL bằng cách sử dụng nhóm và tính tổng.
Hàm tổng hợp trong SQL
Trong SQL, tổng hợp là quá trình vận hành hoặc tính toán một tập giá trị. Mục đích là trả về một giá trị tóm tắt duy nhất. SQL bao gồm một số Hàm tổng hợp rất mạnh mẽ như AVG()
, COUNT()
, SUM()
, MAX()
và MIN()
. Đến lượt nó, các hàm này thường được tìm thấy nhất trong các câu lệnh SQL triển khai GROUP BY
mệnh đề. Tuy nhiên, các chức năng này không cần phải được liên kết với điều khoản đó.
Lưu ý Trừ khi được đề cập khác, tất cả các lệnh cơ sở dữ liệu được trình bày trong hướng dẫn này hoạt động tốt trên cả MySQL và PostgreSQL .
Hướng dẫn này sử dụng CourseTaken
bảng để chứng minh các hàm tổng hợp. Từ dòng lệnh, tạo CourseTaken
bảng.
CREATE TABLE CourseTaken (
SSNumber CHAR(9) NOT NULL,
CourseId CHAR(6) NOT NULL,
NumericGrade INT NOT NULL,
YearTaken INT NOT NULL
);
CourseTaken
bảng chứa dữ liệu cột sau:
SSNumber | CourseId | NumericGrade | YearTaken |
---|---|---|---|
111111111 | CSC101 | 98 | 2021 |
111111111 | ENG101 | 95 | 2022 |
222222222 | CSC101 | 100 | 2022 |
222222222 | EEE101 | 75 | 2022 |
333333333 | POL101 | 92 | 2021 |
333333333 | CSC101 | 84 | 2022 |
Sử dụng một Hàm tổng hợp trong SQL để tính một giá trị tóm tắt duy nhất
Các phần bên dưới cung cấp các ví dụ khác nhau sử dụng các hàm tổng hợp để trả về một giá trị tóm tắt duy nhất. Tất cả các ví dụ đều sử dụng CourseTaken
bảng đã được tạo trong phần Hàm tổng hợp của hướng dẫn.
Ví dụ 1:
Trong ví dụ này, hàm tổng hợp trả về điểm số trung bình cho tất cả sinh viên tham gia khóa học CSC101
vào năm 2022.
SELECT AVG(NumericGrade) AS 'Avg Grade'
FROM CourseTaken
WHERE CourseId = 'CSC101
AND YearTaken = 2022;
SQL trả về điểm trung bình sau:
Avg Grade
---------
92
Ví dụ 2:
Hàm tổng hợp bên dưới trả về số lượng sinh viên đã tham gia khóa học CSC101
trước năm 2022.
SELECT COUNT(SSNumber) AS 'Student Count'
FROM CourseTaken
WHERE CourseId = 'CSC101'
AND YearTaken < 2022;
Số lượng sau được trả về:
Student Count
---------
1
Ví dụ 3:
Trong ví dụ này, một hàm tổng hợp được sử dụng để lấy điểm số tối đa được ghi lại trong bất kỳ năm nào bởi Sinh viên thi CSC101
.
SELECT MAX(NumericGrade) AS 'Max Grade'
FROM CourseTaken
WHERE CourseId = 'CSC101'
Điểm tối đa được trả lại là như sau:
Max Grade
---------
100
Dữ liệu tổng hợp bằng cách sử dụng các hàm của nhóm
Các ví dụ sau chứng minh việc sử dụng GROUP BY
mệnh đề sử dụng dữ liệu từ CourseTaken
bảng.
Ví dụ 1:
Ví dụ dưới đây xác định điểm trung bình của mỗi sinh viên cho tất cả các khóa học mà họ đã học cho đến nay. Để thực thi điều này, hãy sử dụng SQL Group By
mệnh đề nhóm theo Sinh viên (trong trường hợp này là SSNumber
cột).
SELECT SSNumber, AVG(NumericGrade) AS 'Avg Grade'
FROM CourseTaken
GROUP BY SSNumber
Kết quả trả về điểm trung bình cho mỗi học sinh.
+-----------+----------+
| SSNumber | Avg Grade|
+-----------+----------+
| 111111111 | 96.5 |
| 222222222 | 87.5 |
| 333333333 | 88 |
+-----------+----------+
Ví dụ 2:
Hàm tổng hợp bên dưới tìm điểm trung bình nhận được qua mỗi CourseId
trong CourseTaken
bàn. Để thực hiện việc này, hãy nhóm theo CourseId
trong YearTaken
với mã SQL sau:
SELECT CourseId AS 'Course', YearTaken AS 'Year',
AVG(NumericGrade) AS 'Avg Grade'
FROM CourseTaken
GROUP BY CourseId, YearTaken
ORDER BY CourseId, YearTaken
Bạn sẽ thấy kết quả sau:
+--------+------+-----------+
| Course | Year | Avg Grade |
+--------+------+-----------+
| CSC101 | 2021 | 98 |
| POL101 | 2021 | 92 |
| CSC101 | 2022 | 92 |
| EEE101 | 2022 | 75 |
| ENG101 | 2022 | 95 |
+--------+------+-----------+
Lưu ý Ví dụ trên phức tạp hơn một chút. Bạn nhóm theo hai cột thay vì một (CourseId
trong vòngYear
). Do đó, bạn tính điểm trung bình và nhóm theoCSC101
cho năm2021
tách biệt với Điểm trung bình choCSC101
cho năm2022
. Khóa họcCSC101
cho Năm2022
là tập hợp của hai hàng, trong khi tất cả các hàng Nhóm Theo khác là tập hợp của một hàng. Ngoài ra, từ khái niệm Đặt hàng (Order By
mệnh đề) bạn có thể hiển thị các kết quả có thứ tự (được sắp xếp) theoCourse
trong một năm nhất định.
Ví dụ 3:
Từ truy vấn SQL trong ví dụ trước, bạn có thể hạn chế số hàng mà bạn thao tác bằng cách thêm WHERE
mệnh đề cho truy vấn. Ví dụ:để tạo điểm trung bình mà sinh viên nhận được chỉ cho CourseId
CSC101
, nhóm theo CourseId
trong YearTaken
. Mã SQL sau có thể thực hiện điều này:
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
Trong mã SQL ở trên, bạn đang thêm một điều kiện (thông qua WHERE
) trước khi tổng hợp nhóm thực tế được thực hiện (thông qua GROUP BY
mệnh đề).
Kết quả sau được trả về:
+--------+------+-----------+
| Course | Year | Avg Grade |
+--------+------+-----------+
| CSC101 | 2021 | 98 |
| CSC101 | 2022 | 92 |
+--------+------+-----------+
Ví dụ 4:
Từ truy vấn SQL trong Ví dụ 2, bạn có thể áp dụng một điều kiện trước khi trả về kết quả cuối cùng. Để thực hiện điều này, hãy sử dụng Having
trong SQL mệnh đề. Bạn có thể xác định điểm trung bình trên mọi CourseId
, trong đó điểm trung bình tổng hợp lớn hơn 90
. Bạn có thể nhóm lại theo CourseId
trong YearTaken
. Mã SQL sau có thể thực hiện điều này:
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
Kết quả như sau:
+--------+------+-----------+
| Course | Year | Avg Grade |
+--------+------+-----------+
| CSC101 | 2021 | 98 |
| POL101 | 2021 | 92 |
| CSC101 | 2022 | 92 |
| ENG101 | 2022 | 95 |
+--------+------+-----------+
Hàng cho CourseId
EEE101
đã không được trả lại. Điều này là do Having
mệnh đề lọc ra sau GROUP BY
mệnh đề đã được thực thi (CourseId
EEE101
Điểm trung bình của tôi là dưới 90).
Ví dụ 5:
Xây dựng dựa trên mã SQL từ Ví dụ 3 và Ví dụ 4 , bạn có thể tạo các truy vấn tổng hợp sử dụng cả Where
và Having
mệnh đề. Ví dụ:bạn có thể xác định các khóa học đã được thực hiện trong 2021
, trong đó điểm trung bình cho các khóa học đó đã thực hiện lớn hơn 93
. Đây, Where
mệnh đề lọc ra các kết quả trước Group By
tổng hợp dữ liệu được thực hiện và Having
mệnh đề lọc ra các kết quả trả về sau Group By
tổng hợp dữ liệu được thực hiện. Mã SQL sau có thể thực hiện điều này:
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
Kết quả trả về như sau:
+--------+------+-----------+
| Course | Year | Avg Grade |
+--------+------+-----------+
| CSC101 | 2021 | 98 |
+--------+------+-----------+
Ví dụ 6:
Bạn có thể đếm số hàng được liên kết với mỗi Group By
tổng hợp trong một truy vấn. Dựa trên mã SQL mẫu trước đó, bạn có thể tạo điểm trung bình mà Students
nhận được chỉ dành cho CourseId
CSC101
, được nhóm theo CourseId
trong YearTaken
. Mã phải cung cấp số lượng sinh viên (số lượng) được liên kết với mỗi nhóm. Mã SQL sau có thể thực hiện điều này:
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)
trong SELECT
mệnh đề có thể đã được chỉ định là Count(*)
. Sự khác biệt giữa hai cú pháp là Count(*)
bao gồm các hàng có NULL
các giá trị trong chúng cũng như vậy. Theo CourseTaken
định nghĩa bảng ở trên, tất cả các cột trong CourseTaken
bảng phải chứa các giá trị không rỗng (NOT NULL
thuộc tính đảm bảo điều này). Count(SSNumber)
và Count(*)
sẽ tương đương về mặt chức năng trong ví dụ này.
Kết quả sau được trả về:
+--------+------+-----------+-------+
| Course | Year | Avg Grade | Count |
+--------+------+-----------+-------+
| CSC101 | 2021 | 98 | 1 |
| CSC101 | 2022 | 92 | 2 |
+--------+------+-----------+-------+
Kết luận
Hướng dẫn này cung cấp các khối xây dựng cho các hoạt động tổng hợp dữ liệu mạnh mẽ của SQL để nhóm và tính tổng. Như đã lưu ý, bạn có thể hạn chế các giá trị trở thành một phần của các nhóm này bằng cách sử dụng Where
mệnh đề trong các truy vấn trước khi tập hợp được thực hiện. Bạn có thể lọc ra các hàng kết quả được nhóm lại (sau khi tổng hợp được thực hiện) bằng cách sử dụng Having
mệnh đề trong các truy vấn SQL.