Em SQL, provavelmente usamos a cláusula JOIN para receber o resultado combinado de uma ou mais tabelas. Mas, às vezes, queremos um resultado que contenha dados de uma tabela e o registro não esteja disponível na outra tabela. Nesse caso, SQL tem o nome de conceito SQL Except.
Para purificar os dados de mais de uma tabela, usamos SQL Except. O SQL Except é o mesmo que o operador de menos que fazemos em matemática. SQL Except primeiro mescla as duas ou mais de duas instruções SELECT na consulta e retorna os dados da primeira instrução SELECT. Não estamos disponíveis em outro resultado de instrução SELECT.
Regras de SQL EXCEPT
Devemos entender todas as regras e regulamentos antes de usar a consulta EXCEPT no SQL:
- O número e a ordem das colunas na tabela fornecida devem ser os mesmos em toda a consulta SELECT.
- O tipo de dados da coluna deve ser o mesmo ou compatível.
A sintaxe para SQL EXCETO
SELECT * FROM table1 EXCEPT SELECT * FROM table2;
Tabela1 e Tabela2 serão os nomes das tabelas.
Exemplo:
Suponha que temos duas tabelas com o mesmo número de colunas e a mesma ordem das colunas.
- Tabela 1:T1, Número de colunas:3, Dados:A, B, C, D
- Tabela 2:T2, Número de colunas:3, Dados:B, D, F, G
Sempre que executarmos a consulta EXCEPT nessas duas tabelas, obteremos A e C porque esses dois dados não estão presentes na tabela T2, B e D são comuns nas duas tabelas, que descartam.
Vamos entender o conceito SQL EXCEPT com exemplos. Considere as tabelas a seguir junto com os registros fornecidos.
Tabela 1:Emp
EMPLOYEEID | FIRST_NAME | LAST_NAME | SALÁRIO | CIDADE | DEPARTAMENTO | GERENTE |
1001 | VAIBHAVI | MISHRA | 65.000 | PUNE | ORACLE | 1 |
1002 | VAIBHAV | SHARMA | 60.000 | NOIDA | ORACLE | 1 |
1003 | NIQUIL | VANI | 50.000 | JAIPUR | FMW | 2 |
2001 | PRAQUI | SHARMA | 55500 | CHANDIGARH | ORACLE | 1 |
2002 | BHAVESH | JAIN | 65500 | PUNE | FMW | 2 |
2003 | RUCHIKA | JAIN | 50.000 | MUMBAI | TESTE | 4 |
3001 | PRANOTI | SHENDE | 55500 | PUNE | JAVA | 3 |
3002 | ANUJA | ONDE | 50500 | JAIPUR | FMW | 2 |
3003 | DEEPAM | JAUHARI | 58500 | MUMBAI | JAVA | 3 |
4001 | RAJESH | GOUD | 60500 | MUMBAI | TESTE | 4 |
Tabela 2:Funcionário
EMPLOYEEID | FIRST_NAME | LAST_NAME | SALÁRIO | CIDADE | DEPARTAMENTO | GERENTE |
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 | Praqui | Sharma | 65500 | PUNE | FMW | 2 |
2003 | Bhavesh | Jain | 50.000 | MUMBAI | TESTE | 4 |
3001 | Deepam | Jauhari | 55500 | PUNE | JAVA | 3 |
3002 | ANUJA | ONDE | 50500 | JAIPUR | FMW | 2 |
3003 | Pranóti | Shende | 58500 | MUMBAI | JAVA | 3 |
4001 | RAJESH | GOUD | 60500 | MUMBAI | TESTE | 4 |
Tabela 3:Gerente
Managerid | manager_name | manager_department |
1 | Snehdeep Kaur | ORACLE |
2 | Kirti Kirtane | FMW |
3 | Abhishek Manish | JAVA |
4 | Anupam Mishra | TESTE |
Tabela 4:Gerente1
Managerid | manager_name | manager_department |
1 | Ishita Agrawal | ORACLE |
2 | Kirti Kirtane | FMW |
3 | Abhishek Manish | JAVA |
4 | Paul Oakip | TESTE |
Exemplo 1: Suponha que queremos unir as duas tabelas Emp e Employee acima em nossa consulta SELECT usando o operador 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;
Estamos usando a cláusula INNER JOIN entre a tabela Emp e Employee onde exibimos Employee Id, Name, City, Department, Manager Id e Manager Name usando o operador EXCEPT. A consulta acima exibirá apenas os valores exclusivos entre as duas tabelas.
A consulta acima fornece a seguinte saída:
Se observarmos os dados das tabelas, há dois dados comuns entre as duas tabelas Emp table e Employee table, ou seja, Employee id 3002 e 4001. Os detalhes do Employee id 4001 são exibidos, exceto 3002. Como o Employee id 3002 Manager name é o mesmo em ambas as tabelas Manager e Manager1, mas ID do funcionário 4001 Os nomes dos gerentes são diferentes em ambas as tabelas, os detalhes da ID do funcionário 4002 são exibidos.
Exemplo 2: Suponha que queremos unir as duas tabelas Emp e Employee acima em nossa consulta SELECT usando o operador EXCEPT e classificar o resultado definido por seu salário em ordem decrescente. Usaremos a cláusula ORDER BY para classificar o conjunto de resultados na consulta 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;
A consulta acima mostra a seguinte saída:
Exemplo 3: Suponha que queremos unir as duas tabelas Emp e Employee acima em nossa consulta SELECT usando o operador EXCEPT, onde o salário do funcionário maior que 55.000 da tabela Emp e a cidade do funcionário incluem 'Pune', 'Mumbai', 'Jaipur' da tabela Employee.
SELECT * FROM EMP WHERE SALARY > 55000 EXCEPT SELECT * FROM EMPLOYEE WHERE CITY IN ('Pune', 'Mumbai', 'Jaipur');
A primeira instrução SELECT da consulta acima busca todos os detalhes dos funcionários cujo salário é maior que 55.000 da tabela Emp. A segunda instrução SELECT busca todos os detalhes dos funcionários cujas cidades incluem Pune, Mumbai, Jaipur da tabela Employee. Então, o operador EXCEPT será executado entre a tabela Emp e a tabela Employee.
Isso dá a seguinte saída: