- 1 1. ¿Qué es la cláusula NOT IN de MySQL? — Haciendo la extracción de datos más conveniente con condiciones de exclusión
 - 2 2. Sintaxis básica y ejemplos de uso de NOT IN
 - 3 3. Precauciones cuando se mezclan valores NULL
 - 4 4. NOT IN vs NOT EXISTS – Comparación de alternativas
 - 5 5. Consideraciones de rendimiento
 - 6 6. Patrones de uso comunes y técnicas avanzadas
 - 7 7. Preguntas Frecuentes (FAQ)
 - 8 8. Resumen
 
1. ¿Qué es la cláusula NOT IN de MySQL? — Haciendo la extracción de datos más conveniente con condiciones de exclusión
Al realizar operaciones en bases de datos en MySQL, existen sorprendentemente muchos casos en los que deseas recuperar datos excluyendo valores o condiciones específicas. Por ejemplo, “mostrar una lista excluyendo usuarios retirados” o “agregar datos excluyendo identificadores bloqueados”—estos escenarios aparecen con frecuencia en entornos empresariales y de desarrollo. Ahí es donde entra en juego la cláusula NOT IN. La cláusula NOT IN es una expresión condicional SQL potente que te permite extraer fácilmente solo los datos que no coinciden con los valores especificados o los resultados de una subconsulta. No solo exclusiones simples usando listas, sino también combinaciones con subconsultas dinámicas permiten diversos patrones de “extracción de exclusión”.
Sin embargo, la cláusula NOT IN requiere atención a ciertos puntos según cómo se utilice, y también existen trampas inesperadas. En particular, su comportamiento al incluir valores NULL, problemas de rendimiento en bases de datos a gran escala, diferencias con NOT EXISTS y otros aspectos que es importante comprender a nivel práctico.
En este artículo, explicaremos cuidadosamente desde los conceptos básicos hasta el uso avanzado de la cláusula NOT IN de MySQL, incluyendo precauciones y comparaciones con otros métodos de exclusión, mediante ejemplos concretos. Esta información es útil tanto para quienes la aprenden por primera vez como para quienes trabajan regularmente con SQL. Lee hasta el final y utilízala para mejorar tus habilidades en SQL y aumentar la eficiencia de tu trabajo.
2. Sintaxis básica y ejemplos de uso de NOT IN
La cláusula NOT IN se utiliza en MySQL cuando deseas extraer datos que no coinciden con varios valores especificados. La sintaxis en sí es simple, pero resulta útil en diversas situaciones del mundo real. Aquí, primero presentaremos la sintaxis básica y ejemplos prácticos.
SELECT column_name FROM table_name WHERE column_name NOT IN (value1, value2, ...);
Exclusión usando una lista simple
Por ejemplo, si deseas recuperar usuarios cuyos nombres de usuario no sean ni “Yamada” ni “Sato”, la sentencia SQL sería algo así.
SELECT * FROM users WHERE name NOT IN ('Yamada', 'Sato');
Al ejecutar esta consulta se recuperará toda la información de los usuarios excepto Yamada y Sato. La lista de exclusión consiste simplemente en valores separados por comas, lo que facilita su escritura, una característica clave.
Exclusión dinámica usando subconsultas
NOT IN también puede usar una subconsulta dentro de los paréntesis, no solo una lista. Por ejemplo, es conveniente cuando deseas recuperar identificadores de usuario que no cumplan ciertas condiciones.
SELECT * FROM users
WHERE id NOT IN (SELECT user_id FROM blacklist WHERE is_active = 1);
En este ejemplo, excluimos los identificadores de usuario que están en la lista negra activa (is_active=1) de la tabla blacklist y recuperamos los demás usuarios de la tabla users. El atractivo de la cláusula NOT IN es su flexibilidad para manejar la lógica empresarial mediante tales combinaciones con subconsultas.
Aplicaciones con múltiples condiciones
Si deseas especificar condiciones de exclusión para múltiples columnas simultáneamente, NOT IN se utiliza básicamente para casos de una sola columna, pero combinándolo con subconsultas o uniones (JOIN), puede manejar condiciones complejas. Esto se explicará en detalle en la sección de técnicas avanzadas más adelante.
De esta manera, la cláusula NOT IN es muy conveniente cuando deseas extraer todos los valores excepto los que están en una lista o subconsulta especificada. Primero, visualiza los datos que deseas extraer y trata de dominarlo, pasando de listas de exclusión simples a subconsultas.
3. Precauciones cuando se mezclan valores NULL
NOT IN clause, it’s surprisingly easy to overlook the behavior «when NULL values are mixed in.» This is a «pitfall» that can lead to careless mistakes not only for SQL beginners but also for experienced users.
 Why is that? The judgment logic of NOT IN differs from normal comparisons, with the characteristic that «the result changes if NULL is included.»
