Trong SQL, chúng ta có thể sử dụng mệnh đề JOIN để nhận kết quả kết hợp từ một hoặc nhiều bảng. Nhưng đôi khi, chúng tôi muốn một kết quả chứa dữ liệu từ một bảng và bản ghi không có sẵn trong bảng kia. Trong trường hợp đó, SQL có tên khái niệm là SQL Ngoại trừ.
Để làm sạch dữ liệu từ nhiều hơn một bảng, chúng tôi đã sử dụng SQL Ngoại trừ. SQL Ngoại trừ giống như toán tử trừ mà chúng ta làm trong toán học. SQL Ngoại trừ đầu tiên hợp nhất hai hoặc nhiều hơn hai câu lệnh SELECT trong truy vấn và trả về dữ liệu từ câu lệnh SELECT đầu tiên. Chúng tôi không có sẵn kết quả câu lệnh SELECT khác.
Quy tắc NGOẠI TRỪ SQL
Chúng ta nên hiểu tất cả các quy tắc và quy định trước khi sử dụng truy vấn EXCEPT trong SQL:
- Số lượng và thứ tự các cột trong bảng nhất định phải giống nhau trong toàn bộ truy vấn SELECT.
- Kiểu dữ liệu của cột phải giống nhau hoặc tương thích.
Cú pháp cho SQL EXCEPT
SELECT * FROM table1 EXCEPT SELECT * FROM table2;
Table1 và Table2 sẽ là tên của các bảng.
Ví dụ:
Giả sử chúng ta có hai bảng có cùng số cột và thứ tự các cột.
- Bảng 1:T1, Số cột:3, Dữ liệu:A, B, C, D
- Bảng 2:T2, Số cột:3, Dữ liệu:B, D, F, G
Bất cứ khi nào chúng tôi thực hiện truy vấn EXCEPT trên hai bảng này, chúng tôi sẽ nhận được A và C vì hai dữ liệu này không có trong bảng T2, B và D là phổ biến trong cả hai bảng, loại bỏ.
Hãy hiểu khái niệm SQL EXCEPT với các ví dụ. Hãy xem xét các bảng sau cùng với các bản ghi đã cho.
Table1:Emp
EMPLOYEEID | FIRST_NAME | LAST_NAME | TIỀN LƯƠNG | THÀNH PHỐ | KHOA | MANAGERID |
1001 | VAIBHAVI | MISHRA | 65000 | PUNE | ORACLE | 1 |
1002 | VAIBHAV | SHARMA | 60000 | NOIDA | ORACLE | 1 |
1003 | NIKHIL | VANI | 50000 | JAIPUR | FMW | 2 |
2001 | PRACHI | SHARMA | 55500 | ĐIỀU CHỈNH | ORACLE | 1 |
2002 | BHAVESH | JAIN | 65500 | PUNE | FMW | 2 |
2003 | RUCHIKA | JAIN | 50000 | MUMBAI | KIỂM TRA | 4 |
3001 | PRANOTI | CHIA SẺ | 55500 | PUNE | JAVA | 3 |
3002 | ANUJA | Ở ĐÂU | 50500 | JAIPUR | FMW | 2 |
3003 | DEEPAM | JAUHARI | 58500 | MUMBAI | JAVA | 3 |
4001 | RAJESH | MỤC TIÊU | 60500 | MUMBAI | KIỂM TRA | 4 |
Bảng 2:Nhân viên
EMPLOYEEID | FIRST_NAME | LAST_NAME | TIỀN LƯƠNG | THÀNH PHỐ | KHOA | MANAGERID |
1001 | Vaibhav | Sharma | 65000 | PUNE | ORACLE | 1 |
1002 | Nikhil | Vani | 60000 | NOIDA | ORACLE | 1 |
1003 | Vaibhavi | Mishra | 50000 | JAIPUR | FMW | 2 |
2001 | Ruchika | Jain | 55500 | ĐIỀU CHỈNH | ORACLE | 1 |
2002 | Thực tế | Sharma | 65500 | PUNE | FMW | 2 |
2003 | Bhavesh | Jain | 50000 | MUMBAI | KIỂM TRA | 4 |
3001 | Deepam | Jauhari | 55500 | PUNE | JAVA | 3 |
3002 | ANUJA | Ở ĐÂU | 50500 | JAIPUR | FMW | 2 |
3003 | Pranoti | Shende | 58500 | MUMBAI | JAVA | 3 |
4001 | RAJESH | MỤC TIÊU | 60500 | MUMBAI | KIỂM TRA | 4 |
Bảng 3:Người quản lý
Managerid | manager_name | manager_department |
1 | Snehdeep Kaur | ORACLE |
2 | Kirti Kirtane | FMW |
3 | Abhishek Manish | JAVA |
4 | Anupam Mishra | KIỂM TRA |
Bảng 4:Người quản lý1
Managerid | manager_name | manager_department |
1 | Ishita Agrawal | ORACLE |
2 | Kirti Kirtane | FMW |
3 | Abhishek Manish | JAVA |
4 | Paul Oakip | KIỂM TRA |
Ví dụ 1: Giả sử chúng ta muốn nối hai bảng trên Emp và Employee trong truy vấn SELECT bằng toán tử EXCEPT.
SELECT EMPLOYEEID, CONCAT(FIRST_NAME, LAST_NAME) AS NAME, CITY, DEPARTMENT MANAGER1.MANAGERID, MANAGER1.MANAGER_NAME FROM EMPLOYEE INNER JOIN MANAGER ON EMP.MANAGERID = MANAGER.MANAGERID EXCEPT SELECT EMPLOYEEID, CONCAT(FIRST_NAME, LAST_NAME) AS NAME, CITY, DEPARTMENT, MANAGER1.MANAGERID, MANAGER1.MANAGER_NAME FROM EMPLOYEE INNER JOIN MANAGER1 ON EMPLOYEE.MANAGERID = MANAGER1.MANAGERID;
Chúng tôi đang sử dụng mệnh đề INNER JOIN giữa bảng Emp và Employee, nơi chúng tôi hiển thị Id nhân viên, Tên, Thành phố, Phòng ban, Id người quản lý và Tên người quản lý bằng toán tử EXCEPT. Truy vấn trên sẽ chỉ hiển thị các giá trị duy nhất giữa cả hai bảng.
Truy vấn trên cho kết quả sau:
Nếu chúng ta quan sát dữ liệu bảng, có hai dữ liệu chung giữa cả bảng Emp table và bảng Employee, tức là, ID nhân viên 3002 và 4001. Thông tin chi tiết về id 4001 của nhân viên hiển thị ngoại trừ 3002. Vì tên Trình quản lý id 3002 của nhân viên giống nhau trong cả hai bảng Trình quản lý. và Manager1 nhưng Tên người quản lý 4001 của Nhân viên khác nhau trong cả hai bảng, thông tin chi tiết về id 4002 của nhân viên được hiển thị.
Ví dụ 2: Giả sử chúng ta muốn nối hai bảng trên Emp và Employee trong truy vấn SELECT bằng toán tử EXCEPT và sắp xếp kết quả được đặt theo mức lương của họ theo thứ tự giảm dần. Chúng tôi sẽ sử dụng mệnh đề ORDER BY để sắp xếp tập hợp kết quả trong truy vấn SQL.
SELECT EMPLOYEEID, CONCAT(FIRST_NAME, LAST_NAME) AS NAME, CITY, SALARY, MANAGER1.MANAGERID, MANAGER1.MANAGER_NAME FROM EMPLOYEE INNER JOIN MANAGER ON EMP.MANAGERID = MANAGER.MANAGERID EXCEPT SELECT EMPLOYEEID, CONCAT(FIRST_NAME, LAST_NAME) AS NAME, CITY, SALARY, MANAGER1.MANAGERID, MANAGER1.MANAGER_NAME FROM EMPLOYEE INNER JOIN MANAGER1 ON EMPLOYEE.MANAGERID = MANAGER1.MANAGERID ORDER BY SALARY;
Truy vấn trên hiển thị kết quả sau:
Ví dụ 3: Giả sử chúng ta muốn nối hai bảng trên Emp và Employee trong truy vấn CHỌN của mình bằng toán tử EXCEPT trong đó lương của nhân viên lớn hơn 55000 từ bảng Emp và thành phố của nhân viên bao gồm 'Pune', 'Mumbai', 'Jaipur' từ bảng Employee.
SELECT * FROM EMP WHERE SALARY > 55000 EXCEPT SELECT * FROM EMPLOYEE WHERE CITY IN ('Pune', 'Mumbai', 'Jaipur');
Câu lệnh SELECT đầu tiên của truy vấn ở trên tìm nạp tất cả thông tin chi tiết của những nhân viên có mức lương lớn hơn 55000 từ bảng Emp. Câu lệnh SELECT thứ hai tìm nạp tất cả thông tin chi tiết của những nhân viên có thành phố bao gồm Pune, Mumbai, Jaipur từ bảng Nhân viên. Sau đó, toán tử EXCEPT sẽ được thực thi giữa bảng Emp và bảng Employee.
Điều này cho kết quả sau: