0Pricing
SQL Interview Prep · Lección

BETWEEN, IN y límites inclusivos

Analice los casos límite y cómo BETWEEN trata los extremos

BETWEEN, IN y límites inclusivos es una lección gratuita de SQL Interview Prep en CoddyKit. Esta es la lección 2 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de SQL Interview Prep, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de SQL Interview Prep incluye 4 lecciones en total.

Por qué los límites hacen perder puntos a los candidatos

Los filtros de rangos y conjuntos parecen triviales, por eso los entrevistadores convierten los casos límite en trampas. BETWEEN incluye ambos extremos, IN oculta una trampa sutil con NULL y los rangos de fechas son el lugar donde los errores de uno en uno corrompen informes silenciosamente.

Esta lección explica exactamente cómo trata BETWEEN sus extremos, cuándo es más claro usar IN que una cadena de OR y cuál es el patrón de intervalo semiabierto que utilizan los profesionales para las fechas.

BETWEEN incluye ambos extremos

col BETWEEN a AND b es una forma abreviada de col >= a AND col <= b. Ambos extremos están incluidos.

Por tanto, price BETWEEN 10 AND 20 devuelve las filas cuyo precio es exactamente 10 o exactamente 20, además de todas las que están entre ambos valores. La respuesta incorrecta más habitual en las entrevistas es afirmar que el límite superior queda excluido.

SELECT *
FROM products
WHERE price BETWEEN 10 AND 20;
-- equivalent to: price >= 10 AND price <= 20

El orden de los argumentos importa

BETWEEN exige primero el valor inferior. col BETWEEN 20 AND 10 se expande a col >= 20 AND col <= 10, lo que nunca puede ser verdadero, así que devuelve cero filas en lugar de producir un error.

Esta es una trampa muy habitual: la consulta se ejecuta correctamente, no devuelve nada y el candidato supone que la tabla está vacía. Coloque siempre primero el límite menor.

SELECT *
FROM products
WHERE price BETWEEN 20 AND 10;
-- returns NOTHING, not an error

El error de uno en los rangos de fechas

Si le piden todo enero, muchos candidatos escriben order_date BETWEEN '2024-01-01' AND '2024-01-31'. Si order_date es una marca de tiempo, esto omite todo lo posterior a la medianoche del día 31, porque 2024-01-31 significa 2024-01-31 00:00:00.

Un pedido realizado a las 14:00 del 31 de enero queda excluido. Con columnas de tipo DATE funciona, pero no puede dar por supuesto el tipo.

SELECT *
FROM orders
WHERE order_date BETWEEN '2024-01-01' AND '2024-01-31';
-- silently excludes Jan 31 afternoon if order_date is a timestamp

La solución del intervalo semiabierto

El patrón profesional para las fechas es un intervalo semiabierto: mayor o igual que el inicio y estrictamente menor que el siguiente periodo. Es correcto tanto para DATE como para TIMESTAMP y no requiere conocer la resolución temporal de la columna.

Observe que el límite superior es el primer día de febrero, no el último día de enero. Así se captura cada instante de enero.

SELECT *
FROM orders
WHERE order_date >= '2024-01-01'
  AND order_date <  '2024-02-01';

NOT BETWEEN

col NOT BETWEEN a AND b se expande a col < a OR col > b. Excluye ambos extremos y todo lo que queda entre ellos.

Preste atención: si col es NULL, NOT BETWEEN se evalúa como UNKNOWN, por lo que las filas con NULL se excluyen, igual que con un BETWEEN normal. Los valores NULL nunca satisfacen una comprobación de rango en ninguna de las dos direcciones.

SELECT *
FROM products
WHERE price NOT BETWEEN 10 AND 20;
-- price < 10 OR price > 20

IN como pertenencia a un conjunto

col IN (a, b, c) es una forma abreviada de col = a OR col = b OR col = c. Es la forma clara de comprobar la pertenencia a un conjunto pequeño y fijo.

Se lee mejor que una cadena de OR y evita por completo el problema de poner paréntesis según la precedencia, ya que toda la comprobación del conjunto constituye un solo predicado.

