Operador de intersección en MySQL

Mehvish Ashiq 30 enero 2023
  1. Introducción al Operador INTERSECT en MySQL
  2. Operador INTERSECT en MySQL
  3. Conclusión
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.

operador de intersección en mysql - diagrama de venn

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:

operador de intersección en mysql - datos del cliente

Tabla de pedidos:

operador de intersección en mysql - datos de pedido

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:

operador de intersección en mysql - intersección con unión interna

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:

operador de intersección en mysql - intersección con la cláusula in

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:

operador de intersección en mysql - intersección con y cláusula

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.

Mehvish Ashiq avatar Mehvish Ashiq avatar

Mehvish Ashiq is a former Java Programmer and a Data Science enthusiast who leverages her expertise to help others to learn and grow by creating interesting, useful, and reader-friendly content in Computer Programming, Data Science, and Technology.

LinkedIn GitHub Facebook