No MariaDB, o
INTERSECT
O operador cruza duas consultas e retorna apenas as linhas que são retornadas em ambas as consultas. Ele retorna todas as linhas da esquerda
SELECT
conjunto de resultados que também estão presentes no SELECT
direito 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
EXCEPT
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 Employees;
SELECT * FROM Customers;
Resultado:
+------------+--------------+ | EmployeeId | EmployeeName | +------------+--------------+ | 1 | Bart | | 2 | Jan | | 3 | Ava | | 4 | Rohit | | 5 | Monish | | 6 | Monish | | 7 | Monish | +------------+--------------+ +------------+--------------+ | CustomerId | CustomerName | +------------+--------------+ | 1 | Mia | | 2 | Rohit | | 3 | Peter | | 4 | Ava | | 5 | Monish | | 6 | Monish | +------------+--------------+
Podemos usar o
INTERSECT
operador para devolver funcionários que também são clientes:SELECT EmployeeName FROM Employees
INTERSECT
SELECT CustomerName FROM Customers;
Resultado:
+--------------+ | EmployeeName | +--------------+ | Ava | | Rohit | | Monish | +--------------+
Assim, só obtemos valores que aparecem no campo
Employees
tabela que também aparecem no Customers
tabela. Por padrão, ele retorna linhas distintas, portanto, apenas uma linha é retornada para Monish, mesmo que haja vários funcionários e vários clientes com esse nome. Mas podemos mudar isso.
Incluir duplicatas
Por padrão, o
INTERSECT
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 INTERSECT ALL
e INTERSECT DISTINCT
sintaxe. Isso significa que agora podemos fazer consultas como esta:
SELECT EmployeeName FROM Employees
INTERSECT ALL
SELECT CustomerName FROM Customers;
Resultado:
+--------------+ | EmployeeName | +--------------+ | Monish | | Ava | | Rohit | | Monish | +--------------+
Desta vez, obtivemos quatro linhas, em vez das três que obtivemos em nosso primeiro exemplo.
Podemos ver que duas linhas contendo o nome Monish foram retornadas ao invés de apenas uma como no nosso primeiro exemplo. Na verdade, existem três clientes chamados Monish, mas apenas dois funcionários com esse nome. Portanto, a operação cruza apenas dois deles.
E por uma questão de completude, aqui está um exemplo que usa explicitamente o
DISTINCT
operador:SELECT EmployeeName FROM Employees
INTERSECT DISTINCT
SELECT CustomerName FROM Customers;
Resultado:
+--------------+ | EmployeeName | +--------------+ | Ava | | Rohit | | Monish | +--------------+
Este é o mesmo resultado que obteríamos se removêssemos o
DISTINCT
operador. Uma consulta alternativa
É possível obter o mesmo resultado sem usar o
INTERSECT
operador. Por exemplo, poderíamos reescrever nosso primeiro exemplo para isso:SELECT
DISTINCT EmployeeName
FROM Employees e
WHERE EXISTS (SELECT CustomerName FROM Customers c
WHERE e.EmployeeName = c.CustomerName);
Resultado:
+--------------+ | EmployeeName | +--------------+ | Ava | | Rohit | | Monish | +--------------+
Lembre-se, o
INTERSECT
operador ajuda a simplificar o código.