Comportamiento al incluir NULL
Por ejemplo, supongamos que existe una tabla como la siguiente.
-- users table
id | name
---+------
 1 | Sato
 2 | Yamada
 3 | Suzuki
 4 | Tanaka
-- blacklist table
user_id
--------
1
NULL
En este momento, ¿qué sucede cuando ejecutas la siguiente sentencia SQL?
SELECT * FROM users WHERE id NOT IN (SELECT user_id FROM blacklist);
A primera vista, parece que se recuperarán todos los usuarios excepto ‘user_id=1’ (id=2,3,4). Sin embargo, en realidad, no se devuelven filas.
Por qué no se devuelve nada
La razón se encuentra en la «lógica de tres valores de SQL (TRUE/FALSE/UNKNOWN)». Cuando NULL se incluye en la lista de NOT IN, el resultado de la comparación pasa a ser ‘UNKNOWN’, y MySQL no incluye esa fila en el resultado. En otras palabras, al volverse imposible afirmar que algún valor ‘no coincide con esto’, el juicio SQL global se vuelve ‘falso’.
Ejemplos comunes de problemas
Especialmente al usar subconsultas, si NULL está incluido en los datos de listas de bloqueo o retiro, a menudo ocurre que los datos no se extraen como se esperaba. Se convierte fácilmente en la causa de problemas como ‘no se obtienen datos’ o ‘por alguna razón, la exclusión no funciona’, así que ten cuidado.
Contramedidas y métodos de evitación
Para prevenir problemas causados por NULLs mezclados, es importante excluir NULL de la lista objetivo de NOT IN. Específicamente, combina ‘IS NOT NULL’ en la subconsulta.
SELECT * FROM users
WHERE id NOT IN (
  SELECT user_id FROM blacklist WHERE user_id IS NOT NULL
);
Al hacer esto, incluso si hay valores NULL en la lista negra, puedes extraer correctamente a los ‘usuarios que no coinciden’.Resumen de puntos
- Si hay NULL en la lista de 
NOT IN, el resultado puede no devolver filas en absoluto - Al usar subconsulta + NOT IN, no olvides excluir NULL con ‘IS NOT NULL’
 - Cuando ‘no se pueden recuperar datos’, primero sospecha la inclusión de NULL
 
4. NOT IN vs NOT EXISTS – Comparación de alternativas
Al especificar ‘condiciones de exclusión’ en MySQL, además de NOT IN, NOT EXISTS es otra opción que se usa con frecuencia. Ambos pueden usarse para propósitos similares, pero existen diferencias en sus mecanismos, comportamiento, rendimiento y manejo de valores NULL. En este capítulo, explicaremos cómo elegir entre NOT IN y NOT EXISTS, y sus respectivas ventajas y desventajas.
Comparación de la sintaxis básica
[Exclusion Using NOT IN]SELECT * FROM users
WHERE id NOT IN (SELECT user_id FROM blacklist WHERE user_id IS NOT NULL);
[Exclusion Using NOT EXISTS]SELECT * FROM users u
WHERE NOT EXISTS (
  SELECT 1 FROM blacklist b WHERE b.user_id = u.id
);
Ambas son consultas que extraen usuarios que no están registrados en la lista negra.
Robustez frente a valores NULL
NOT IN
- Si 
NULLestá mezclado en el lado de la subconsulta o en la lista, puede no comportarse como se espera (los resultados pueden ser 0 filas) - Como contramedida, la condición «IS NOT NULL» es necesaria
 
NOT EXISTS
- Incluso si 
NULLestá incluido en los resultados de la subconsulta, funciona correctamente - Básicamente no se ve afectado por valores NULL, por lo que es más seguro
 
Diferencias en el rendimiento
La forma óptima depende del volumen de datos y la estructura de la tabla, pero en general…
- Para datos de pequeña escala o listas fijas, 
NOT INes adecuado - Cuando la subconsulta es grande o se involucran condiciones complejas, 
NOT EXISTSoLEFT JOINsuelen rendir mejor 
Especialmente a medida que aumenta el número de entradas en la lista negra, aumentan los casos en los que NOT EXISTS opera de manera más eficiente. Depende de la versión de MySQL y del diseño de índices, pero NOT EXISTS realiza ‘verificaciones de existencia de la subconsulta para cada fila’, por lo que es muy rápido cuando los índices son efectivos.
Directrices para elegir entre ellos
- Cuando existe la posibilidad de que valores NULL se mezclen → Recomendar 
NOT EXISTS - Para listas fijas o exclusiones de valores simples → 
NOT INestá bien - Cuando la prioridad es el rendimiento → Revisa el plan de ejecución con EXPLAIN y elige según la situación (considera JOIN o NOT EXISTS)
 
Casos de ejemplo
Ejemplo de problema con NOT IN
-- When NULL is included in blacklist.user_id
SELECT * FROM users
WHERE id NOT IN (SELECT user_id FROM blacklist);
-- Results may be 0 rows
Ejemplo seguro de exclusión con NOT EXISTS
SELECT * FROM users u
WHERE NOT EXISTS (
  SELECT 1 FROM blacklist b WHERE b.user_id = u.id
);
-- Can extract correctly regardless of the presence of NULL
Resumen
NOT INes simple pero débil frente a la contaminación por NULLNOT EXISTSes fuerte contra NULL y se usa comúnmente en la práctica- Elige cuál usar según el «contenido de los datos» y el «rendimiento deseado»
 
5. Consideraciones de rendimiento
Al manejar grandes volúmenes de datos en SQL, el rendimiento de las consultas es extremadamente importante. Al usar NOT IN o NOT EXISTS, pueden existir diferencias significativas en la velocidad de procesamiento según las condiciones y el volumen de datos. Este capítulo explica el impacto en el rendimiento, las precauciones y los consejos de optimización, centrándose en la cláusula NOT IN.
Características del rendimiento de la cláusula NOT IN
NOT IN es un mecanismo que extrae registros si no hay datos coincidentes en la lista o subconsulta especificada. Opera rápidamente para listas o tablas pequeñas, pero el procesamiento puede ralentizarse en casos como los siguientes.
- Cuando el número de filas de datos en el lado de la subconsulta es grande
 - Cuando no se ha establecido un índice en la columna objetivo de exclusión
 - Cuando hay valores NULL mezclados en la subconsulta
 
Especialmente, si hay decenas de miles o cientos de miles de filas de datos en la subconsulta y no se ha establecido un índice, MySQL realiza una comparación completa, lo que puede hacer que sea extremadamente lento.
La importancia de utilizar índices
Al establecer un índice en la columna objetivo de exclusión (por ejemplo, user_id), MySQL puede realizar comparaciones y extracciones de manera eficiente. Establece activamente índices en columnas usadas en subconsultas o joins (JOIN).
CREATE INDEX idx_blacklist_user_id ON blacklist(user_id);
Agregar un índice como este puede mejorar significativamente el rendimiento de NOT IN y NOT EXISTS.

Comparación de rendimiento entre NOT IN y NOT EXISTS
- Para listas fijas pequeñas: 
NOT INes más rápido - Para subconsultas grandes: usar 
NOT EXISTSoLEFT JOINes más eficiente 
Especialmente en MySQL, el plan de ejecución (resultados de EXPLAIN) varía según la versión y el diseño de la tabla, por lo que es importante probar realmente la optimización del rendimiento.
Verificación del plan de ejecución con EXPLAIN
Para saber qué consulta es más rápida, utiliza el comando EXPLAIN de MySQL.
EXPLAIN SELECT * FROM users WHERE id NOT IN (SELECT user_id FROM blacklist WHERE user_id IS NOT NULL);
Esto te permite verificar información directamente relacionada con el rendimiento, como qué índices se están utilizando y qué tablas están realizando escaneos completos.
Ejemplos de optimización para datos a gran escala
- Según sea necesario, almacena datos en una tabla temporal para reducir la carga en la subconsulta
 - Si sigue siendo lento, utiliza procesamiento por lotes o caché
 - Intenta reescribir con 
