В SQL вероятно използваме клаузата JOIN, за да получим комбинирания резултат от една или повече от една таблица. Но понякога искаме резултат, който съдържа данни от една таблица, а записът не трябва да е наличен в другата таблица. В този случай SQL има концептуалното име SQL Except.
За да пречистим данните от повече от една таблица, използвахме SQL освен. SQL Except е същият като оператора минус, който правим в математиката. SQL Except първо обединява двата или повече от два оператора SELECT в заявката и връща данните от първия оператор SELECT. Не сме налични в друг резултат от израза SELECT.
SQL ОСВЕН правила
Трябва да разберем всички правила и разпоредби, преди да използваме заявката ОСВЕН в SQL:
- Броят и редът на колоните в дадената таблица трябва да са еднакви в цялата заявка SELECT.
- Типът данни на колоната трябва да е същият или съвместим.
Синтаксисът за SQL ОСВЕН
SELECT * FROM table1 EXCEPT SELECT * FROM table2;
Table1 и Table2 ще бъдат имената на таблиците.
Пример:
Да приемем, че имаме две таблици с еднакъв брой колони и ред на колоните.
- Таблица 1:T1, Брой колони:3, Данни:A, B, C, D
- Таблица 2:T2, Брой колони:3, Данни:B, D, F, G
Всеки път, когато изпълним заявката EXCEPT върху тези две таблици, ще получим A и C, защото тези две данни не присъстват в таблица T2, B и D са общи и в двете таблици, които се отхвърлят.
Нека разберем концепцията на SQL ОСВЕН с примери. Разгледайте следните таблици заедно с дадените записи.
Таблица 1:Изп.
ИДЕНТИФИКАТОР НА СЛУЖИТЕЛЯ | FIRST_NAME | LAST_NAME | ЗАПЛАТА | ГРАД | ОТДЕЛ | MANAGERID |
1001 | VAIBHAVI | МИШРА | 65 000 | ПУНА | ORACLE | 1 |
1002 | VAIBHAV | ШАРМА | 60 000 | NOIDA | ORACLE | 1 |
1003 | НИХИЛ | VANI | 50 000 | ДЖАЙПУР | FMW | 2 |
2001 | PRACHI | ШАРМА | 55500 | ЧАНДИГАР | ORACLE | 1 |
2002 | BHAVESH | ДЖЕЙН | 65500 | ПУНА | FMW | 2 |
2003 | РУЧИКА | ДЖЕЙН | 50 000 | МУМБАЙ | ТЕСТВАНЕ | 4 |
3001 | PRANOTI | ШЕНДЕ | 55500 | ПУНА | JAVA | 3 |
3002 | ANUJA | КЪДЕ | 50500 | ДЖАЙПУР | FMW | 2 |
3003 | DEEPAM | ДЖАУХАРИ | 58500 | МУМБАЙ | JAVA | 3 |
4001 | РАДЖЕШ | GOUD | 60500 | МУМБАЙ | ТЕСТВАНЕ | 4 |
Таблица2:Служител
ИДЕНТИФИКАТОР НА СЛУЖИТЕЛЯ | FIRST_NAME | LAST_NAME | ЗАПЛАТА | ГРАД | ОТДЕЛ | MANAGERID |
1001 | Вайбхав | Шарма | 65 000 | ПУНА | ORACLE | 1 |
1002 | Нихил | Вани | 60 000 | NOIDA | ORACLE | 1 |
1003 | Вайбхави | Мишра | 50 000 | ДЖАЙПУР | FMW | 2 |
2001 | Ручика | Джайн | 55500 | ЧАНДИГАР | ORACLE | 1 |
2002 | Прачи | Шарма | 65500 | ПУНА | FMW | 2 |
2003 | Бхавеш | Джайн | 50 000 | МУМБАЙ | ТЕСТВАНЕ | 4 |
3001 | Дийпам | Джаухари | 55500 | ПУНА | JAVA | 3 |
3002 | ANUJA | КЪДЕ | 50500 | ДЖАЙПУР | FMW | 2 |
3003 | Праноти | Шенде | 58500 | МУМБАЙ | JAVA | 3 |
4001 | РАДЖЕШ | GOUD | 60500 | МУМБАЙ | ТЕСТВАНЕ | 4 |
Таблица3:Мениджър
Managerid | име_на_мениджър | мениджърски отдел |
1 | Снехдип Каур | ORACLE |
2 | Кирти Киртане | FMW |
3 | Абхишек Маниш | JAVA |
4 | Анупам Мишра | ТЕСТВАНЕ |
Таблица4:Мениджър1
Managerid | име_на_мениджър | мениджърски отдел |
1 | Ишита Агравал | ORACLE |
2 | Кирти Киртане | FMW |
3 | Абхишек Маниш | JAVA |
4 | Пол Оукип | ТЕСТВАНЕ |
Пример 1: Да предположим, че искаме да обединим горните две таблици Emp и Employee в нашата заявка SELECT с помощта на оператор 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;
Използваме клаузата INNER JOIN между таблицата Emp и Employee, където показваме идентификатор на служител, име, град, отдел, идентификатор на мениджър и име на мениджър с помощта на оператор EXCEPT. Горната заявка ще покаже само тези уникални стойности между двете таблици.
Горната заявка дава следния изход:
Ако наблюдаваме данните от таблиците, има две общи данни между двете таблици Emp table и Employee table, т.е. идентификатор на служител 3002 и 4001. Показват се подробности за идентификатора на служителите 4001 с изключение на 3002. Тъй като идентификаторът на служител 3002 името на мениджъра е едно и също и в двете таблици Мениджър и Мениджър1, но идентификатор на служител 4001 Имената на мениджъра са различни и в двете таблици, показват се подробности за идентификатор на служител 4002.
Пример 2: Да предположим, че искаме да обединим горните две таблици Emp и Employee в нашата заявка SELECT с помощта на оператор EXCEPT и да сортираме резултатния набор по тяхната заплата в низходящ ред. Ще използваме клаузата ORDER BY, за да сортираме резултатния набор в 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;
Горната заявка показва следния изход:
Пример 3: Да предположим, че искаме да се присъединим към горните две таблици Emp и Employee в нашата заявка SELECT, използвайки оператор EXCEPT, където заплатата на служителите, по-голяма от 55 000 от таблицата Emp и града на служителя, включва „Pune“, „Mumbai“, „Jaipur“ от Employee table.
SELECT * FROM EMP WHERE SALARY > 55000 EXCEPT SELECT * FROM EMPLOYEE WHERE CITY IN ('Pune', 'Mumbai', 'Jaipur');
Горната заявка за първи оператор SELECT извлича всички подробности за тези служители, чиято заплата е по-голяма от 55 000 от таблицата Emp. Вторият оператор SELECT извлича всички подробности за тези служители, чиито градове включват Пуна, Мумбай, Джайпур от таблицата на служителите. Тогава между таблицата Emp и таблицата Employee ще се изпълни оператор EXCEPT.
Това дава следния изход: