Operación menos en MySQL
-
Emular el operador
MINUS
en 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 IN
yNOT EXISTS
muestran los valores solo de la tabla de la izquierda (la primera consulta de selección). - Pero
LEFT JOIN
/IS NULL
generará la tabla de la izquierda, así como los valoresNULL
en 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 NULL
se utiliza para recuperar datos de más de una tabla. - Otra diferencia es cómo manejan los valores
NULL
de la tabla de la derecha porqueLEFT JOIN
/IS NULL
yNOT EXISTS
son semánticamente equivalentes mientras queNOT IN
no lo es. - El parámetro
NOT EXISTS
devuelveTRUE
si no se encuentra ninguna fila que cumpla la condición de igualdad en la tabla derecha. - El comportamiento de
NOT IN
es diferente; si se encuentra una fila en la lista,IN
devolveráTRUE
, yNOT IN
devolveráFALSE
. Por otro lado, si no se encuentra una fila en la lista, entoncesIN
devolveráNULL
, yNOT IN
también haráNULL
porque la negación aNULL
esNULL
.
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.