Toán tử EXCEPT trong SQL Server được sử dụng để trả về các dòng trong câu lệnh SELECT đầu tiên mà không xuất hiện trong câu lệnh SELECT thứ hai. Mỗi câu SELECT tạo ra một tập dữ liệu riêng biệt; EXCEPT lấy các bản ghi từ tập 1 và loại bỏ những bản ghi trùng khớp với tập 2.
Minh họa truy vấn EXCEPT

Minh họa truy vấn EXCEPT
Giải thích: Truy vấn EXCEPT trả về các bản ghi ở vùng màu xanh – chỉ có trong tập dữ liệu 1 và không có trong tập dữ liệu 2.
Mỗi câu SELECT trong truy vấn EXCEPT phải có cùng số lượng trường trong tập kết quả và các trường tương ứng phải có cùng kiểu dữ liệu.
Cú pháp toán tử EXCEPT
SELECT bieu_thuc1, bieu_thuc2, … bieu_thucn
FROM bang
[WHERE dieu_kien]
EXCEPT
SELECT bieu_thuc1, bieu_thuc2, … bieu_thucn
FROM bang
[WHERE dieu_kien];
Tham số
bieu_thuc
Cột hoặc giá trị bạn muốn so sánh giữa các câu SELECT. Chúng không cần nằm ở cùng một trường thông tin trong từng câu SELECT, nhưng các cột tương ứng phải chứa cùng loại dữ liệu.
bang
Bảng muốn lấy bản ghi. Phải có ít nhất 1 bảng trong mệnh đề FROM.
WHERE dieu_kien
Tùy chọn. Điều kiện phải thỏa mãn để bản ghi được chọn.
Lưu ý:
- Hai câu
SELECTphải có cùng số lượng biểu thức. - Cột tương ứng trong mỗi câu
SELECTphải có cùng kiểu dữ liệu. - Toán tử
EXCEPTtrả về tất cả bản ghi từ câuSELECTđầu tiên và không có trong câuSELECTthứ hai. - Toán tử
EXCEPTtrong SQL Server tương đương với toán tửMINUStrong Oracle.
Ví dụ – với 1 biểu thức
SELECT sanpham_id
FROM sanpham
EXCEPT
SELECT sanpham_id
FROM hangtonkho;
Trong ví dụ này, kết quả trả về tất cả giá trị sanpham_id trong bảng sanpham và không có trong bảng hangtonkho. Điều này có nghĩa là nếu giá trị sanpham_id xuất hiệ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;
Truy vấn này trả về các bản ghi trong bảng danhba với ID liên hệ, họ và tên không khớp với ID nhân viên, họ và tên trong bảng nhanvien.
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 SELECT khác nhau, dễ dàng hơn khi tham chiếu cột trong mệnh đề ORDER BY thông qua vị trí trong tập kết quả. Ở ví dụ trên, chúng ta sắp xếp kết quả theo nhacung_ten / congty_ten theo thứ tự tăng dần bằng cụm từ ORDER BY 2 vì cột này nằm ở vị trí thứ 2 trong tập kết quả.