Operación menos en MySQL
-
Emular el operador
MINUSen MySQL (8.0.27) -
Cuándo utilizar
NOT IN,NOT EXISTS, yLEFT JOIN/IS NULL - Conclusión
El operador MINUS se usa en SQL para encontrar elementos únicos de la tabla A que no están presentes en la tabla B.
Pasando por este tutorial, veremos cómo simular el operador MINUS en MySQL para obtener los resultados deseados. Lo entenderemos usando NOT IN, NOT EXISTS, LEFT JOIN y IS NULL.
También veremos la sintaxis de cada uno de los métodos mencionados y exploraremos algunas diferencias entre ellos.
Emular el operador MINUS en MySQL (8.0.27)
Uso de NOT IN en MySQL
Tomemos un ejemplo de una relación estudiante-curso, creemos una base de datos y dos tablas dentro de la base de datos. Uno se llama student, y el otro es el course.
La tabla student tiene las columnas ID, FIRST_NAME, LAST_NAME, GENDER, y la tabla course tiene las columnas COURSE_CODE, COURSE_TITLE, y STUDENT_ID.
Código de ejemplo:
/*
create the database and use it for table creation and other manipulation*/
CREATE SCHEMA db_practice_minus_operator;
USE db_practice_minus_operator;
# create student table
CREATE TABLE db_practice_minus_operator.student (
ID INT AUTO_INCREMENT PRIMARY KEY,
FIRST_NAME VARCHAR(64) NOT NULL,
LAST_NAME VARCHAR(64) NOT NULL,
GENDER VARCHAR(30) NOT NULL
);
#create course table
CREATE TABLE course (
COURSE_CODE VARCHAR(60) NOT NULL,
COURSE_TITLE VARCHAR(64) NOT NULL,
STUDENT_ID INT NOT NULL,
PRIMARY KEY(COURSE_CODE),
FOREIGN KEY (STUDENT_ID) REFERENCES student(ID)
);
Recuerda, la tabla course solo tiene asignaturas de ciencias, y queremos saber los alumnos que no se han matriculado en ninguno de los cursos de ciencias. Completemos las tablas y miremos las tablas de student y course.
Código de ejemplo:
# populate student table
INSERT INTO
student(FIRST_NAME, LAST_NAME,GENDER)
VALUES
('Shaajeel', 'Daniel', 'Male'),
('Nayya', 'Preston', 'Female'),
('James', 'Robert', 'Male'),
('Jennifer', 'John', 'Female'),
('Sarah', 'Paul', 'Female'),
('Karen', 'Donald','Female'),
('Thomas', 'Christopher','Male'),
('Lisa', 'Mark', 'Female'),
('Anthony', 'Richard', 'Male'),
('Matthew', 'Charles', 'Male');
# populate course table
INSERT INTO
course(COURSE_CODE, COURSE_TITLE, STUDENT_ID)
VALUES
(125854, 'Biology', 1),
(542968, 'Mathematics', 2),
(125648, 'Computer Science', 5),
(654891, 'Physics', 4),
(483215, 'Chemistry', 8),
(147934, 'Artificial Intelligence',6);
Los datos actuales en ambas tablas se ven de la siguiente manera.
Mesa del estudiante:

Tabla del curso:

Ahora, escriba la siguiente consulta SQL para comprender la simulación de la operación MINUS en MySQL.
Código de ejemplo:
# Simulate Minus Operator in MySQL
SELECT * FROM student
WHERE student.ID NOT IN
(SELECT STUDENT_ID FROM course);
Producción:

Usando NOT EXISTS en MySQL
Código de ejemplo:
# Simulate Minus Operator in MySQL
SELECT * FROM student std
WHERE NOT EXISTS
(SELECT STUDENT_ID FROM course WHERE std.ID = STUDENT_ID);
Producción:

Usando LEFT JOIN y IS NULL en MySQL
Código de ejemplo:
SELECT * FROM student
LEFT JOIN course on student.ID = course.STUDENT_ID
WHERE course.STUDENT_ID IS NULL;
Producción:

En la salida anterior, COURSE_CODE, COURSE_TITLE, y STUDENT_ID son visibles como NULL porque estos estudiantes no se han inscrito en ningún curso.
También puede comparar la columna ID, FIRST_NAME, LAST_NAME y GENDER con la salida de otros métodos para ver que todo funciona como se esperaba.
Cuándo utilizar NOT IN, NOT EXISTS, y LEFT JOIN/IS NULL
La pregunta ahora es cómo seleccionar uno de estos tres métodos. Puede decidir en función de algunos puntos básicos.
- La principal diferencia entre estos tres métodos es que
NOT INyNOT EXISTSmuestran los valores solo de la tabla de la izquierda (la primera consulta de selección). - Pero
LEFT JOIN/IS NULLgenerará la tabla de la izquierda, así como los valoresNULLen lugar de los valores de la tabla de la derecha donde no se encuentra una coincidencia entre la tabla de la izquierda y la derecha, porqueLEFT JOIN/IS NULLse utiliza para recuperar datos de más de una tabla. - Otra diferencia es cómo manejan los valores
NULLde la tabla de la derecha porqueLEFT JOIN/IS NULLyNOT EXISTSson semánticamente equivalentes mientras queNOT INno lo es. - El parámetro
NOT EXISTSdevuelveTRUEsi no se encuentra ninguna fila que cumpla la condición de igualdad en la tabla derecha. - El comportamiento de
NOT INes diferente; si se encuentra una fila en la lista,INdevolveráTRUE, yNOT INdevolveráFALSE. Por otro lado, si no se encuentra una fila en la lista, entoncesINdevolveráNULL, yNOT INtambién haráNULLporque la negación aNULLesNULL.
Conclusión
Teniendo en cuenta todos los detalles discutidos anteriormente, hemos llegado a la conclusión de que MySQL no admite la operación MINUS, pero hay otras formas de emular el operador MINUS. Puede usarlo según su necesidad, comodidad y requisitos.
