Database
 sql >> база данни >  >> RDS >> Database

Разбиране на разликата между операторите EXCEPT и NOT IN

Операторите 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:Оператор ОСВЕН

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Броячи на PerfMon на коляното:Продължителност на живота на страницата

  2. Използване на Offline Reorg Wizard

  3. Как да ограничим резултатите в T-SQL

  4. Измерване на „режим на наблюдателя“ на SQL Trace спрямо разширени събития

  5. SQL SELECT AND оператор