Операторите EXCEPT и NOT IN се използват за филтриране на записи от таблица въз основа на конкретен критерий. В тази статия ще разгледаме подробно тези оператори и ще проучим разликите между тях.
Преди да продължим по-нататък, нека създадем някои фиктивни данни, които ще използваме в този пример:
Подготовка на фиктивни данни
Изпълнете следния скрипт, за да създадете фиктивна база данни и таблици, които ще използваме в тази статия.
CREATE Database ShowRoom; GO USE ShowRoom; CREATE TABLE Cars1 ( id INT, name VARCHAR(50) NOT NULL, company VARCHAR(50) NOT NULL, power INT NOT NULL ) CREATE TABLE Cars2 ( id INT, name VARCHAR(50) NOT NULL, company VARCHAR(50) NOT NULL, power INT NOT NULL )
В скрипта по-горе създаваме база данни на ShowRoom с две таблици, Cars1 и Cars2.
Нека добавим някои фиктивни записи към таблиците Cars1 и Cars2.
Изпълнете следния скрипт:
USE ShowRoom INSERT INTO Cars1 VALUES (1, 'Corrolla', 'Toyota', 1800), (2, 'City', 'Honda', 1500), (3, 'C200', 'Mercedez', 2000), (4, 'Vitz', 'Toyota', 1300), (5, 'Baleno', 'Suzuki', 1500), (6, 'C500', 'Mercedez', 5000), (7, '800', 'BMW', 8000), (8, 'Mustang', 'Ford', 5000), (9, '208', 'Peugeot', 5400), (10, 'Prius', 'Toyota', 3200) INSERT INTO Cars2 VALUES (6, 'C500', 'Mercedez', 5000), (7, '800', 'BMW', 8000), (8, 'Mustang', 'Ford', 5000), (9, '208', 'Peugeot', 5400), (10, 'Prius', 'Toyota', 3200), (11, 'Atlas', 'Volkswagen', 5000), (12, '110', 'Bugatti', 8000), (13, 'Landcruiser', 'Toyota', 3000), (14, 'Civic', 'Honda', 1800), (15, 'Accord', 'Honda', 2800)
Вече имаме полезен набор от данни.
Нека да разгледаме как операторите EXCEPT и NOT IN се различават един от друг, използвайки тези данни.
ОСВЕН оператор
Операторът EXCEPT филтрира всички записи от резултата от лявата заявка, които също присъстват в резултата от дясната заявка, и връща останалите резултати от лявата заявка.
Синтаксисът на оператора EXCEPT е както следва:
Right_Query EXCEPT Left_Query
Има две условия, които трябва да бъдат изпълнени преди изпълнението на оператора EXCEPT. Те са:
- Редът и броят на колоните, върнати от двете заявки, трябва да са еднакви.
- Типовете данни на колоните трябва да съвпадат или да са съвместими.
Това може да звучи сложно. Следващият пример обаче ще го изясни.
В таблиците Cars1 и Cars2 записите с id 6 до id 10 са често срещани. Ако използваме оператора EXCEPT със записи от таблицата Cars1 отляво и таблицата Cars2 отдясно, ще бъдат върнати онези записи от таблицата Cars1, които не са в Cars2.
Нека видим оператора EXCEPT в действие.
USE ShowRoom SELECT id, name, company, power FROM Cars1 Except SELECT id, name, company, power FROM Cars2
Резултатът от горната заявка ще изглежда така:
Заявката от лявата страна извлича всички записи от таблицата Cars1, докато тази от дясната страна извлича всички записи от таблицата Cars2. В таблицата Cars1 записите с идентификатор от 6 до 10 също присъстват в таблицата Cars2, следователно операторът EXCEPT върна само първите пет реда от таблицата Cars1.
По същия начин, ако искате да върнете всички записи от таблицата Cars2, които не присъстват в таблицата Cars1, можете просто да преместите таблицата Cars2 вляво от оператора EXCEPT, както е показано в следната заявка:
USE ShowRoom SELECT id, name, company, power FROM Cars2 Except SELECT id, name, company, power FROM Cars1
Използване на оператор EXCEPT на една таблица
В предишните примери приложихме оператора EXCEPT върху две таблици. Въпреки това, операторът EXCEPT може да се използва и за филтриране на записи от една таблица. Например, ако искате да филтрирате всички записи от таблицата Cars1, където стойността на мощността е по-голяма от 3000, можете да използвате оператора EXCEPT, както следва:
USE ShowRoom SELECT id, name, company, power FROM Cars1 Except SELECT id, name, company, power from Cars1 WHERE power < 3000
В горния скрипт заявката от лявата страна на оператора EXCEPT извлича всички записи от таблицата Cars1. Заявката от дясната страна на оператора EXCEPT извлича само онези записи от таблицата Cars1, където стойността на мощността е по-малка от 3000. Операторът EXCEPT филтрира записи от заявката вляво, които съществуват в резултатите от заявката отдясно. Следователно всички записи в таблицата Cars1, където мощността е по-малка от 3000, ще бъдат филтрирани, а останалите записи ще бъдат върнати, както е показано в изхода по-долу:
НЕ В оператор
Операторът NOT IN също се използва за филтриране на редове. Нека намерим всички записи от таблицата Cars1, които също присъстват в таблицата Cars2, и да върнем останалите записи, използвайки NOT IN оператор.
USE ShowRoom SELECT id, name, company, power FROM Cars1 WHERE id NOT IN (SELECT id from Cars2)
Резултатът от горната заявка изглежда така:
Това е подобно на резултатите, получени с помощта на оператора EXCEPT.
Разлика между операторите EXCEPT и NOT IN
Можем да видим, че резултатите, получени с помощта на операторите EXCEPT и NOT IN, са сходни. Има обаче две основни разлики между операторите EXCEPT и NOT IN:
1- NOT IN връща дублирани записи, докато EXCEPT връща само отделни записи
Операторът EXCEPT премахва дублиращи се редове от резултатите и връща само DISTINCT записи. От друга страна, операторът NOT IN ще върне дублирани записи.
Нека да разгледаме това с помощта на пример. Изпълнете следната заявка, за да вмъкнете дублиран запис в таблицата Cars1.
INSERT INTO Cars1 VALUES (1, 'Corrolla', 'Toyota', 1800)
Сега таблицата Cars1 има два дублиращи се записа. Можете да потвърдите това, като изпълните следната заявка:
SELECT * FROM Cars1
Таблицата Cars1 ще изглежда така:
Можете да видите, че редове 1 и 11 са дублирани един на друг.
Нека първо използваме оператор EXCEPT, за да филтрираме всички записи от таблицата Cars1, които присъстват в таблицата Cars2.
USE ShowRoom SELECT id, name, company, power FROM Cars1 Except SELECT id, name, company, power FROM Cars2
Резултатът изглежда така:
Можете да видите, че въпреки че редове 1 и 11 са дублирани в таблицата Cars1 и не присъстват в таблицата Cars2, операторът EXCEPT не е върнал и двата реда. Върна само отделни редове.
Сега нека използваме оператора NOT IN за същата задача:
USE ShowRoom SELECT id, name, company, power FROM Cars1 WHERE id NOT IN (SELECT id from Cars2)
Резултатът от горната заявка изглежда така:
Можете да видите, че NOT IN връща дублиращи се редове, т.е. ред 1 и ред 6.
2- ОСВЕН сравнява колони, докато NOT IN сравнява една стойност
Оператор EXCEPT сравнява стойности в една или повече от една колона. Това означава, че броят на колоните трябва да е същият. От друга страна, операторът NOT IN сравнява стойности в една колона.
Например, не можете да имате неравен брой колони за заявките отляво и отдясно на оператор EXCEPT, както е показано в следния пример:
USE ShowRoom SELECT id, name, company, power FROM Cars1 Except SELECT id, name,power FROM Cars2
Горната заявка връща следната грешка:
За оператора NOT IN не можете да имате повече от една колона в подзаявката. Това означава, че следната заявка ще върне грешка:
USE ShowRoom SELECT id, name, company, power FROM Cars1 WHERE id NOT IN (SELECT id, name from Cars2)
В горния скрипт подзаявката има две колони, т.е. идентификатор и име. Следователно ще бъде изведена грешка:
Допълнително четене:
- W3 училища:IN и NOT IN Примери
- TechontheNet:Операторът ОСВЕН
- YouTube:Оператор ОСВЕН