Truy vấn lồng là một phương pháp sử dụng trong SQL Server khi câu lệnh WHERE chứa một câu lệnh SELECT. Đây là một trong những vấn đề khó khăn nhất khi làm việc với truy vấn dữ liệu. Cùng tìm hiểu về truy vấn lồng và các ví dụ minh họa đi kèm.
Truy vấn lồng - Khám phá cách hoạt động
- Câu lệnh SELECT có thể lồng nhiều mức.
- Các câu truy vấn con trong mệnh đề WHERE được kết hợp bằng các phép nối logic.
- Câu truy vấn con thường trả về một tập hợp các giá trị.
- Mệnh đề WHERE của câu truy vấn cha được xác định bằng cách sử dụng các biểu thức so sánh tập hợp với truy vấn con.
Có hai loại truy vấn lồng:
- Lồng phân cấp: Mệnh đề WHERE của câu truy vấn con không tham chiếu đến thuộc tính của các mối quan hệ trong câu truy vấn cha. Câu truy vấn con được thực hiện trước câu truy vấn cha.
- Lồng tương quan: Mệnh đề WHERE của câu truy vấn con tham chiếu ít nhất một thuộc tính của các mối quan hệ trong câu truy vấn cha.
Cú pháp truy vấn lồng
SELECT DANH_SACH_COT FROM DANH_SACH_QUAN_HE WHERE ( SELECT DANH_SACH_COT FROM DANH_SACH_QUAN_HE WHERE DIEU_KIEN )
Hãy xem một số ví dụ minh họa để hiểu cách truy vấn lồng hoạt động.
Ví dụ minh họa
Để thuận tiện cho việc học tập, chúng ta đã tạo sẵn một file .sql có cấu trúc bảng và dữ liệu để thực hiện truy vấn. Bạn có thể tải file tại đây.
Ví dụ 1: Tìm họ và tên của các nhân viên trực thuộc các phòng ban ở TP HCM
Hướng dẫn giải:
Bước 1: Tìm tất cả các phòng có địa điểm TP HCM
SELECT MAPHG FROM DIADIEM_PHG WHERE DIADIEM = 'TP HCM'
Bước 2: Tìm nhân viên trực thuộc các phòng trong bước 1
SELECT HONV, TENLOT, TENNV FROM NHANVIEN WHERE PHG IN (SELECT MAPHG FROM DIADIEM_PHG WHERE DIADIEM = 'TP HCM')
Kết quả:
Ví dụ 2: Tìm họ và tên của các nhân viên không tham gia vào đề án 10
Hướng dẫn giải:
Bước 1: Tìm tất cả các nhân viên tham gia vào đề án 10
SELECT MA_NVIEN FROM PHANCONG WHERE SODA = 10
Bước 2: Tìm nhân viên không thuộc danh sách trong bước 1
SELECT HONV, TENLOT, TENNV FROM NHANVIEN WHERE MANV NOT IN (SELECT MA_NVIEN FROM PHANCONG WHERE SODA = 10)
Kết quả:
Ví dụ 3: Tìm nhân viên có lương lớn hơn lương ít nhất một nhân viên phòng 4
Cách 1: Viết câu truy vấn dạng lồng phân cấp
Hướng dẫn giải:
Bước 1: Tìm lương của tất cả nhân viên phòng 4
SELECT LUONG FROM NHANVIEN WHERE PHG = 4
Bước 2: Tìm nhân viên có mức lương lớn hơn ít nhất một mức lương trong bước 1
SELECT HONV, TENLOT, TENNV FROM NHANVIEN WHERE LUONG > ANY (SELECT LUONG FROM NHANVIEN WHERE PHG = 4)
Kết quả:
Cách 2: Viết truy vấn dạng lồng tương quan
Hướng dẫn giải:
SELECT HONV, TENLOT, TENNV FROM NHANVIEN NV1 WHERE EXISTS (SELECT HONV, TENLOT, TENNV FROM NHANVIEN NV2 WHERE NV2.PHG = 4 AND NV1.LUONG > NV2.LUONG)
Kết quả:
Ví dụ 4: Tìm nhân viên có lương lớn hơn lương của tất cả nhân viên phòng 4
Hướng dẫn giải:
Bước 1: Tìm lương của tất cả nhân viên phòng 4
SELECT LUONG FROM NHANVIEN WHERE PHG = 4
Bước 2: Tìm nhân viên có mức lương lớn hơn tất cả các mức lương trong bước 1
SELECT HONV, TENLOT, TENNV FROM NHANVIEN WHERE LUONG > ALL (SELECT LUONG FROM NHANVIEN WHERE PHG = 4)
Kết quả: