V SQL pravděpodobně používáme klauzuli JOIN k získání kombinovaného výsledku z jedné nebo více než jedné tabulky. Někdy však chceme výsledek, který obsahuje data z jedné tabulky a záznam by neměl být dostupný v druhé tabulce. V takovém případě má SQL název konceptu SQL Except.
K čištění dat z více než jedné tabulky jsme použili SQL Except. SQL Except je stejný jako operátor mínus, který používáme v matematice. SQL Except nejprve sloučí dva nebo více než dva příkazy SELECT v dotazu a vrátí data z prvního příkazu SELECT. V jiném výsledku příkazu SELECT nejsme k dispozici.
SQL EXCEPT Rules
Před použitím dotazu EXCEPT v SQL bychom měli porozumět všem pravidlům a nařízením:
- Počet a pořadí sloupců v dané tabulce musí být v celém dotazu SELECT stejné.
- Datový typ sloupce musí být stejný nebo kompatibilní.
Syntaxe pro SQL EXCEPT
SELECT * FROM table1 EXCEPT SELECT * FROM table2;
Table1 a Table2 budou názvy tabulek.
Příklad:
Předpokládejme, že máme dvě tabulky se stejným počtem sloupců a pořadím sloupců.
- Tabulka 1:T1, Počet sloupců:3, Údaje:A, B, C, D
- Tabulka 2:T2, Počet sloupců:3, Údaje:B, D, F, G
Kdykoli provedeme dotaz EXCEPT na těchto dvou tabulkách, dostaneme A a C, protože tato dvě data nejsou přítomna v tabulce T2, B a D jsou společné v obou tabulkách, což se zahodí.
Pojďme pochopit SQL EXCEPT koncept s příklady. Zvažte následující tabulky spolu s danými záznamy.
Tabulka1:Emp
ID ZAMĚSTNANCE | FIRST_NAME | LAST_NAME | PLAT | MĚSTO | ODDĚLENÍ | ID SPRÁVCE |
1001 | VAIBHAVI | MISHRA | 65 000 | PUNE | ORACLE | 1 |
1002 | VAIBHAV | SHARMA | 60 000 | NOIDA | ORACLE | 1 |
1003 | NIKHIL | VANI | 50 000 | JAIPUR | FMW | 2 |
2001 | PRACHI | SHARMA | 55500 | CHANDIgarH | ORACLE | 1 |
2002 | BHAVESH | JAIN | 65500 | PUNE | FMW | 2 |
2003 | RUCHIKA | JAIN | 50 000 | MUMBAI | TESTOVÁNÍ | 4 |
3001 | PRANOTI | SHENDE | 55500 | PUNE | JAVA | 3 |
3002 | ANUJA | KDE | 50500 | JAIPUR | FMW | 2 |
3003 | DEEPAM | JAUHARI | 58500 | MUMBAI | JAVA | 3 |
4001 | RAJESH | GOUD | 60500 | MUMBAI | TESTOVÁNÍ | 4 |
Tabulka 2:Zaměstnanec
ID ZAMĚSTNANCE | FIRST_NAME | LAST_NAME | PLAT | MĚSTO | ODDĚLENÍ | ID SPRÁVCE |
1001 | Vaibhav | Sharma | 65 000 | PUNE | ORACLE | 1 |
1002 | Nikhil | Vani | 60 000 | NOIDA | ORACLE | 1 |
1003 | Vaibhavi | Mishra | 50 000 | JAIPUR | FMW | 2 |
2001 | Ruchika | Jain | 55500 | CHANDIgarH | ORACLE | 1 |
2002 | Prachi | Sharma | 65500 | PUNE | FMW | 2 |
2003 | Bhavesh | Jain | 50 000 | MUMBAI | TESTOVÁNÍ | 4 |
3001 | Deepam | Jauhari | 55500 | PUNE | JAVA | 3 |
3002 | ANUJA | KDE | 50500 | JAIPUR | FMW | 2 |
3003 | Pranoti | Shende | 58500 | MUMBAI | JAVA | 3 |
4001 | RAJESH | GOUD | 60500 | MUMBAI | TESTOVÁNÍ | 4 |
Tabulka 3:Správce
Managerid | název_manažera | manažer_oddělení |
1 | Snehdeep Kaur | ORACLE |
2 | Kirti Kirtane | FMW |
3 | Abhishek Manish | JAVA |
4 | Anupam Mishra | TESTOVÁNÍ |
Tabulka 4:Správce1
Managerid | název_manažera | manažer_oddělení |
1 | Ishita Agrawal | ORACLE |
2 | Kirti Kirtane | FMW |
3 | Abhishek Manish | JAVA |
4 | Paul Oakip | TESTOVÁNÍ |
Příklad 1: Předpokládejme, že chceme spojit výše uvedené dvě tabulky Emp a Employee v našem SELECT dotazu pomocí operátoru 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;
Používáme klauzuli INNER JOIN mezi tabulkou Emp a Employee, kde zobrazujeme ID zaměstnance, jméno, město, oddělení, ID manažera a jméno manažera pomocí operátoru EXCEPT. Výše uvedený dotaz zobrazí pouze tyto jedinečné hodnoty mezi oběma tabulkami.
Výše uvedený dotaz poskytuje následující výstup:
Pokud se podíváme na data tabulek, jsou mezi oběma tabulkami Emp table a Employee table dva společné údaje, tj. ID zaměstnance 3002 a 4001. Podrobnosti ID zaměstnance 4001 se zobrazují kromě 3002. Protože ID zaměstnance 3002 Jméno manažera je v obou tabulkách stejné a Manager1, ale ID zaměstnance 4001 Jména manažerů se v obou tabulkách liší, zobrazí se podrobnosti s ID zaměstnance 4002.
Příklad 2: Předpokládejme, že chceme spojit dvě výše uvedené tabulky Emp a Employee v našem SELECT dotazu pomocí operátoru EXCEPT a setřídit výslednou sadu podle jejich platu v sestupném pořadí. Klauzuli ORDER BY použijeme k seřazení sady výsledků v dotazu 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;
Výše uvedený dotaz zobrazuje následující výstup:
Příklad 3: Předpokládejme, že chceme spojit dvě výše uvedené tabulky Emp a Employee v našem SELECT dotazu pomocí operátoru EXCEPT, kde mzda zaměstnance vyšší než 55000 z tabulky Emp a město zaměstnance zahrnuje 'Pune', 'Mumbai', 'Jaipur' z tabulky Employee.
SELECT * FROM EMP WHERE SALARY > 55000 EXCEPT SELECT * FROM EMPLOYEE WHERE CITY IN ('Pune', 'Mumbai', 'Jaipur');
Výše uvedený dotaz první příkaz SELECT načte všechny podrobnosti o těch zaměstnancích, jejichž plat je větší než 55 000 z tabulky Emp. Druhý příkaz SELECT načte všechny podrobnosti o těch zaměstnancích, jejichž města zahrnují Pune, Mumbai, Jaipur z tabulky Zaměstnanci. Poté bude mezi tabulkou Emp a tabulkou Zaměstnanci proveden operátor EXCEPT.
Výsledkem je následující výstup: