Saltar al contenido principal

Operador SQL NOT IN: Guía completa para principiantes

Domina el operador NOT IN de SQL con esta guía para principiantes. Aprende a filtrar los datos con eficacia, evita los errores comunes y explora alternativas eficientes
Actualizado 16 ene 2025  · 5 min de lectura

En el ámbito del análisis y la gestión de datos, SQL (Lenguaje de Consulta Estructurado) se erige como una herramienta fundamental para acceder a los sistemas de bases de datos y manipularlos. Entre sus muchas funciones, el operador NOT IN sirve como un potente medio para filtrar conjuntos de datos, permitiendo a los usuarios excluir filas que coincidan con una lista especificada de valores. Este tutorial se ha diseñado con el objetivo de desmitificar el operador NOT IN para principiantes y profesionales de los datos, garantizando la claridad en su aplicación y la comprensión de sus posibles escollos.

¿Por qué NO ENTRAR?

La elección de centrarnos en el operador NOT IN se debe a su utilidad en escenarios de exclusión de datos. Tanto si limpias datos como si preparas informes o realizas análisis complejos, comprender cómo excluir eficazmente puntos de datos concretos tiene un valor incalculable. Este operador ofrece una sintaxis sencilla, pero tiene matices que pueden afectar al rendimiento y la precisión.

Nuestra decisión de explorar NOT IN en profundidad es proporcionar una comprensión global que te dote de los conocimientos necesarios para utilizarlo eficazmente en tus consultas SQL.

Comprender SQL NOT IN

Lo básico de NO EN

El operador NOT IN se utiliza dentro de una cláusula WHERE para excluir filas en las que el valor de una columna especificada coincida con cualquiera de una lista de valores dada. Su sintaxis básica es la siguiente

SELECT column_names
FROM table_name
WHERE column_name NOT IN (value1, value2, ...);

Esta sintaxis destaca el papel del operador en el filtrado de datos, un paso fundamental en el análisis de datos y la gestión de bases de datos.

Aplicaciones prácticas de NOT IN

Considera una base de datos que contiene una tabla con información sobre los clientes. Si quieres seleccionar clientes que no sean de ciudades concretas, NOT IN se convierte en una herramienta inestimable, que te permite excluir fácilmente esas ciudades de tu conjunto de resultados.

Ejemplos NOT IN paso a paso

Ejemplo 1: Excluir valores específicos

Supongamos que tenemos una tabla llamada Customers con las columnas CustomerID, CustomerName, y City. Para encontrar clientes que no se encuentren en "Nueva York" o "Los Ángeles", la consulta sería

ClientelD

CustomerName

Ciudad

1

John Doe

Nueva York

2

Jane Smith

Los Angeles

3

Emily Jones

Chicago

4

Chris Brown

Miami

5

Alex Johnson

San Francisco

6

Jessica White

Nueva York

Tabla de clientes

SELECT CustomerName, City
FROM Customers
WHERE City NOT IN ('New York', 'Los Angeles');

CustomerName

Ciudad

Emily Jones

Chicago

Chris Brown

Miami

Alex Johnson

San Francisco

Ejemplo 2: Utilizar NOT IN con subconsultas

NOT IN también puede funcionar con subconsultas. Por ejemplo, para encontrar productos que no se han pedido:

ProductID

ProductName

1

Manzana

2

Banana

3

Naranja

4

Pera

5

Uva

Productos de mesa

OrderID

ProductID

101

2

102

4

103

2

104

3

Tabla de pedidos

SELECT ProductName
FROM Products
WHERE ProductID NOT IN (
  SELECT ProductID
  FROM Orders
);

ProductName

Manzana

Uva

Errores comunes y cómo evitarlos

Manejo de valores nulos

Un problema común con NOT IN surge cuando la lista de valores contiene NULL. Como NULL representa un valor desconocido, cualquier comparación con NULL utilizando NOT IN no devolverá ninguna fila, aunque haya filas que lógicamente deberían excluirse de la lista.

Para evitarlo, asegúrate de que la lista de valores no contiene NULL o utiliza un método alternativo como NOT EXISTS.

Ejemplo:

Supongamos que tenemos una tabla Pedidos con una columna CustomerID, algunas de las cuales son NULL para representar pedidos de invitados. Si ejecutas una consulta para encontrar pedidos no realizados por determinados clientes, incluir NULL en la lista haría que no se obtuvieran resultados.

OrderID

CustomerID

101

3

102

4

103

2

104

 

106

1

Tabla de pedidos

-- Assume we want to exclude CustomerID 1, 2, and unknown (NULL) customers
SELECT OrderID
FROM Orders
WHERE CustomerID NOT IN (1, 2, NULL);

Esta consulta no devolvería ninguna fila, lo que probablemente no sea el resultado deseado.

Solución: Para garantizar resultados precisos, evita incluir NULL en la lista de NOT IN. Alternativamente, utiliza una combinación de NOT IN para valores conocidos y IS NOT NULL para manejar los NULL de forma eficaz.

SELECT OrderID
FROM Orders
WHERE CustomerID NOT IN (1, 2) AND CustomerID IS NOT NULL;

OrderID

101

102

Consideraciones sobre el rendimiento

