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

Explicação do operador MariaDB INTERSECT


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.