SELECT *
FROM orders
WHERE status IN ('pending', 'shipped', 'delivered');

La trampa de NOT IN con NULL

Esta es la pregunta sobre IN que más temor provoca. Si la lista (o subconsulta) en la que se basa NOT IN contiene un solo NULL, todo el predicado puede evaluarse como UNKNOWN y devolver cero filas.

El motivo es el siguiente: x NOT IN (1, NULL) se convierte en x <> 1 AND x <> NULL, y x <> NULL nunca es verdadero, sino UNKNOWN. Por tanto, todo el AND nunca puede ser verdadero.

SELECT *
FROM employees
WHERE manager_id NOT IN (SELECT id FROM managers);
-- returns NOTHING if any managers.id is NULL

Cómo corregir NOT IN

Hay dos soluciones sólidas para la trampa de NULL con NOT IN:

  • Filtre los NULL de la subconsulta con WHERE id IS NOT NULL
  • Mejor aún, reescríbalo como NOT EXISTS, que gestiona correctamente los NULL por diseño

Los entrevistadores consideran que NOT EXISTS es la respuesta de un perfil senior porque evita por completo la trampa y a menudo produce un plan mejor.

SELECT e.*
FROM employees e
WHERE NOT EXISTS (
  SELECT 1 FROM managers m WHERE m.id = e.manager_id
);

IN con una subconsulta

IN acepta una subconsulta que devuelve una columna. WHERE customer_id IN (SELECT customer_id FROM vip) conserva las filas cuyo cliente pertenece al conjunto VIP.

El IN normal, a diferencia de NOT IN, es seguro cuando hay NULL en la subconsulta: un NULL en la lista simplemente nunca coincide, pero no invalida las filas que sí coinciden. La trampa es específica de NOT IN.

SELECT *
FROM orders
WHERE customer_id IN (SELECT customer_id FROM vip_customers);

IN de varias columnas con constructores de filas

Una pregunta de seguimiento habitual es: ¿cómo se comparan más de una columna a la vez? Pase una tupla a IN mediante un constructor de filas: este compara las columnas por posición y es mucho más claro que encadenar OR (a = .. AND b = ..).

  • Se lee con claridad y se adapta a listas de valores permitidos largas.
  • Cada tupla debe enumerar las columnas en el mismo orden.
SELECT *
FROM orders
WHERE (customer_id, status) IN ((101, 'paid'), (102, 'shipped'));

Comprobación rápida

Recuerde cómo trata BETWEEN sus extremos.

Resumen

Ideas clave:

  • BETWEEN a AND b incluye ambos extremos; el límite inferior debe aparecer primero o se obtienen cero filas
  • Para rangos de marcas de tiempo, use un intervalo semiabierto: >= start AND < next_period
  • IN expresa claramente la pertenencia a un conjunto y es seguro con NULL
  • NOT IN con cualquier NULL en la lista no devuelve nada; reescríbalo como NOT EXISTS

El tema recurrente es que un filtro puede ejecutarse perfectamente y aun así devolver silenciosamente las filas equivocadas.

Preguntas frecuentes

¿La lección «BETWEEN, IN y límites inclusivos» es gratis?

Sí — el texto completo de «BETWEEN, IN y límites inclusivos» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de SQL Interview Prep, actualiza a CoddyKit PRO. El curso de SQL Interview Prep incluye 4 lecciones en total.

¿Qué aprenderé en «BETWEEN, IN y límites inclusivos»?

Analice los casos límite y cómo BETWEEN trata los extremos Practicas SQL Interview Prep con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar SQL Interview Prep?

No se requiere experiencia previa. SQL Interview Prep en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 2 de 4.

¿Cuánto tiempo toma la lección «BETWEEN, IN y límites inclusivos»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de SQL Interview Prep?

Sí. Cada lección de SQL Interview Prep incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Precedencia y uso de paréntesis en AND/OR
  2. BETWEEN, IN y límites inclusivos
  3. LIKE, comodines y escape
  4. Filtrar por valores calculados
← Volver a SQL Interview Prep