Trang chủ
PHASE 1: CƠ SỞ KHOA HỌC MÁY TÍNH (DAY 1-30)/Ngày 14/100
DAY 14🇯🇵 SQL応用
SQL Nâng cao (JOIN, GROUP BY, SubQuery)
14%
Quảng cáo • Advertisement
📢 Sponsor Ad
Google AdSense
lesson.content.title
lesson.content.subtitle
🎯 Mục tiêu bài học
Sau bài này, bạn sẽ hiểu JOIN, GROUP BY, HAVING, và SubQuery — các kỹ thuật SQL nâng cao hay ra trong thi FE.
1. JOIN — Kết hợp nhiều bảng
🏠 Ví dụ: JOIN giống như ghép 2 danh sách
Danh sách 1: Sinh viên (MaSV, TenSV, MaKhoa). Danh sách 2: Khoa (MaKhoa, TenKhoa). JOIN = ghép chúng lại qua MaKhoa để biết sinh viên thuộc khoa nào!
| Loại JOIN | Kết quả | Dễ nhớ |
|---|---|---|
| INNER JOIN | Chỉ lấy dòng khớp ở CẢ 2 bảng | Giao (∩) |
| LEFT JOIN | Hết bảng trái + khớp bảng phải (NULL nếu không khớp) | Trái ưu tiên |
| RIGHT JOIN | Hết bảng phải + khớp bảng trái | Phải ưu tiên |
| FULL OUTER JOIN | Tất cả từ cả 2 bảng | Hợp (∪) |
| CROSS JOIN | Tích Descartes (mỗi dòng A × mỗi dòng B) | Tất cả tổ hợp |
SELECT sv.TenSV, k.TenKhoa
FROM SinhVien sv
INNER JOIN Khoa k ON sv.MaKhoa = k.MaKhoa;
2. GROUP BY & Aggregate Functions
| Hàm | Chức năng | Ví dụ |
|---|---|---|
| COUNT(*) | Đếm số dòng | Đếm SV mỗi khoa |
| SUM(cot) | Tính tổng | Tổng doanh thu |
| AVG(cot) | Trung bình | Điểm TB mỗi lớp |
| MAX(cot) | Giá trị lớn nhất | Điểm cao nhất |
| MIN(cot) | Giá trị nhỏ nhất | Lương thấp nhất |
SELECT MaKhoa, COUNT(*) as SoSV, AVG(Diem) as DiemTB
FROM SinhVien
GROUP BY MaKhoa
HAVING AVG(Diem) >= 7.0
ORDER BY DiemTB DESC;
⚠️ WHERE vs HAVING — Hay ra thi!
WHERE: Lọc TRƯỚC khi nhóm (GROUP BY). Không dùng được aggregate function.
HAVING: Lọc SAU khi nhóm. Dùng được COUNT, AVG, SUM...
3. SubQuery (Truy vấn lồng)
-- Tìm SV có điểm cao hơn trung bình
SELECT TenSV, Diem FROM SinhVien
WHERE Diem > (SELECT AVG(Diem) FROM SinhVien);
📝 Tóm tắt nhanh
- INNER JOIN = chỉ lấy khớp | LEFT JOIN = ưu tiên trái
- GROUP BY nhóm dữ liệu → dùng với COUNT, SUM, AVG
- WHERE lọc trước GROUP BY | HAVING lọc sau GROUP BY
- SubQuery: truy vấn trong truy vấn
🎯 Câu hỏi ôn thi FE #3
Hỏi: Viết SQL đếm số sinh viên mỗi khoa, chỉ hiển thị khoa có hơn 50 SV?
Đáp: SELECT MaKhoa, COUNT(*) FROM SinhVien GROUP BY MaKhoa HAVING COUNT(*) > 50
Quảng cáo • Advertisement
📢 Ad Space
Google AdSense