No MariaDB, o
EXCEPT
O operador retorna linhas da consulta de entrada esquerda que não são geradas pela consulta de entrada direita. Outra maneira de colocar é que ele retorna todas as linhas da esquerda
SELECT
conjunto de resultados exceto linhas que estão à direita SELECT
conjunto de resultados. Sintaxe
A sintaxe oficial é assim:
SELECT ...
(INTERSECT [ALL | DISTINCT] | EXCEPT [ALL | DISTINCT] | UNION [ALL | DISTINCT]) SELECT ...
[(INTERSECT [ALL | DISTINCT] | EXCEPT [ALL | DISTINCT] | UNION [ALL | DISTINCT]) SELECT ...]
[ORDER BY [column [, column ...]]]
[LIMIT {[offset,] row_count | row_count OFFSET offset}]
O acima também inclui o
INTERSECT
e UNION
operadores na sintaxe, pois a mesma sintaxe se aplica a esses operadores. A partir do MariaDB 10.4.0, os parênteses podem ser usados para especificar a precedência.
Exemplo
Suponha que temos as seguintes tabelas:
SELECT * FROM Teachers;
SELECT * FROM Students;
Resultado:
+-----------+-------------+ | 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 | +-----------+-------------+
Podemos usar o
EXCEPT
operador para devolver professores que não são também alunos:SELECT TeacherName FROM Teachers
EXCEPT
SELECT StudentName FROM Students;
Resultado:
+-------------+ | TeacherName | +-------------+ | Ben | | Cathy | +-------------+
Portanto, só obtemos valores que aparecem no
Teachers
tabela que também não aparece em Students
tabela. Por padrão, ele retorna linhas distintas, portanto, apenas uma linha é retornada para
Cathy
, embora existam dois professores com esse nome. Podemos mudar esse comportamento - mais sobre isso mais tarde. Também podemos alternar e colocar o
Students
tabela à esquerda e Teachers
a direita. SELECT StudentName FROM Students
EXCEPT
SELECT TeacherName FROM Teachers;
Resultado:
+-------------+ | StudentName | +-------------+ | Faye | | Jet | | Spike | | Ein | +-------------+
É possível obter o mesmo resultado sem usar o
EXCEPT
operador. Por exemplo, poderíamos reescrever nosso primeiro exemplo para isso:SELECT
DISTINCT TeacherName
FROM Teachers t
WHERE NOT EXISTS (SELECT StudentName FROM Students s
WHERE t.TeacherName = s.StudentName);
Resultado:
+-------------+ | TeacherName | +-------------+ | Ben | | Cathy | +-------------+
Lembre-se, o
EXCEPT
operador ajuda a simplificar o código de forma bastante significativa. Incluir duplicatas
Por padrão, o
EXCEPT
operador aplica implicitamente um DISTINCT
Operação. Em outras palavras, ele retorna apenas valores distintos por padrão. Antes do MariaDB 10.5.0, o
DISTINCT
implícito era nossa única opção - não foi possível especificar ALL
. No entanto, o MariaDB 10.5.0 introduziu o EXCEPT ALL
e EXCEPT DISTINCT
sintaxe. Isso significa que agora podemos fazer consultas como esta:
SELECT TeacherName FROM Teachers
EXCEPT ALL
SELECT StudentName FROM Students;
Resultado:
+-------------+ | TeacherName | +-------------+ | Cathy | | Ben | | Cathy | | Bill | +-------------+
Desta vez, obtivemos quatro linhas, em vez das duas que obtivemos em nosso primeiro exemplo.
Podemos ver que ambas as Cathys foram retornadas ao invés de apenas uma como no nosso primeiro exemplo.
Quanto a Bill? Existem duas contas em
Teachers
tabela, mas apenas um é retornado aqui. Provavelmente porque há um projeto de lei em Students
tabela, o que excluiria uma das contas de nossos resultados. E aqui está um exemplo que usa explicitamente o
DISTINCT
operador:SELECT TeacherName FROM Teachers
EXCEPT DISTINCT
SELECT StudentName FROM Students;
Resultado:
+-------------+ | TeacherName | +-------------+ | Ben | | Cathy | +-------------+
Como esperado, obtemos o mesmo resultado que obteríamos se removêssemos o
DISTINCT
operador. No MariaDB 10.6.1,
MINUS
foi introduzido como sinônimo de EXCEPT
. Portanto, podemos usar MINUS
em vez de EXCEPT
no MariaDB 10.6.1 e posterior.