LEFT JOIN ... IS NULL(puede acelerar según la situación) 
Resumen de puntos
NOT INtiende a ser lento cuando la subconsulta tiene muchas filas o no hay índice- El rendimiento puede mejorarse significativamente con el diseño de índices y la revisión de consultas
 - Considera 
NOT EXISTSyLEFT JOINcomo opciones y verifica sus efectos con EXPLAIN 
En entornos prácticos o de producción, selecciona la consulta óptima considerando la escala de datos y la frecuencia de uso.
6. Patrones de uso comunes y técnicas avanzadas
NOT IN no solo se utiliza para procesos de exclusión simples, sino que también permite una extracción de datos más flexible cuando se aplica de manera creativa. Aquí presentamos los patrones más comunes en el campo y técnicas avanzadas útiles.
Exclusión usando múltiples columnas (excluyendo claves compuestas)
NOT IN se usa básicamente para una sola columna, pero también existe la necesidad de excluir basándose en combinaciones de dos o más columnas. En esos casos, NOT EXISTS o LEFT JOIN con condiciones compuestas son apropiados.
Ejemplo: Excluir combinaciones específicas de ID de cliente e ID de producto en la tabla de pedidos
SELECT * FROM orders o
WHERE NOT EXISTS (
  SELECT 1 FROM blacklist b
  WHERE b.customer_id = o.customer_id
    AND b.product_id = o.product_id
);
De esta manera, puedes excluir combinaciones de “ID de cliente × ID de producto” registradas en la lista negra de una sola vez.
Exclusión por coincidencia parcial (comodín): combinando con NOT LIKE
NOT IN solo se puede usar para coincidencias de valores exactos, pero NOT LIKE es conveniente cuando quieres excluir patrones de cadena específicos. Por ejemplo, cuando quieres excluir usuarios cuyos correos electrónicos comienzan con “test@”.
SELECT * FROM users WHERE email NOT LIKE 'test@%';
Si deseas excluir múltiples patrones al mismo tiempo, conecta las condiciones con AND.
SELECT * FROM users
WHERE email NOT LIKE 'test@%'
  AND email NOT LIKE 'sample@%';
Consejos cuando la lista es grande
Si enumeras directamente muchos valores (cientos a miles de elementos) en NOT IN, la legibilidad y el rendimiento de SQL disminuirán.
 En este caso, la clave es usar tablas temporales o subconsultas para mejorar la legibilidad y mantenibilidad.
-- Example: Saving the exclusion list in the blacklist table
SELECT * FROM users
WHERE id NOT IN (SELECT user_id FROM blacklist WHERE user_id IS NOT NULL);
Exclusión combinada con funciones agregadas
Las subconsultas para resultados de agregación también pueden usar eficazmente NOT IN al excluir datos bajo condiciones específicas.
Ejemplo: Extraer clientes que no han realizado pedidos este mes
SELECT * FROM customers
WHERE id NOT IN (
  SELECT customer_id FROM orders
  WHERE order_date >= '2025-06-01'
    AND order_date < '2025-07-01'
);
Ejemplo de usar JOIN en lugar de subconsulta
En algunos casos, puedes lograr el mismo resultado con LEFT JOIN + IS NULL.
 Considerando el rendimiento y la legibilidad, elige el método óptimo.
SELECT u.*
FROM users u
LEFT JOIN blacklist b ON u.id = b.user_id
WHERE b.user_id IS NULL;
Este método se recomienda especialmente cuando te preocupa el rendimiento de las subconsultas o cuando los índices funcionan eficazmente.Resumen de Puntos
- NOT EXISTS o JOIN es conveniente para excluir múltiples columnas
 - Combina con NOT LIKE para exclusión por coincidencia parcial
 - Gestionar listas con subconsultas o tablas temporales facilita las operaciones
 - JOIN + IS NULL también puede mejorar el rendimiento
 
