В SQLite, EXCEPT операторът може да се използва за създаване на съставен SELECT оператор, който връща подмножеството от редове, върнати от левия SELECT които не се връщат от десния SELECT .
Пример
Да предположим, че имаме следните таблици:
SELECT * FROM Teachers;
SELECT * FROM Students; Резултат:
TeacherId TeacherName --------- ----------- 1 Warren 2 Ben 3 Cathy 4 Cathy 5 Bill 6 Bill StudentId StudentName --------- ----------- 1 Faye 2 Jet 3 Spike 4 Ein 5 Warren 6 Bill
Можем да използваме EXCEPT оператор, за да върне учители, които също не са студенти:
SELECT TeacherName FROM Teachers
EXCEPT
SELECT StudentName FROM Students; Резултат:
TeacherName ----------- Ben Cathy
Така че получаваме само стойности, които се появяват в Teachers таблица, която също не се показва в Students маса.
Можем да получим различни резултати, в зависимост от това коя маса е отляво и коя отдясно. Ето пример, който поставя Students таблица вляво и Teachers вдясно:
SELECT StudentName FROM Students
EXCEPT
SELECT TeacherName FROM Teachers; Резултат:
StudentName ----------- Ein Faye Jet Spike
Този път получаваме ученици, които не са и учители.
EXCEPT на SQLite операторът връща само отделни редове. Така че в нашия пример се връща само един ред за Cathy , въпреки че има двама учители с това име.
Някои други RDBMS ни позволяват да включваме дубликати в резултата, като приемем незадължителен ALL ключова дума с техния EXCEPT оператор, но SQLite не го прави (поне не към момента на писане). Чувствайте се свободни да проверите документацията на SQLite, в случай че нещо се промени.
Алтернатива
Възможно е да получите същия резултат, без да използвате EXCEPT оператор. Например, можем да пренапишем първия си пример на това:
SELECT
DISTINCT TeacherName
FROM Teachers t
WHERE NOT EXISTS (SELECT StudentName FROM Students s
WHERE t.TeacherName = s.StudentName); Резултат:
TeacherName ----------- Ben Cathy