Para grandes conjuntos de datos o subconsultas, NOT IN puede ser menos eficiente que alternativas como NOT EXISTS o LEFT JOIN /IS NULL. La ineficacia se debe a cómo NOT IN compara cada fila de la tabla con cada valor de la lista, lo que puede provocar un rendimiento lento en grandes conjuntos de datos.

Alternativas a SQL NOT IN

Utilizar NOT EXISTS

NOT EXISTS suele recomendarse en lugar de NOT IN cuando se trata de subconsultas que pueden devolver valores de NULL. En general, es más eficaz porque se detiene en cuanto encuentra una coincidencia.

Ejemplo:

Para encontrar productos que no se han pedido, utiliza NOT EXISTS:

SELECT ProductName
FROM Products p
WHERE NOT EXISTS (
  SELECT 1
  FROM Orders o
  WHERE o.ProductID = p.ProductID
);

ProductName

Manzana

Uva

Esta consulta comprueba la no existencia de un producto en la tabla de pedidos, lo que puede ser más eficaz que comparar contra una lista potencialmente grande de IDs con NOT IN.

UNIÓN IZQUIERDA / ES NULO

Otra alternativa eficaz para excluir filas es utilizar una cláusula LEFT JOIN combinada con una cláusula WHERE... IS NULL. Este método es especialmente eficaz para grandes conjuntos de datos.

Ejemplo:

Para conseguir el mismo objetivo de encontrar productos que no se han pedido:

SELECT p.ProductName
FROM Products p
LEFT JOIN Orders o ON p.ProductID = o.ProductID
WHERE o.ProductID IS NULL;

ProductName

Manzana

Uva

Este método aprovecha el LEFT JOIN para incluir todos los productos y cualquier pedido que coincida, y luego filtra los productos que tienen pedidos utilizando WHERE o.ProductID IS NULL, excluyéndolos de hecho.

Buenas prácticas para utilizar NOT IN

  • Comprueba la lista de valores NULL: Asegúrate de que la lista utilizada en NOT IN no contiene valores NULL para evitar resultados inesperados.
  • Considera el tamaño del conjunto de datos: Para grandes conjuntos de datos o subconsultas, evalúa si alternativas como NOT EXISTS pueden ofrecer un mejor rendimiento.
  • Indexación: Asegúrate de que las columnas utilizadas en la cláusula NOT IN están indexadas, si es posible, para mejorar el rendimiento de la consulta.

Utilizar NOT IN en un proyecto de datos de la vida real

En el análisis de datos, el comando SQL "Not IN" se utiliza habitualmente para recuperar datos concretos. En esta sección, trabajaremos con una base de datos de una librería que lleva un registro de su inventario (libros disponibles en la tienda) y de sus ventas (libros vendidos). Nuestro objetivo es identificar qué libros no se han vendido nunca.

Tenemos dos mesas:

  • Inventario: para almacenar información sobre los libros de la librería.
  • Ventas: para almacenar los registros de los libros que se han vendido.

image4.png

Tabla de inventario

image3.png

Tabla de ventas

Ahora queremos averiguar qué libros no se han vendido nunca.

SELECT Title, Author 
FROM Inventory 
WHERE BookID NOT IN (
    SELECT BookID 
    FROM Sales
);

image1.png

A continuación, queremos identificar los libros de nuestro inventario que no se han vendido en el último mes, suponiendo que hoy es 7 de febrero de 2024. Esto implica comprobar la FechaVenta de la tabla Ventas con nuestra fecha actual.

SELECT Title, Author 
FROM Inventory 
WHERE BookID NOT IN (
    SELECT BookID 
    FROM Sales
    WHERE SaleDate >= date('now', '-1 month')
);

image2.png

Conclusión

El operador NOT IN es una herramienta versátil en SQL para excluir valores específicos de los resultados de tu consulta. Si conoces su sintaxis, sus aplicaciones prácticas y sus posibles escollos, podrás utilizar eficazmente este operador en tus tareas de manipulación de datos.

Recuerda tener en cuenta los valores de NULL y el tamaño del conjunto de datos para optimizar el rendimiento y la precisión de tus consultas. A medida que te familiarices con NOT IN, descubrirás que es un complemento inestimable de tu conjunto de herramientas SQL, que te permitirá un análisis y una gestión de datos más precisos y eficaces.

Puedes obtener más información sobre NOT IN y NOT EXISTS en nuestro curso Mejorar el rendimiento de las consultas en SQL Server y explorar los operadores SQL y mucho más en nuestro curso Básicos de SQL y Fundamentos de SQL.

Conviértete en Ingeniero de Datos

Demuestra tus habilidades como ingeniero de datos preparado para el trabajo.
Acelerar mi carrera en el sector de los datos

Abid Ali Awan's photo
Author
Abid Ali Awan
LinkedIn
Twitter

Soy un científico de datos certificado que disfruta creando aplicaciones de aprendizaje automático y escribiendo blogs sobre ciencia de datos. Actualmente me centro en la creación de contenidos, la edición y el trabajo con grandes modelos lingüísticos.

Temas

Comienza hoy tu viaje de aprendizaje de SQL

Certificación disponible

curso

SQL intermedio

4 hr
302.5K
Acompañado en cada paso con consultas prácticas, este curso te enseña todo lo que necesitas saber para analizar datos utilizando tu propio código SQL ¡hoy mismo!
Ver detallesRight Arrow
Comienza el curso
Ver másRight Arrow