Operador de intersección en MySQL
Este artículo te ayudará a aprender sobre el operador INTERSECT
. Aunque MySQL no admite INTERSECT
y MINUS
/EXCEPT
, existen otras formas de simular esta funcionalidad.
Veremos qué es INTERSECT
, sus beneficios y las diversas formas de aprender a emular INTERSECT
en MySQL.
Introducción al Operador INTERSECT
en MySQL
INTERSECT
es un operador de conjuntos que se utiliza para recuperar los elementos comunes de dos conjuntos. También se utiliza para obtener registros (filas) DISTINTO
(o comunes) de dos tablas.
También podemos decir que el operador INTERSECT
solo devuelve filas idénticas, que se recuperan como resultado de dos sentencias SELECCIONAR
. Echa un vistazo al siguiente diagrama de Venn para entender INTERSECCIÓN
.
Aquí, el área de la cuadrícula amarilla es la INTERSECCIÓN
. El principal beneficio de INTERSECT
es que puede acceder a registros idénticos desde muchas tablas.
Aunque MySQL
no soporta el operador INTERSECT
, podemos utilizar otras alternativas para realizar esta funcionalidad.
Operador INTERSECT
en MySQL
Como ya se ha dicho, el operador INTERSECCIÓN
no está disponible en MySQL
. Aún así, podemos simular esto usando la Cláusula INNER JOIN
e IN
y la Cláusula EXISTS
dependiendo de la complejidad y los requisitos de la consulta.
Estamos utilizando dos tablas llamadas order
y customer
. Los campos de la tabla customer
incluyen customer_id
, customer_firstname
, customer_lastname
, customer_age
y customer_salary
.
La tabla order
tiene order_id
, order_date
, order_amount
y customer_id
(la identificación del cliente es una clave externa aquí). Nuestra tabla customer
y order
tienen el siguiente aspecto con datos.
Puede crear tablas e insertar datos con el siguiente código de ejemplo.
#create customer table
CREATE TABLE customer(
customer_id INT NOT NULL PRIMARY KEY,
customer_firstname VARCHAR(60) NOT NULL,
customer_lastname VARCHAR(60) NOT NULL,
customer_age INT NOT NULL,
customer_salary INT NOT NULL
);
#create order table
CREATE TABLE order(
order_id INT NOT NULL PRIMARY KEY,
order_date DATETIME NOT NULL,
order_amount INT NOT NULL,
customer_id INT NOT NULL,
FOREIGN KEY (customer_id) REFERENCES customer(customer_id)
);
#insert into customer table
INSERT INTO customer VALUES
(1, 'Shajeel', 'Daniel', 23, 9000),
(2, 'Nayya', 'Preston', 54, 1500),
(3, 'James', 'Robert', 36, 2500),
(4, 'Jennifer', 'John', 29, 5000),
(5, 'Sarah', 'Paul', 15, 8000),
(6, 'Karen', 'Donald', 40, 3500);
#insert into order table
INSERT INTO order VALUES
(1, '2019-12-03 10:25:30', 500, 2),
(2, '2019-12-10 12:00:30', '1500', 4);
Tabla de clientes:
Tabla de pedidos:
Emule INTERSECT
a través de INNER JOIN
en MySQL
Queremos encontrar los detalles del order
(order_id
, order_amount
, order_date
) y los detalles del customer
(customer_id
, customer_firstname
, customer_lastname
) para saber qué customer
ha colocado el order
en qué fecha.
Eso significa que queremos encontrar el customer
idéntico a la tabla customer
y la tabla order
. También es necesario observar que los datos provienen de dos tablas; podemos usar un join llamado INNER JOIN
.
#MySQL Version 8.0.27
SELECT
order.order_id, customer.customer_id, customer.customer_firstname,
customer.customer_lastname,order.order_amount,order.order_date
FROM order
INNER JOIN
customer ON order.customer_id = customer.customer_id;
En el código anterior, recuperará el order_id
, customer_id
, customer_firstname
, customer_lastname
, order_amount
y order_date
para aquellos cuyo customer_id
es el mismo en la tabla customer
y en la tabla order
.
Producción:
Emular INTERSECT
a través de la cláusula IN
en MySQL
Ahora, tenemos una situación diferente. Aquí solo necesitamos tener los datos relacionados con el cliente.
Estos datos incluyen customer_id
, customer_firstname
, customer_lastname
y customer_age
. Y ese cliente debe estar presente en la tabla de order
.
Aquí, podemos usar la cláusula IN
para simular la operación INTERSECT
.
#MySQL version 8.0.27
SELECT
customer.customer_id, customer.customer_firstname,
customer.customer_lastname, customer.customer_age
FROM customer
WHERE customer.customer_id IN ( SELECT order.customer_id FROM order);
La subconsulta se ejecutará primero recogiendo todos los customer_id
de la tabla order
anterior. A continuación, SELECCIONARÁ
sólo aquellos detalles relacionados con el cliente cuyo customer_id
esté presente en el resultado de la subconsulta.
Producción:
Simule INTERSECT
a través de la cláusula EXISTS
en MySQL
En este escenario, solo queremos los datos del customer
cuya edad es menor de 45
y debe realizar al menos un order
. La cláusula EXISTS
se utiliza de la siguiente manera.
El siguiente código también producirá el mismo resultado si omite la cláusula EXISTS
.
SELECT
customer.customer_id, customer.customer_firstname,
customer.customer_lastname, customer.customer_age
FROM customer
WHERE customer.customer_age < 45
AND EXISTS
(SELECT order.customer_id FROM order where order.customer_id = customer.customer_id);
La subconsulta se ejecutará primero y proporcionará todos los customer_id
de la tabla order
donde el customer_id
es el mismo en ambas tablas (order
y customer
). Entonces se SELECCIONARÁ
sólo aquellos detalles relacionados con el cliente cuya edad sea menor de 45
y customer_id
estén presentes en el resultado de la subconsulta.
Producción:
Conclusión
Este artículo ha concluido muchas otras alternativas para hacer una operación.
También aprendimos diferentes formas de simular INTERSECT
en MySQL. Incluye la cláusula INNER JOIN
, IN
y EXISTS
.
Incluso vimos cómo podemos usar WHERE
y AND
mientras emulamos las operaciones INTERSECT
en MySQL.