7. Preguntas Frecuentes (FAQ)
Esta sección resume preguntas comunes y problemas relacionados con la cláusula NOT IN de MySQL que suelen surgir en la práctica. Centrándose en consultas que se buscan con frecuencia, ofrece respuestas simples y prácticas.Q1. ¿Cuál es la diferencia entre NOT IN e IN?A. IN recupera datos que coinciden con cualquier elemento de la lista especificada, mientras que NOT IN se utiliza para recuperar solo los datos que no coinciden con ningún elemento de la lista especificada. El uso es casi el mismo, pero elige NOT IN cuando quieras aplicar condiciones de exclusión.Q2. ¿Qué sucede si hay un valor NULL en NOT IN?A.
 Si se mezcla un NULL en la lista o subconsulta, NOT IN puede no devolver filas o producir resultados inesperados. Es seguro excluir siempre los NULL usando «IS NOT NULL» o similar antes de usarlo.Q3. ¿Cómo elegir entre NOT IN y NOT EXISTS?A.
- Cuando existe la posibilidad de valores NULL o se utilizan subconsultas, 
NOT EXISTSes más fiable. - Para listas fijas o exclusiones de valores simples, 
NOT INfunciona bien. - Dependiendo del plan de ejecución o del volumen de datos, el rendimiento puede variar, así que elija según la situación.
 
Q4. A veces usar NOT IN hace que la consulta sea lenta. ¿Cuáles son las contramedidas?A.
- Establecer un índice en la columna que se excluye.
 - Reducir el número de filas en la subconsulta o organizar los datos en una tabla temporal de antemano.
 - En algunos casos, considere reescribir a 
NOT EXISTSoLEFT JOIN ... IS NULL. - Es eficaz usar EXPLAIN para comprobar el plan de ejecución e identificar cuellos de botella.
 
Q5. ¿Qué pasa si quiero excluir en función de varias columnas?A. Dado que NOT IN está dedicado a columnas individuales, para excluir en función de dos o más columnas en combinación, use NOT EXISTS o LEFT JOIN. Implemente el proceso de exclusión combinando condiciones para múltiples columnas dentro de la subconsulta.
Q6. Si el resultado de la subconsulta es grande, ¿en qué aspectos debo tener cuidado?A.
 Si el número de resultados en la subconsulta es grande, NOT IN tiende a degradar el rendimiento. Se recomienda planificar con estrategias como utilizar índices, dividir en tablas temporales y mantener la subconsulta lo más pequeña posible.
Q7. Si no consigo los resultados esperados sin importar qué, ¿qué debo revisar?A.
- Verificar si hay valores NULL mezclados.
 - Ejecutar la subconsulta individualmente para verificar si los resultados son los esperados.
 - Revisar errores en las condiciones WHERE o en las conexiones JOIN.
 - El comportamiento puede variar según la versión o configuración de la base de datos, así que consulte también la documentación oficial.
 
8. Resumen
La cláusula NOT IN en MySQL es una sintaxis muy útil para extraer datos de manera eficiente que no cumplen condiciones específicas. Se puede usar en diversos escenarios, desde exclusiones basadas en listas simples hasta extracción de datos flexible combinada con subconsultas.
Por otro lado, la cláusula NOT IN tiene aspectos a tener en cuenta en la práctica, como «precauciones cuando se incluyen valores NULL» y «degradación del rendimiento con datos a gran escala». En particular, la exclusión inesperada de todos los registros debido a la inclusión de NULL, o la ralentización cuando el número de subconsultas es grande, requieren atención no solo de principiantes en SQL sino también de usuarios experimentados.
Además, al comprender las alternativas a NOT IN, como NOT EXISTS y LEFT JOIN ... IS NULL, puede escribir SQL más seguro y eficiente.
 Seleccione el método óptimo según el propósito y la escala de datos.
Revisión de Puntos Clave
NOT INes eficaz para condiciones de exclusión simples.- Siempre tenga cuidado con el impacto de los valores NULL (hábitos de usar IS NOT NULL en combinación).
 - Si el rendimiento es una preocupación, considere el diseño de índices, NOT EXISTS y JOIN como opciones.
 - Siempre verifique la efectividad con el plan de ejecución (EXPLAIN).
 
Al evitar los «peligros» de SQL, utilice el contenido de este artículo en su trabajo diario y aprendizaje para permitir una extracción de datos inteligente.

 
