Toán tử EXCEPT trong SQL Server được sử dụng để trả về các hàng trong câu lệnh SELECT đầu tiên không được trả về trong câu lệnh SELECT thứ hai. Mỗi câu lệnh SELECT sẽ có một tập dữ liệu. Toán tử EXCEPT lấy bản ghi từ tập 1 và xóa kết quả khỏi tập 2.
TRỪ truy vấn
TRỪ hình minh họa truy vấn
Giải thích: Truy vấn EXCEPT trả về các bản ghi trong vùng màu xanh lam, chỉ trong tập dữ liệu 1 và không phải trong tập dữ liệu 2.
Mỗi câu lệnh SELECT trong truy vấn EXCEPT phải có cùng số trường trong tập kết quả với cùng kiểu dữ liệu.
TRỪ cú pháp toán tử
SELECT bieu_thuc1thuc1, bieu_thuc2, … bieu_thucn
FROM bang
[WHERE dieu_kien]
EXCEPT
SELECT bieu_thuc1, bieu_thuc2, … bieu_thucn
FROM bang
[WHERE dieu_kie
n];
Tên biến hoặc giá trị biến
bieu_thuc
Cột hoặc giá trị bạn muốn so sánh giữa các câu lệnh SELECT. Chúng không cần phải nằm trong cùng một trường thông tin tại mỗi câu lệnh SELECT nhưng các cột tương ứng phải có cùng dữ liệu.
trạng thái
Bảng muốn lấy các bản ghi từ đó. Phải có ít nhất 1 bảng trong mệnh đề FROM.
WHERE dieu_kien
Tùy chọn. Các điều kiện phải đáp ứng cho bản ghi đã chọn.
Lưu ý:
- Hai câu lệnh SELECT phải có cùng số lượng biểu thức.
- Cột tương ứng trong mỗi câu lệnh SELECT phải có cùng kiểu dữ liệu.
- Toán tử EXCEPT trả về tất cả các bản ghi từ câu lệnh SELECT đầu tiên chứ không phải trong câu lệnh SELECT thứ hai.
- Toán tử EXCEPT trong SQL Server tương đương với toán tử MINUS trong Oracle.
Ví dụ - với 1 biểu thức
SELECTsanpham_id
FROM sanpham
EXCEPT
SELECT sanpham_id
FROM hang
tonkho;
Trong ví dụ với toán tử EXCEPT này, kết quả trả về tất cả các giá trị sanpham_id trong bảng biến chứ không phải trong bảng hangtonkho. Điều này có nghĩa là nếu giá trị sanpham_id có sẵn trên cả hai bảng, nó sẽ không được trả về.
Ví dụ - với nhiều biểu thức
SELECT danhba_id, ho, ten
FROM danhba
WHERE ho = 'Anderson'
EXCEPT
SELECT nhanvien_id, ho, ten
FROM nhanvien
;
Trong ví dụ này, truy vấn trả về các bản ghi trong bảng namba có ID liên hệ, họ và tên không khớp với ID, họ và tên của nhân viên trong bảng.
Ví dụ - sử dụng mệnh đề ORDER BY
SELECT nhacung_id, nhacung_ten
FROM nhacung
WHERE bang = 'Florida'
EXCEPT
SELECT congty_id, congty_ten
FROM congty
WHERE congty_id <= 400
ORDER BY 2;
Trong ví dụ này, vì tên cột trong hai câu lệnh SELECT khác nhau, nên việc tham chiếu đến cột theo mệnh đề ORDER BY thông qua vị trí trong tập kết quả sẽ dễ dàng hơn. Trong ví dụ trên, chúng tôi lọc kết quả nhacung_ten / congty_ten theo thứ tự tăng dần thông qua cụm từ ORDER BY 2.
Vì nhacung_ten / congty_ten đứng thứ 2 trong tập kết quả.