Bài 4.2 – Truy vấn dữ liệu từ nhiều bảng SQL
Truy vấn dữ liệu từ nhiều bảng SQL (STRUCTURED QUERY LANGUAGE)
Tìm hiểu và cách sử dụng kết bảng: Kết bằng (EquiJoin), Kết không bằng (Non EquiJoin), Kết với chính mình (Self Join), Kết bằng mệnh đề Join
Các loại phép kết
- Kết bằng (EquiJoin)
- Kết không bằng (Non EquiJoin)
- Kết với chính mình (Self Join)
- Kết bằng mệnh đề Join
Phép kết bằng
- Sử dụng điều kiện kết bằng trong mệnh đề WHERE
- Nếu xuất hiện tên cột trùng nhau trong nhiều bảng thì bắt buộc phải sử dụng tên bảng hoặc bí danh bảng trước tên cột.
SELECT bang1.cot, bang2.cot
FROM bang1, bang2
WHERE bang1.cot1 = bang2.cot2
Phép kết bằng thực hiện như thế nào?

Kết quả nhận được từ phép kết bằng
SELECT nhanvien.manhanvien, nhanvien.tennv,nhanvien.maphong,
phong.maphong,phong.makhuvuc
FROM qlns.nhanvien, qlns.phong
WHERE nhanvien.maphong = phong.maphong;

Sử dụng bí danh cho bảng
Đơn giản hóa các câu truy vấn khi cần sử dụng tên bảng cho việc truy xuất các cột.
SELECT nv.manhanvien, nv.tennv, nv.maphong,ph.maphong, ph.makhuvuc
FROM qlns.nhanvien nv , qlns.phong ph
WHERE nv.maphong = ph.maphong;
Kết nhiều hơn hai bảng
Để kết n bảng, ta cần tối thiểu n-1 phép kết. Ví dụ để kết ba bảng, ta cần tối thiểu hai phép kết bảng.

Kết không bằng

Kết quả từ phép kết không bằng
SELECT nv.tennv, nv.mucluong, lcv.maloaicv
FROM qlns.nhanvien nv, qlns.loaicongviec lcv
WHERE nv.mucluong BETWEEN lcv.mucluong_min AND lcv.mucluong_max;

Kết với chính mình

SELECT nvien.honv+’ ‘+nvien.tennv + N' làm việc cho ' + nguoiqly.tennv as [Nhân viên và người QLý]
FROM qlns.nhanvien nvien, qlns.nhanvien nguoiqly
WHERE nvien.manguoiquanly = nguoiqly.manhanvien ;

Sử dụng mệnh đề JOIN để kết
SELECT bang1.cot, bang2.cot
FROM bang1
[CROSS JOIN bang2] |
[JOIN bang2
ON(bang1.ten_cot = bang2.ten_cot)] |
[LEFT|RIGHT|FULL [OUTER] JOIN bang2
ON (bang1.ten_cot = bang2.ten_cot) ]
Cross Joins
Mệnh đề CROSS JOIN sẽ kết mỗi dòng của bảng 1 với tất cả các dòng của bảng 2

Mệnh đề ON trong phép kết JOIN
- Tách biệt đều kiện kết với các điều kiện chọn lọc dữ liệu khác.
- Các câu truy vấn trở nên dễ đọc hơn.
Sử dụng mệnh đề JOIN …ON…
SELECT nv.manhanvien, nv.tennv, nv.maphong,ph.maphong, ph.makhuvuc
FROM qlns.nhanvien nv JOIN qlns.phong ph
ON (nv.maphong = ph.maphong)

Kết nhiều hơn hai bảng
SELECT manhanvien, tenphong, tenkhuvuc, thanhpho
FROM qlns.nhanvien nv
JOIN qlns.phong ph
ON ph.maphong = nv.maphong
JOIN qlns.khuvuc kv
ON ph.makhuvuc = kv.makhuvuc

Phép kết trái (LEFT [OUTER] JOIN)
SELECT nv.honv, nv.tennv, nv.maphong, ph.tenphong
FROM qlns.nhanvien nv
LEFT OUTER JOIN qlns.phong ph
ON (nv.maphong = ph.maphong)

