MariaDB
 sql >> Base de Dados >  >> RDS >> MariaDB

Explicação do operador MariaDB EXCEPT


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.