I SQL bruger vi sandsynligvis JOIN-sætningen til at modtage det kombinerede resultat fra en eller mere end én tabel. Men nogle gange ønsker vi et resultat, der indeholder data fra én tabel, og posten bør ikke være tilgængelig i den anden tabel. I så fald har SQL konceptnavnet SQL Except.
For at rense dataene fra mere end én tabel brugte vi SQL Except. SQL Except er den samme som minusoperatoren, vi gør i matematik. SQL Except fletter først de to eller flere end to SELECT-sætninger i forespørgslen og returnerer dataene fra den første SELECT-sætning. Vi er ikke tilgængelige i et andet SELECT-udsagnsresultat.
SQL UNDTAGET regler
Vi bør forstå alle regler og bestemmelser, før vi bruger UNDTAGELSE forespørgslen i SQL:
- Antallet og rækkefølgen af kolonner i den givne tabel skal være det samme i hele SELECT-forespørgslen.
- Kolonnens datatype skal være den samme eller kompatibel.
Syntaksen for SQL UNDTAGET
SELECT * FROM table1 EXCEPT SELECT * FROM table2;
Tabel1 og Tabel2 vil være navnet på tabeller.
Eksempel:
Antag, at vi har to tabeller med det samme antal kolonner og rækkefølgen af kolonner.
- Tabel 1:T1, Antal kolonner:3, Data:A, B, C, D
- Tabel 2:T2, Antal kolonner:3, Data:B, D, F, G
Hver gang vi udfører EXCEPT-forespørgslen på disse to tabeller, får vi A og C, fordi disse to data ikke er til stede i tabel T2, B og D er fælles i begge tabeller, som kasseres.
Lad os forstå SQL UNDTAGET koncept med eksempler. Overvej følgende tabeller sammen med de givne poster.
Tabel1:Emp
EMPLOYEEID | FIRST_NAME | LAST_NAME | LØN | BY | AFDELING | MANAGERID |
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 | TEST | 4 |
3001 | PRANOTI | SHENDE | 55500 | PUNE | JAVA | 3 |
3002 | ANUJA | HVOR | 50500 | JAIPUR | FMW | 2 |
3003 | DEEPAM | JAUHARI | 58500 | MUMBAI | JAVA | 3 |
4001 | RAJESH | GOUD | 60500 | MUMBAI | TEST | 4 |
Tabel 2:Medarbejder
EMPLOYEEID | FIRST_NAME | LAST_NAME | LØN | BY | AFDELING | MANAGERID |
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 | TEST | 4 |
3001 | Deepam | Jauhari | 55500 | PUNE | JAVA | 3 |
3002 | ANUJA | HVOR | 50500 | JAIPUR | FMW | 2 |
3003 | Pranoti | Shende | 58500 | MUMBAI | JAVA | 3 |
4001 | RAJESH | GOUD | 60500 | MUMBAI | TEST | 4 |
Tabel3:Manager
Managerid | manager_navn | manager_afdeling |
1 | Snehdeep Kaur | ORACLE |
2 | Kirti Kirtane | FMW |
3 | Abhishek Manish | JAVA |
4 | Anupam Mishra | TEST |
Tabel 4:Manager1
Managerid | manager_navn | manager_afdeling |
1 | Ishita Agrawal | ORACLE |
2 | Kirti Kirtane | FMW |
3 | Abhishek Manish | JAVA |
4 | Paul Oakip | TEST |
Eksempel 1: Antag, at vi ønsker at forbinde ovenstående to tabeller Emp og Employee i vores SELECT-forespørgsel ved hjælp af operatoren 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;
Vi bruger INNER JOIN-klausulen mellem Emp- og Employee-tabellen, hvor vi viser medarbejder-id, navn, by, afdeling, leder-id og ledernavn ved brug af UNDTAGET operatør. Ovenstående forespørgsel vil kun vise de unikke værdier mellem begge tabeller.
Ovenstående forespørgsel giver følgende output:
Hvis vi observerer tabellernes data, er der to fælles data mellem begge tabeller Emp table og Employee table, dvs. medarbejder-id 3002 og 4001. Medarbejder-id 4001-detaljer vises undtagen 3002. Fordi medarbejder-id 3002 ledernavn er det samme i begge tabeller. og Manager1, men medarbejder-id 4001 Ledernavne er forskellige i begge tabeller, medarbejder-id 4002-detaljer vises.
Eksempel 2: Antag, at vi ønsker at forbinde ovenstående to tabeller Emp og Employee i vores SELECT-forespørgsel ved at bruge EXCEPT-operatoren og sortere resultatet sat efter deres løn i faldende rækkefølge. Vi vil bruge ORDER BY-udtrykket til at sortere resultatsættet i SQL-forespørgslen.
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;
Ovenstående forespørgsel viser følgende output:
Eksempel 3: Antag, at vi ønsker at forbinde de to ovenstående tabeller Emp og Employee i vores SELECT-forespørgsel ved at bruge UNDTAGET operator, hvor medarbejderløn større end 55000 fra Emp-tabellen og medarbejderby inkluderer 'Pune', 'Mumbai', 'Jaipur' fra Employee-tabellen.
SELECT * FROM EMP WHERE SALARY > 55000 EXCEPT SELECT * FROM EMPLOYEE WHERE CITY IN ('Pune', 'Mumbai', 'Jaipur');
Ovenstående forespørgsel første SELECT-sætning henter alle detaljer om de medarbejdere, hvis løn er større end 55.000 fra Emp-tabellen. Den anden SELECT-sætning henter alle detaljerne om de medarbejdere, hvis byer inkluderer Pune, Mumbai, Jaipur fra medarbejdertabellen. Derefter vil EXCEPT-operatoren blive udført mellem Emp-tabellen og Employee-tabellen.
Dette giver følgende output: