Khi thông tin nằm ở hai bảng
Bảng học sinh giữ mã lớp; bảng lớp giữ tên giáo viên phụ trách. Muốn xem cả học sinh và giáo viên, ta nối hai bảng theo khóa phù hợp.
Ghép đúng rồi mới tổng hợp
JOIN ... ON nêu điều kiện ghép. INNER JOIN chỉ giữ các cặp khớp; LEFT JOIN giữ mọi hàng bên trái, phần bên phải không khớp được biểu diễn bằng NULL. Thiếu hoặc sai điều kiện có thể làm số hàng tăng ngoài ý muốn.
COUNT(*) đếm hàng; COUNT(cột) đếm giá trị khác NULL của cột; SUM tính tổng, AVG tính trung bình các giá trị khác NULL. GROUP BY chia nhóm để tổng hợp. WHERE lọc hàng trước khi nhóm; HAVING lọc kết quả nhóm. Trong các ví dụ, cột điểm đều có giá trị số, không NULL.
Nối học sinh với lớp
Bảng HocSinh: (H01, An, A), (H02, Binh, A). Bảng Lop: (A, CoLan), (B, CoHoa).
```sql
SELECT h.HoTen, l.GiaoVien
FROM HocSinh AS h
JOIN Lop AS l ON h.MaLop = l.MaLop;
```
Kết quả An–CoLan và Binh–CoLan. Mỗi học sinh ghép với lớp đúng mã, không ghép với mọi lớp chỉ vì hai bảng đều có dữ liệu.
Thử vận dụng
Hàm nào đếm tất cả hàng trong nhóm, kể cả khi một cột có NULL?
Đúng: đếm số hàng.
COUNT cột không đếm giá trị NULL.
SUM cộng các giá trị số.
AVG tính trung bình.
Lời giải
COUNT(*) đếm hàng; COUNT(cột) bỏ các giá trị NULL của chính cột đó.
Tổng hợp theo lớp
Dùng bảng HocSinh của bài SELECT (An 12A 8; Binh 12B 6; Chi 12A 9; Dung 12B 8):
```sql
SELECT Lop, COUNT(*) AS SoHS, AVG(Diem) AS DiemTB
FROM HocSinh
GROUP BY Lop
ORDER BY Lop;
```
Kết quả 12A có 2 học sinh, trung bình 8,5; 12B có 2 học sinh, trung bình 7. Ta tính trong từng nhóm, không lấy trung bình toàn bảng cho mọi lớp.
Ví dụ xem cách làm
Trong ví dụ nối bảng, nếu bỏ điều kiện và ghép mọi học sinh với mọi lớp, có bao nhiêu cặp?
Lời giải
2×2 = 4 cặp, thay vì hai cặp đúng mã. Dữ liệu giáo viên không còn được gắn đúng quan hệ.
Ví dụ xem cách làm
Muốn chỉ xem nhóm lớp có từ 2 học sinh trở lên, dùng điều kiện nào sau GROUP BY Lop?
Lời giải
HAVING COUNT(*) >= 2. Đây là điều kiện trên kết quả đếm của nhóm, không phải điều kiện trên từng hàng ban đầu.
Những điều cần nhớ
Đọc điều kiện nối trước khi đếm hàng. Phân biệt lọc hàng và lọc nhóm; COUNT(*) không giống COUNT(cột) khi có NULL.
Đang học