sql >> Base de Datos >  >> RDS >> MariaDB

Explicación del operador INTERSECT de MariaDB

En MariaDB, el INTERSECT El operador interseca dos consultas y devuelve solo las filas que se devuelven en ambas consultas.

Devuelve todas las filas desde la izquierda SELECT conjunto de resultados que también están presentes en el SELECT derecho conjunto de resultados.

Sintaxis

La sintaxis oficial es así:

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}]

Lo anterior también incluye el EXCEPT y UNION operadores en la sintaxis, ya que la misma sintaxis se aplica a esos operadores.

A partir de MariaDB 10.4.0, se pueden usar paréntesis para especificar la precedencia.

Ejemplo

Supongamos que tenemos las siguientes tablas:

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 el INTERSECT operador para devolver empleados que también son clientes:

SELECT EmployeeName FROM Employees
INTERSECT
SELECT CustomerName FROM Customers;

Resultado:

+--------------+
| EmployeeName |
+--------------+
| Ava          |
| Rohit        |
| Monish       |
+--------------+

Entonces solo obtenemos valores que aparecen en Employees que también aparecen en la tabla Customers mesa.

De forma predeterminada, devuelve filas distintas, por lo que solo se devuelve una fila para Monish, aunque haya varios empleados y varios clientes con ese nombre. Sin embargo, podemos cambiar esto.

Incluir duplicados

Por defecto, el INTERSECT operador aplica implícitamente un DISTINCT operación. En otras palabras, devuelve solo valores distintos de forma predeterminada.

Antes de MariaDB 10.5.0, el DISTINCT implícito era nuestra única opción:no pudimos especificar ALL . Sin embargo, MariaDB 10.5.0 introdujo el INTERSECT ALL y INTERSECT DISTINCT sintaxis.

Esto significa que ahora podemos hacer consultas como esta:

SELECT EmployeeName FROM Employees
INTERSECT ALL
SELECT CustomerName FROM Customers;

Resultado:

+--------------+
| EmployeeName |
+--------------+
| Monish       |
| Ava          |
| Rohit        |
| Monish       |
+--------------+

Esta vez obtuvimos cuatro filas, en lugar de las tres que obtuvimos en nuestro primer ejemplo.

Podemos ver que se devolvieron dos filas que contenían el nombre Monish en lugar de solo una como en nuestro primer ejemplo. En realidad, hay tres clientes llamados Monish, pero solo dos empleados con ese nombre. Por lo tanto, la operación solo intersecta dos de ellos.

Y en aras de la exhaustividad, aquí hay un ejemplo que usa explícitamente DISTINCT operador:

SELECT EmployeeName FROM Employees
INTERSECT DISTINCT
SELECT CustomerName FROM Customers;

Resultado:

+--------------+
| EmployeeName |
+--------------+
| Ava          |
| Rohit        |
| Monish       |
+--------------+

Este es el mismo resultado que obtendríamos si elimináramos DISTINCT operador.

Una consulta alternativa

Es posible obtener el mismo resultado sin utilizar INTERSECT operador. Por ejemplo, podríamos reescribir nuestro primer ejemplo así:

SELECT 
    DISTINCT EmployeeName
FROM Employees e 
WHERE EXISTS (SELECT CustomerName FROM Customers c
WHERE e.EmployeeName = c.CustomerName);

Resultado:

+--------------+
| EmployeeName |
+--------------+
| Ava          |
| Rohit        |
| Monish       |
+--------------+

Eso sí, el INTERSECT operador ayuda a simplificar el código.