Phép kết phải (RIGHT [OUTER] JOIN)
SELECT nv.honv, nv.tennv, nv.maphong, ph.tenphong
FROM qlns.nhanvien nv
RIGHT OUTER JOIN qlns.phong ph
ON (nv.maphong = ph.maphong)

Phép kết đầy đủ (FULL [OUTER] JOIN)
SELECT nv.honv, nv.tennv, nv.maphong, ph.tenphong
FROM qlns.nhanvien nv
FULL OUTER JOIN qlns.phong ph
ON (nv.maphong = ph.maphong)

Sử dụng biểu thức CASE trong truy vấn
CASE Biểu_thức
WHEN Giá_trị_1 THEN Biểu_thức_kết_quả_1
WHEN Giá_trị_2 THEN Biểu_thức_kết_quả_2
...]
[ELSE Biểu_thức_kết_quả_N]
END
- Giá trị 1, giá trị 2
- Các giá trị cụ thể để so sánh bằng (=) với biểu thức
- Biểu thức kết quả 1, biểu thức kết quả 2
- Biểu thức sẽ được trả về khi việc so sánh của biểu thức bằng với các giá trị so sánh tương ứng
Ví dụ
SELECT LOAI=
CASE LEFT(MAVTU, 2)
WHEN 'DD' THEN 'Đầu DVD'
WHEN 'VD' THEN 'Đầu VCD'
WHEN 'TV' THEN 'Tivi'
WHEN 'TL' THEN 'Tủ lạnh'
WHEN 'BI' THEN 'Bia lon'
WHEN 'LO' THEN 'Loa thùng'
ELSE 'Chưa phân loại'
END,
MAVTU, TENVTU, DVTINH
FROM VATTU
ORDER BY LEFT(MAVTU, 2)
Biểu thức CASE dạng tìm kiếm
CASE
WHEN Bt_logic_1 THEN Biểu_thức_kết_quả_1
[WHEN Bt_logic_2 THEN Biểu_thức_kết_quả_2
...]
[ ELSE Biểu_thức_kết_quả_N]
END
- Biểu thức logic1, biểu thức logic2
- Các biểu thức luận lý dùng để thực hiện các phép so sánh trong biểu thức CASE.
- Biểu thức kết quả 1, biểu thức kết quả 2
- Biểu thức sẽ được trả về khi một trong các biểu thức luận lý so sánh có kết quả là đúng.
Ví dụ
SELECT GHICHU=
CASE
WHEN PHANTRAM <20 THEN 'Lời ít'
WHEN PHANTRAM BETWEEN 20 AND 40 THEN 'Lời nhiều'
ELSE 'Rất lời'
END,
TENVTU, DVTINH, PHANTRAM
FROM VATTU
ORDER BY PHANTRAM
Bài tập
- Hiển thị danh sách các chi tiết phiếu xuất có thêm các cột tên vật tư, ngày xuất.Lọc theo số lượng xuất lớn hơn 5 và ngày xuất trong tháng 1/2009
- Hiển thị danh sách các nhà cung cấp gồm các thông tin sau: mã nhà cung cấp, tên nhà cung cấp đã có đặt hàng. Chú ý: không được trùng lắp dữ liệu
- Hiển thị danh sách các đơn đặt hàng gần đây nhất trong bảng DONDH
- Hiển thị danh sách các nhà cung cấp mà chưa có đơn đặt hàng
-- Câu 1
SELECT cx.*,vt.tenvtu,px.ngayxuat
FROM ctpxuat AS cx
INNER JOIN vattu AS vt ON cx.mavtu = vt.mavtu
INNER JOIN pxuat AS px ON cx.sopx = px.sopx
WHERE cx.slxuat > 5 AND MONTH(px.ngayxuat) = 1
-- Câu 2
SELECT DISTINCT cc.manhacc,cc.tennhacc
FROM nhacc AS cc
INNER JOIN dondh AS dh ON cc.manhacc = dh.manhacc
-- Câu 3
SELECT *
FROM dondh AS dh
ORDER BY dh.ngaydh DESC
-- Câu 4
SELECT *
FROM nhacc AS cc
WHERE cc.manhacc NOT IN (SELECT dh.manhacc FROM dondh AS dh)
Trả lời