Operación menos en MySQL

Mehvish Ashiq 30 enero 2023
  1. Emular el operador MINUS en MySQL (8.0.27)
  2. Cuándo utilizar NOT IN, NOT EXISTS, y LEFT JOIN/IS NULL
  3. Conclusión
Operación menos en MySQL

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:

operación menos en mysql - datos de la tabla de estudiantes

Tabla del curso:

operación menos en mysql - datos de la 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:

menos operación en mysql - no en

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:

operación menos en mysql - not exists

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:

operación menos en mysql: combinación izquierda y es nulo

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 y NOT 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 valores NULL 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, porque LEFT 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 porque LEFT JOIN/IS NULL y NOT EXISTS son semánticamente equivalentes mientras que NOT IN no lo es.
  • El parámetro NOT EXISTS devuelve TRUE 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, y NOT IN devolverá FALSE. Por otro lado, si no se encuentra una fila en la lista, entonces IN devolverá NULL, y NOT IN también hará NULL porque la negación a NULL es NULL.

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.

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