Truy vấn dữ liệu từ nhiều bảng trong sql

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.

Bạn đang xem: Truy vấn dữ liệu từ 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.

Xem thêm: Chi Tiết Điểm Chuẩn Đại Học Xã Hội Nhân Văn 2015 : Trường Đh Lao Độ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 FROM qlns.nhanvien nvien, qlns.nhanvien nguoiqlyWHERE nvien.manguoiquanly = nguoiqly.manhanvien ;

*

Sử dụng mệnh đề JOIN để kết

SELECT bang1.cot, bang2.cotFROM bang1 | | JOIN bang2ON (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.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...>ENDGiá trị 1, giá trị 2Các giá trị cụ thể để so sánh bằng (=) với biểu thứcBiểu thức kết quả 1, biểu thức kết quả 2Biể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, 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< ELSE Biểu_thức_kết_quả_N>ENDBiểu thức logic1, biểu thức logic2Cá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ả 2Biể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

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)

Bài viết tiếp theo