BETWEEN VS IN VS NOT IN EN MYSQL Y MARIADB

Filtrar información es una de las tareas más frecuentes cuando se trabaja con bases de datos. MySQL y MariaDB ofrecen varias formas de hacerlo de manera eficiente. Tres de las más utilizadas son los operadores "BETWEEN", "IN" y "NOT IN". Aunque parecen simples, cada uno tiene un propósito claro y un comportamiento que conviene dominar, especialmente el de "NOT IN" con valores "NULL".

BETWEEN – Filtrar un rango de valores

El operador "BETWEEN" permite seleccionar registros cuyos valores se encuentran dentro de un rango, incluyendo ambos extremos.

Sintaxis

WHERE columna BETWEEN valor1 AND valor2

Ejemplo práctico

SELECT *
FROM pedidos
WHERE fecha BETWEEN '2024-01-01' AND '2024-01-31';
Este filtro devuelve todos los pedidos realizados entre el 1 y el 31 de enero de 2024 (ambos días incluidos).Cuándo usarlo: Ideal para rangos de fechas, números o cualquier dato ordenable. Es más legible que escribir ">= valor1 AND <= valor2".

IN – Filtrar si el valor está dentro de una lista

El operador "IN" comprueba si el valor de una columna coincide con cualquiera de los valores de una lista específica.

Sintaxis

WHERE columna IN (valor1, valor2, valor3, ...)

Ejemplo práctico

SELECT *
FROM productos
WHERE categoria IN ('Electrónica', 'Hogar', 'Deportes');
Devuelve solo los productos cuya categoría sea exactamente una de las tres indicadas.

Cuándo usarlo

Perfecto cuando tienes una lista fija y conocida de valores. Es más limpio y legible que escribir múltiples condiciones con "OR".

NOT IN – Filtrar si el valor NO está en la lista

El operador "NOT IN" es el contrario de "IN": devuelve los registros cuyo valor no se encuentra en la lista proporcionada.

Sintaxis

WHERE columna NOT IN (valor1, valor2, ...)

Ejemplo práctico

SELECT *
FROM productos
WHERE categoria NOT IN ('Descontinuado');
Muestra todos los productos excepto los que tienen la categoría “Descontinuado”.

Cuidado con la trampa clásica de NOT IN y NULL

Esta es la trampa más común y peligrosa: Si la lista de "NOT IN" contiene aunque sea un solo valor "NULL", la consulta completa devuelve 0 filas.

Ejemplo problemático

SELECT *
FROM productos
WHERE categoria NOT IN ('Descontinuado', NULL);
-- Resultado: 0 filas (¡siempre!)

¿Por qué ocurre esto?

En SQL, cualquier comparación con "NULL", como "= NULL", "<> NULL", etc.) devuelve "NULL", desconocido, no verdadero ni falso. Por lo tanto, "NOT IN" con un "NULL" en la lista hace que la condición nunca se evalúe como verdadera.

Soluciones recomendadas en MySQL/MariaDB:

  • Asegurarse de que la lista no contenga "NULL":

    WHERE categoria NOT IN ('Descontinuado')
      AND categoria IS NOT NULL;
    
  • Usar"NOT EXISTS" o un "LEFT JOIN" cuando se trabaje con subconsultas que puedan devolver "NULL".
  • Filtrar los "NULL" de la subconsulta:

    WHERE categoria NOT IN (
        SELECT categoria 
        FROM otra_tabla 
        WHERE categoria IS NOT NULL
    );
    

¿Cuál usar?

Situación Operador recomendado Consejo extra
¿Filtras un rango de fechas o números? "BETWEEN" Incluye ambos extremos
¿Filtras contra una lista fija de valores conocidos? "IN" Más legible que múltiples "OR"
¿Excluyes valores? "NOT IN" Revisa siempre que la lista no contenga "NULL"