W SQL prawdopodobnie używamy klauzuli JOIN, aby otrzymać łączny wynik z jednej lub więcej niż jednej tabeli. Czasami jednak potrzebujemy wyniku zawierającego dane z jednej tabeli, a rekord nie powinien być dostępny w drugiej tabeli. W takim przypadku SQL ma nazwę koncepcyjną z wyjątkiem SQL.
Do oczyszczenia danych z więcej niż jednej tabeli użyliśmy SQL Except. Wyjątek SQL jest tym samym, co operator minus, który stosujemy w matematyce. SQL Z wyjątkiem first łączy dwie lub więcej niż dwie instrukcje SELECT w zapytaniu i zwraca dane z pierwszej instrukcji SELECT. Nie jesteśmy dostępni w innym wyniku instrukcji SELECT.
Zasady SQL EXCEPT
Powinniśmy zrozumieć wszystkie zasady i przepisy przed użyciem zapytania EXCEPT w SQL:
- Liczba i kolejność kolumn w danej tabeli muszą być takie same w całym zapytaniu SELECT.
- Typ danych kolumny musi być taki sam lub zgodny.
Składnia SQL Z WYJĄTKIEM
SELECT * FROM table1 EXCEPT SELECT * FROM table2;
Tabela1 i Tabela2 będą nazwami tabel.
Przykład:
Załóżmy, że mamy dwie tabele z taką samą liczbą kolumn i kolejnością kolumn.
- Tabela 1:T1, Liczba kolumn:3, Dane:A, B, C, D
- Tabela 2:T2, Liczba kolumn:3, Dane:B, D, F, G
Za każdym razem, gdy wykonamy zapytanie EXCEPT na tych dwóch tabelach, otrzymamy A i C, ponieważ te dwa dane nie są obecne w tabeli T2, B i D są wspólne w obu tabelach, które są odrzucane.
Rozumiemy koncepcję SQL EXCEPT na przykładach. Rozważ poniższe tabele wraz z podanymi rekordami.
Tabela1:Emp
ID PRACOWNIKA | FIRST_NAME | LAST_NAME | WYNAGRODZENIE | MIASTO | DZIAŁ | IDENTYFIKATOR KIEROWCY |
1001 | VAIBHAVI | MISHRA | 65000 | PUNE | WYROCZNIA | 1 |
1002 | VAIBHAV | SHARMA | 60000 | NOIDA | WYROCZNIA | 1 |
1003 | NIKHIL | VANI | 50000 | JAIPUR | FMW | 2 |
2001 | PRACI | SHARMA | 55500 | CZANDIGAR | WYROCZNIA | 1 |
2002 | PRZYJMUJ SIĘ | JAIN | 65500 | PUNE | FMW | 2 |
2003 | RUCHIKA | JAIN | 50000 | MUMBAJ | TESTOWANIE | 4 |
3001 | PRANOTI | SHENDE | 55500 | PUNE | JAVA | 3 |
3002 | ANUJA | GDZIE | 50500 | JAIPUR | FMW | 2 |
3003 | DEEPAM | JAUHARI | 58500 | MUMBAJ | JAVA | 3 |
4001 | RAJESH | GOUD | 60500 | MUMBAJ | TESTOWANIE | 4 |
Tabela2:Pracownik
ID PRACOWNIKA | FIRST_NAME | LAST_NAME | WYNAGRODZENIE | MIASTO | DZIAŁ | IDENTYFIKATOR KIEROWCY |
1001 | Vaibhav | Szarma | 65000 | PUNE | WYROCZNIA | 1 |
1002 | Nikhil | Wani | 60000 | NOIDA | WYROCZNIA | 1 |
1003 | Waibhavi | Miszra | 50000 | JAIPUR | FMW | 2 |
2001 | Ruchika | Jain | 55500 | CZANDIGAR | WYROCZNIA | 1 |
2002 | Praci | Szarma | 65500 | PUNE | FMW | 2 |
2003 | Bhawesz | Jain | 50000 | MUMBAJ | TESTOWANIE | 4 |
3001 | Deepam | Jauhari | 55500 | PUNE | JAVA | 3 |
3002 | ANUJA | GDZIE | 50500 | JAIPUR | FMW | 2 |
3003 | Pranoti | Shende | 58500 | MUMBAJ | JAVA | 3 |
4001 | RAJESH | GOUD | 60500 | MUMBAJ | TESTOWANIE | 4 |
Tabela3:Menedżer
Identyfikator menedżera | nazwa_menedżera | manager_department |
1 | Snehdeep Kaur | WYROCZNIA |
2 | Kirti Kirtane | FMW |
3 | Abhishek Manish | JAVA |
4 | Anupam Mishra | TESTOWANIE |
Tabela 4:Menedżer1
Identyfikator menedżera | nazwa_menedżera | manager_department |
1 | Ishita Agrawal | WYROCZNIA |
2 | Kirti Kirtane | FMW |
3 | Abhishek Manish | JAVA |
4 | Paweł Oakip | TESTOWANIE |
Przykład 1: Załóżmy, że chcemy połączyć powyższe dwie tabele Emp i Employee w naszym zapytaniu SELECT za pomocą operatora 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;
Używamy klauzuli INNER JOIN między tabelą Emp i Employee, w której wyświetlamy identyfikator pracownika, imię i nazwisko, miasto, dział, identyfikator menedżera i nazwisko menedżera przy użyciu operatora EXCEPT. Powyższe zapytanie wyświetli tylko te unikalne wartości między obiema tabelami.
Powyższe zapytanie daje następujące dane wyjściowe:
Jeśli obserwujemy dane w tabelach, istnieją dwa wspólne dane między obiema tabelami Tabela Emp i Tabela pracownika, tj. Identyfikator pracownika 3002 i 4001. Wyświetlane są szczegóły id pracownika 4001 z wyjątkiem 3002. Ponieważ identyfikator pracownika 3002 Nazwa menedżera jest taka sama w obu tabelach Menedżer i Manager1, ale identyfikator pracownika 4001 Nazwiska menedżera są różne w obu tabelach, wyświetlane są szczegóły identyfikatora pracownika 4002.
Przykład 2: Załóżmy, że chcemy połączyć powyższe dwie tabele Emp i Employee w naszym zapytaniu SELECT za pomocą operatora EXCEPT i posortować zestaw wyników według ich wynagrodzenia w kolejności malejącej. Użyjemy klauzuli ORDER BY, aby posortować zestaw wyników w zapytaniu 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;
Powyższe zapytanie pokazuje następujące dane wyjściowe:
Przykład 3: Załóżmy, że chcemy połączyć powyższe dwie tabele Emp i Employee w naszym zapytaniu SELECT za pomocą operatora EXCEPT, w którym wynagrodzenie pracownika większe niż 55000 z tabeli Emp i miasta pracownika to „Pune”, „Mumbai”, „Jaipur” z tabeli Employee.
SELECT * FROM EMP WHERE SALARY > 55000 EXCEPT SELECT * FROM EMPLOYEE WHERE CITY IN ('Pune', 'Mumbai', 'Jaipur');
Powyższe zapytanie pierwsze polecenie SELECT pobiera wszystkie szczegóły pracowników, których wynagrodzenie jest większe niż 55000 z tabeli Emp. Drugie polecenie SELECT pobiera wszystkie dane pracowników, których miasta obejmują Pune, Mumbai, Jaipur z tabeli Employee. Następnie operator EXCEPT zostanie wykonany między tabelą Emp a tabelą Employee.
Daje to następujący wynik: