Truy vấn dữ liệu - Phần 4¶
Tóm lược nội dung
Bài này trình bày câu lệnh truy vấn SELECT có dùng hàm tổng hợp và mệnh đề gom nhóm dữ liệu.
Yêu cầu về cơ sở dữ liệu¶
Tiếp tục sử dụng cơ sở dữ liệu school_db
đã tạo ở bài trước.
Nếu gặp trục trặc về cơ sở dữ liệu, hãy xoá school_db
(1) và tạo lại từ đầu (2).
-
1. Trong pgAdmin, click chuột phải vào school_db và chọn Delete.
2. Trong hộp thoại hiện ra, chọn Yes để xác nhận xoá.
-
Chạy tập tin school_db_script.sql bằng pdAdmin của PostgreSQL.
Các hàm tổng hợp¶
Hàm tổng hợp là hàm dùng để thực hiện các phép toán tổng hợp trên một tập hợp các giá trị và trả về một giá trị duy nhất.
Một số phép toan tổng hợp phổ biến là:
Hàm | Giá trị trả về |
---|---|
SUM |
Tổng của một cột |
AVG |
Trung bình cộng của một cột |
COUNT |
Số lượng giá trị của một cột |
MAX |
Giá trị lớn nhất của một cột |
MIN |
Giá trị nhỏ nhất của một cột |
Cú pháp hàm COUNT
Các hàm tổng hợp thường được sử dụng cùng với mệnh đề GROUP BY
trong truy vấn SELECT
.
GROUP BY
được dùng để gom nhóm các mẫu tin theo giá trị của một hoặc nhiều cột.
HAVING
được dùng để lọc các nhóm dựa trên điều kiện.
Hàm COUNT¶
Để đếm số lượng giá trị của một cột, ta dùng hàm COUNT
. Hàm này trả về số lượng giá trị khác NULL
của cột đó.
Số lượng tổng thể¶
Ví dụ:
Yêu cầu: Tính số lượng mẫu tin hiện có trong bảng scores
. Biết rằng không được dùng SELECT *
.
Phân tích:
Trong bảng scores
, thuộc tính student_id
thuộc khoá chính (1), nghĩa là không được để rỗng.
- Khoá chính của bảng
scores
là cặp thuộc tínhstudent_id
vàsubject_id
.
Do đó, ta có thể dùng hàm COUNT
để đếm các giá trị trong cột student_id
.
Mã lệnh SQL:
- Từ khoá
as
dùng để đặt tên cho một cột.
Output:
Kết hợp với WHERE¶
Ví dụ:
Yêu cầu: Cho biết số lượng điểm cuối kỳ từ 5 trở lên ở tất cả các môn.
Phân tích:
Trong số tất cả 66 mẫu tin của bảng scores
, ta chỉ đếm số mẫu tin mà điểm cuối kỳ từ 5 trở lên.
Như vậy, ta vẫn giữ lại truy vấn trên, nhưng thêm mệnh đề WHERE
để lọc ra các mẫu tin thỏa điều kiện.
Mã lệnh SQL:
Output:
Kết hợp với WHERE và GROUP BY¶
Ví dụ:
Yêu cầu: Cho biết số lượng điểm cuối kỳ từ 5 trở lên theo từng môn.
Phân tích:
Để biết số lượng điểm cuối kỳ từ 5 trở lên theo từng môn, ta cần gom nhóm các mẫu tin theo mã môn học subject_id
.
Như vậy, ta thêm mệnh đề GROUP BY
vào truy vấn trên: group by subject_id
. Đồng thời, thêm cột subject_id
vào mệnh đề SELECT
.
Mã lệnh SQL:
Output:
Lưu ý
Khi trong mệnh đề SELECT
vừa có thuộc tính vừa có hàm tổng hợp, ta cần thực hiện gom nhóm bằng GORUP BY
đối với các thuộc tính.
Kết hợp với WHERE, GROUP BY và HAVING¶
Ví dụ:
Yêu cầu: Cho biết những môn nào đạt số lượng hơn 10 học sinh mà có điểm cuối kỳ từ 5 trở lên.
Phân tích:
Vẫn là truy vấn trên, nhưng chỉ lấy những môn mà số lượng hơn 10.
Như vậy, ta sẽ thêm mệnh đề HAVING
: having count(student_id) > 10
.
Mã lệnh SQL:
Output:
Lưu ý
Mệnh đề HAVING
chỉ có thể được sử dụng sau mệnh đề GROUP BY
.
Phân biệt WHERE
và HAVING
:
WHERE | HAVING | |
---|---|---|
Công dụng | Lọc các mẫu tin trước khi gom nhóm | Lọc các nhóm sau khi gom nhóm |
Điều kiện | Áp dụng cho từng mẫu tin | Áp dụng cho từng nhóm |
Hàm AVG¶
Để tính trung bình cộng của một cột, ta dùng hàm AVG
.
Kết hợp với GROUP BY¶
Ví dụ:
Yêu cầu: Nhằm đánh giá chất lượng giảng dạy, hãy tính giá trị trung bình của cột điểm cuối kỳ theo từng môn. Kết quả trả về phải có tên môn học cụ thể, chứ không phải mã môn.
Phân tích:
Quan sát lược đồ trên, ta thấy điểm cuối kỳ được lưu trong bảng scores
, tên môn học được lưu trong bảng subjects
.
Do đó, ta liên kết hai bảng này bằng INNER JOIN
.
Để biết điểm trung bình của tất cả học sinh trong trường, ta dùng hàm AVG
đối với cột final_test
.
Để phân theo từng môn, ta thực hiện gom nhóm các mẫu tin theo tên môn.
Như vậy, mệnh đề GROUP BY
sẽ là group by subject_name
.
Mã lệnh SQL:
Output:
Kết hợp với WHERE và GROUP BY¶
Ví dụ:
Yêu cầu: Tính giá trị trung bình của cột điểm cuối kỳ cho riêng môn Khoa học máy tính.
Phân tích:
Truy vấn này tương tự truy vấn trên, nhưng chỉ lấy môn Khoa học máy tính.
Như vậy, ta thêm mệnh đề WHERE
vào truy vấn: where subject_name = 'Khoa học máy tính'
.
Mã lệnh SQL:
Output:
Kết hợp với GROUP BY và HAVING¶
Ví dụ:
Yêu cầu: Lọc ra các môn mà giá trị trung bình của cột điểm cuối kỳ lớn hơn 7.
Phân tích:
Truy vấn này tương tự truy vấn trên, nhưng không lấy môn Khoa học máy tính, mà lấy các môn nào có giá trị trung bình lớn hơn 7.
Nhu vậy, ta bỏ mệnh đề WHERE
của truy vấn trên, thay bằng mệnh đề HAVING
: having avg(final_test) > 7
.
Mã lệnh SQL:
Output:
Sơ đồ tóm tắt nội dung¶
Sơ đồ tóm tắt về hàm tổng hợp và gom nhóm
Some English words¶
Vietnamese | Tiếng Anh |
---|---|
gom nhóm | group by |
hàm tổng hợp | aggregate function |
Mã nguồn¶
Các đoạn mã trong bài được đặt tại GitHub.