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 đề WHERENế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.
Đang xem: Truy vấn nhiều bảng trong sql
SELECT bang1.cot, bang2.cotFROM bang1, bang2WHERE 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.makhuvucFROM qlns.nhanvien, qlns.phongWHERE 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.makhuvucFROM qlns.nhanvien nv , qlns.phong phWHERE 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.maloaicvFROM qlns.nhanvien nv, qlns.loaicongviec lcvWHERE 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
Sử dụng mệnh đề JOIN để kết
SELECT bang1.cot, bang2.cotFROM bang1
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.makhuvucFROM 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, thanhphoFROM 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 JOIN)
SELECT nv.honv, nv.tennv, nv.maphong, ph.tenphongFROM qlns.nhanvien nv LEFT OUTER JOIN qlns.phong ph ON (nv.maphong = ph.maphong)
Phép kết phải (RIGHT JOIN)
SELECT nv.honv, nv.tennv, nv.maphong, ph.tenphongFROM qlns.nhanvien nv RIGHT OUTER JOIN qlns.phong ph ON (nv.maphong = ph.maphong)
Phép kết đầy đủ (FULL JOIN)
SELECT nv.honv, nv.tennv, nv.maphong, ph.tenphongFROM 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ứcWHEN Giá_trị_1 THEN Biểu_thức_kết_quả_1WHEN Giá_trị_2 THEN Biểu_thức_kết_quả_2…>
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, DVTINHFROM VATTUORDER BY LEFT(MAVTU, 2)
Biểu thức CASE dạng tìm kiếm
CASEWHEN Bt_logic_1 THEN Biểu_thức_kết_quả_1
Ví dụ
SELECT GHICHU= CASE WHEN 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/2009Hiể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ệuHiển thị danh sách các đơn đặt hàng gần đây nhất trong bảng DONDHHiển thị danh sách các nhà cung cấp mà chưa có đơn đặt hàng– Câu 1SELECT cx.*,vt.tenvtu,px.ngayxuatFROM ctpxuat AS cx INNER JOIN vattu AS vt ON cx.mavtu = vt.mavtu INNER JOIN pxuat AS px ON cx.sopx = px.sopxWHERE cx.slxuat > 5 AND MONTH(px.ngayxuat) = 1 — Câu 2SELECT DISTINCT cc.manhacc,cc.tennhaccFROM nhacc AS cc INNER JOIN dondh AS dh ON cc.manhacc = dh.manhacc — Câu 3SELECT *FROM dondh AS dhORDER BY dh.ngaydh DESC — Câu 4SELECT *FROM nhacc AS ccWHERE cc.manhacc NOT IN (SELECT dh.manhacc FROM dondh AS dh)