:bulb: Định nghĩa:
truy vấn lồng là câu truy vấn mà bên trong của nó chưa 1 câu truy vấn khác
Nằm đâu cũng được từ SELECT, FROM cho tới WHERE (thường nhất)
vd
nằm trong select
nằm trong from
nằm trong where
Ta có 2 loại truy vấn lồng
- Truy vấn lồng phân cấp. Câu con độc lập câu cha
- Truy vấn lồng tương quan. Câu con phụ thuộc câu cha
2 câu query độc lập nhau
Trong mệnh đề phân cấp ta sẽ làm quen với các toán tử
IN
ALL
ANY | SOME
ta thấy mệnh đề WHERE của câu con có liên quan đến câu cha
Trong mệnh đề tương quan ta sẽ làm quen với các toán tử
EXISTS
ALL
ANY | SOME
cú pháp
:bulb: Định nghĩa:
Toán tử EXISTS trả về True nếu truy vấn con trả về một hoặc nhiều dòng dữ liệu.
ví dụ
Lấy ra tên họ của những người xuất hiện trong bảng Employee có mức lương rate cao hơn 30
trái với EXIST ta có NOT EXIST
Ưu điểm của việc sử dụng toán tử SQL EXISTS và NOT EXISTS là việc thực thi truy vấn con bên trong có thể dừng lại miễn là tìm thấy một bản ghi phù hợp.
Nếu truy vấn con yêu cầu quét một khối lượng lớn các bản ghi, việc dừng thực thi truy vấn con ngay sau khi một bản ghi được khớp có thể tăng tốc đáng kể thời gian phản hồi truy vấn tổng thể
:bulb: Định nghĩa:
Toán tử IN trả về True nếu giá trị khớp với 1 hay nhiều giá trị trong kết quả trả về hay danh sách
ví dụ
Lấy ra tên họ của những người xuất hiện trong bảng Employee có mức lương rate cao hơn 30
Phủ đinh của IN là NOT IN
:bulb: Định nghĩa:
Nếu truy vấn con hoặc biểu thức được so sánh với <columns> có NULL trong kết quả sử dụng IN hoặc NOT IN đều trả về UNKNOWN. Sử dụng các giá trị null cùng với IN hoặc NOT IN có thể tạo ra kết quả không mong muốn.
vd
trả về kết quả đúng nếu scalar_expression lớn hơn tất cả hay khác tất cả ,… các kết quả cảu sub query
ví dụ tìm họ tên người có rate lương cao nhất
trả về kết quả đúng nếu scalar_expression lớn hơn Một hay một vài hay khác Một hay một vài ,… các kết quả cảu sub query
1 Tìm ra SalesOrderID, CustomerID mua được nhiều sản phẩm nhất trong 1 đơn hàng
VỚI IN
VỚI EXITST
cách 2 có the giải bằng join
cách 3 có thể giải bằng EXISTS
Dựa vào bảng trên lấy ra BusinessEntityID,LoginID,JobTitle, VacationHours.
Với điều kiện VacationHours >= số giờ nghỉ phép trung bình [avg(VacationHours)] của toàn bảng.
2.
lấy tên của những nhân viên cũng đồng thời là khách hàng
giá bằng giá sản phẩm tên 'Touring End Caps'
Cùng quan sát NOT IN nhạy cảm thể nào với giá trị NULL.
bảng vendor là bảng chưa thông tin những Công Ty mà công ty Adventure work mua linh kiện. Product vendor là bảng mapping với bảng Vendor thông qua những sản phẩm mà công ty đó bán.
Bước 1 ta tạo ra 1 bảng MyVendor với câu lệnh sau copy chạy
Dùng "NOT IN" để tìm ra "Product.[Name]", "ProductVendor.BusinessEntityID", "ProductVendor.StandardPrice", "Product.ListPrice". Với những ProductVendor.BusinessEntityID không xuất hiện trong bảng MyVendors vừa tạo
_ Sau khi chạy xong ra kết quả như bên dưới
ta tiếp tục thêm một câu lệnh thêm 1 dòng dữ liệu Null vào bang MyVendors
Sau đó chạy lại câu query của bạn lucs nảy, và so sánh dữ liệu.
1 đảm bảo câu subquery không chứa giá trị NULL
2 Hoặc đảm bảo bẳng MyVendors không thêm đc giá trị NULL