В PostgreSQL, EXCEPT
операторът връща редове, които са върнати от лявата входна заявка, които не са върнати от дясната входна заявка. Това може също да се нарече разликата между две заявки.
Синтаксис
Синтаксисът е така:
query1 EXCEPT [ALL] query2
Дубликатите се елиминират, освен ако EXCEPT ALL
се използва.
Пример
Да предположим, че имаме следните таблици:
SELECT * FROM Teachers;
SELECT * FROM Students;
Резултат:
<пред> учителски | име на учител -----------+------------ 1 | Уорън 2 | Бен 3 | Кати 4 | Кати 5 | Законопроект 6 | Бил студент | име на студент -----------+------------ 1 | Фей 2 | Jet 3 | Спайк 4 | Ein 5 | Уорън 6 | Бил
Можем да използваме EXCEPT
оператор, за да върне учители, които също не са студенти:
SELECT TeacherName FROM Teachers
EXCEPT
SELECT StudentName FROM Students;
Резултат:
име на учителя ------------- Кати Бен
Така че получаваме само стойности, които се появяват в Teachers
таблица, която също не се показва в Students
маса.
По подразбиране EXCEPT
операторът връща отделни редове. Така че в нашия пример се връща само един ред за Cathy
, въпреки че има двама учители с това име.
Горният пример е еквивалент на следната заявка:
SELECT TeacherName FROM Teachers
EXCEPT DISTINCT
SELECT StudentName FROM Students;
Резултат:
име на учителя ------------- Кати Бен
Това е същият резултат, който получихме, когато нямаше изричен DISTINCT
ключова дума. Можем да включим дубликати с ALL
ключова дума (повече за това по-късно).
Можем да получим различни резултати, в зависимост от това коя маса е отляво и коя отдясно. Ето пример, който поставя Students
таблица вляво и Teachers
вдясно:
SELECT StudentName FROM Students
EXCEPT
SELECT TeacherName FROM Teachers;
Резултат:
име на студент ------------- Faye Jet Spike Ein
Този път получаваме ученици, които не са и учители.
Включване на дубликати
По подразбиране EXCEPT
оператор имплицитно прилага DISTINCT
операция. С други думи, той връща само различни стойности по подразбиране.
Можем да включим ALL
ключова дума, за да включим дубликати в нашия резултат:
SELECT TeacherName FROM Teachers
EXCEPT ALL
SELECT StudentName FROM Students;
Резултат:
име на учителя ------------- Кати Кати Бил Бен
Този път получихме четири реда, вместо двата, които получихме в първия ни пример.
Можем да видим, че и двете Кати бяха върнати вместо само една, както в първия ни пример.
Колкото до Бил? Има два законопроекта в Teachers
таблица, но тук се връща само една. Това вероятно е защото има един законопроект в Students
таблица, която би изключила един от законопроектите от нашите резултати.
Алтернатива
Възможно е да получите същия резултат, без да използвате EXCEPT
оператор. Например, можем да пренапишем първия си пример на това:
SELECT
DISTINCT TeacherName
FROM Teachers t
WHERE NOT EXISTS (SELECT StudentName FROM Students s
WHERE t.TeacherName = s.StudentName);
Резултат:
име на учителя ------------- Кати Бен