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.