ตัวดำเนินการ EXCEPT ใน SQL Server คืออะไร?
ตัวดำเนินการ EXCEPT ใน SQL Server ใช้เพื่อส่งคืนแถวจากคำสั่ง SELECT แรก ที่ไม่ปรากฏในคำสั่ง SELECT ที่สอง กล่าวคือ จะนำข้อมูลจากชุดแรกมาลบด้วยข้อมูลที่ซ้ำกันในชุดที่สอง
การทำงานของ EXCEPT

ภาพประกอบ: EXCEPT ส่งคืนเฉพาะข้อมูลในพื้นที่สีฟ้า (อยู่ในชุดข้อมูล 1 แต่ไม่อยู่ในชุดข้อมูล 2)
ข้อจำกัดสำคัญ: คำสั่ง SELECT ทั้งสองใน EXCEPT ต้องมีจำนวนฟิลด์ในชุดผลลัพธ์เท่ากัน และชนิดข้อมูลของคอลัมน์ที่ตรงกันต้องเหมือนกัน
รูปแบบคำสั่ง (Syntax)
SELECT expression1, expression2, ... expression_n
FROM table_name
[WHERE condition]
EXCEPT
SELECT expression1, expression2, ... expression_n
FROM table_name
[WHERE condition];
คำอธิบายพารามิเตอร์
- expression: คอลัมน์หรือค่าที่ต้องการเปรียบเทียบระหว่างคำสั่ง SELECT ไม่จำเป็นต้องเป็นฟิลด์เดียวกัน แต่คอลัมน์ที่ตรงกันต้องมีชนิดข้อมูลเหมือนกัน
- table_name: ตารางที่ต้องการดึงข้อมูล ต้องมีอย่างน้อย 1 ตารางในคำสั่ง FROM
- WHERE condition: เงื่อนไขเลือกแถว (ไม่บังคับ)
ข้อสังเกต
- คำสั่ง SELECT ทั้งสองต้องมีจำนวน expression เท่ากัน
- คอลัมน์ที่ตรงกันในแต่ละ SELECT ต้องมีชนิดข้อมูลเหมือนกัน
- EXCEPT จะส่งคืนทุกแถวจาก SELECT แรกที่ไม่อยู่ใน SELECT ที่สอง
- EXCEPT ใน SQL Server เทียบเท่ากับตัวดำเนินการ
MINUSใน Oracle
ตัวอย่างการใช้งาน
1. ใช้กับ Expression เดียว
SELECT sanpham_id
FROM sanpham
EXCEPT
SELECT sanpham_id
FROM hangtonkho;
ผลลัพธ์จะคืนค่า sanpham_id ที่มีในตาราง sanpham แต่ไม่มีใน hangtonkho หากค่าใดมีในทั้งสองตาราง จะไม่ถูกส่งคืน
2. ใช้กับหลาย Expressions
SELECT danhba_id, ho, ten
FROM danhba
WHERE ho = 'Anderson'
EXCEPT
SELECT nhanvien_id, ho, ten
FROM nhanvien;
คืนแถวจากตาราง danhba ที่มี ID, นามสกุล, ชื่อ ไม่ตรงกับแถวใดๆ ในตาราง nhanvien
3. ใช้ร่วมกับ 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;
เนื่องจากชื่อคอลัมน์ในสอง SELECT ต่างกัน จึงใช้ตำแหน่งในชุดผลลัพธ์แทน (2 = คอลัมน์ที่สอง คือ nhacung_ten/congty_ten) เพื่อจัดเรียงลำดับ