Bài 4.2 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?

phép bằng được thực hiện 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;

Phép bằng kết quả

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 nhiều hơn hai bảng

Kết không 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 quả phép kết không bằng

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

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 ;

Kết cho chính mình kết quả

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

cross joins

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)

cross joins demo

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

cross joins nhiều bảng

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)

cross joins left

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)

cross joins right

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)

cross joins full

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

  1. 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
  2. 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
  3. Hiển thị danh sách các đơn đặt hàng gần đây nhất trong bảng DONDH
  4. 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)

 

Chia sẽ bài viết :


Bài viết liên quan

Bài 5 Lập trình với CSDL

Hiểu và trình bày được các phương thức, thuộc tính của các đối tượng truy xuất cơ sở dữ liệu, cách thức truy xuất, duyệt nội dung cơ sở dữ liệu; các đ ...

Progressive Web Apps là gì?

Web Apps Progressive là một cấp độ hoàn toàn mới của chăm sóc về chất lượng trải nghiệm người dùng đầu cuối của bạn. Các nghiên cứu khác cho thấy kết ...