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 Coding 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 Coding Interview Prep, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Coding 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 <= 20El 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 errorEl 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 timestampLa 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 > 20IN 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 NULLCó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 bincluye 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 INexpresa claramente la pertenencia a un conjunto y es seguro con NULLNOT INcon cualquierNULLen la lista no devuelve nada; reescríbalo comoNOT 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 Coding Interview Prep, actualiza a CoddyKit PRO. El curso de Coding 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 Coding 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 Coding Interview Prep?
No se requiere experiencia previa. Coding 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 Coding Interview Prep?
Sí. Cada lección de Coding 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
- Precedencia y uso de paréntesis en AND/OR
- BETWEEN, IN y límites inclusivos
- LIKE, comodines y escape
- Filtrar por valores calculados