Aprende leyendo en orden

WHERE en profundidad ② — BETWEEN y LIKE para filtrado por rango y patrón

El segundo artículo de WHERE en profundidad. Cubre rangos con BETWEEN, NOT BETWEEN y coincidencias por prefijo / sufijo / contenido con LIKE — combinado con ORDER BY / LIMIT, todo ejecutándose sobre un dataset staff cargado desde CSV.

Datos que usaremos — la tabla staff

El segundo artículo de WHERE en profundidad cubre filtrado por rango (BETWEEN) y coincidencia por patrón (LIKE). Combinando las condiciones compuestas con AND / OR / NOT que viste en el artículo anterior con BETWEEN / LIKE de este artículo, podrás expresar la mayoría de los filtros de WHERE del día a día con una sola sentencia.

Antes de los ejercicios, confirma las definiciones de columnas de la tabla staff y una muestra de los datos.

① Ejecuta PRAGMA table_info(staff); para comprobar nombres de columnas, tipos y claves primarias.

② Ejecuta SELECT * FROM staff LIMIT 5; para previsualizar las primeras 5 filas.

Editor SQL

Ejecutar una consulta para ver el resultado

BETWEEN — filtrar por rango de valores

Cuando quieres comprobar si un valor cae dentro de un rango — "salary entre 5.000.000 y 6.000.000", "birthday entre abril de 2020 y marzo de 2025" — BETWEEN es el operador.

Escribir column BETWEEN value1 AND value2 devuelve filas donde la columna es al menos value1 y como mucho value2. Ten en cuenta que ambos extremos están incluidos. Significa lo mismo que column >= value1 AND column <= value2; la gente suele elegir BETWEEN solo por legibilidad.

Añadir NOT BETWEEN devuelve las filas fuera del rango (menores que value1 o mayores que value2).

-- Staff con salary entre 5.000.000 y 6.000.000 (extremos incluidos)
SELECT name, salary FROM staff
WHERE salary BETWEEN 5000000 AND 6000000;

-- Mismo significado, escrito con >= y <= unidos por AND
SELECT name, salary FROM staff
WHERE salary >= 5000000 AND salary <= 6000000;

-- Fuera del rango (menos de 5.000.000 O más de 6.000.000)
SELECT name, salary FROM staff
WHERE salary NOT BETWEEN 5000000 AND 6000000;
Rango BETWEEN (extremos incluidos)
Rango BETWEEN (extremos incluidos)salary3.800.0004.500.000(extremo)5.500.0006.000.000(extremo)BETWEEN4500000–6000000FALSETRUE(extremo incluido)TRUETRUE(extremo incluido)NOT BETWEEN4500000–6000000TRUEFALSEFALSEFALSE
BETWEEN 4500000 AND 6000000 es un intervalo cerrado que incluye 4.500.000 y 6.000.000. NOT BETWEEN devuelve el exterior. La línea punteada que une los extremos representa la anchura del rango.

BETWEEN incluye ambos extremos

BETWEEN 5000000 AND 6000000 incluye exactamente 5.000.000 y exactamente 6.000.000. Si quieres excluir los extremos, escribe > 5000000 AND < 6000000.

Con fechas, puedes escribir BETWEEN '2020-04-01' AND '2025-03-31' — los literales se comparan como cadenas. Para incluir "todo marzo de 2025", definir ambos extremos con la fecha real de fin de mes es el enfoque seguro. BETWEEN '2020-04-01' AND '2025-04-01' también incluiría `2025-04-01`, lo que normalmente no es lo que quieres.

Imagina que una reunión de dirección necesita el conteo de "empleados de tramo medio (salary 5.000.000 – 6.000.000)". (Una vez lo ejecutes correctamente, aparecerá la explicación.)

① De staff, saca las columnas name y salary.

② Filtra a las filas donde `salary` sea al menos 5.000.000 y como mucho 6.000.000 (extremos incluidos).

③ Confirma que el resultado son 3 filas (Bob 5.200.000 / Grace 5.500.000 / Jack 5.900.000).

Editor SQL

Ejecutar una consulta para ver el resultado

Imagina una petición para "ver el staff fuera del tramo medio (4.500.000 – 6.000.000), ordenado por mayor salary primero".

① De staff, saca las columnas name y salary.

② Filtra a las filas donde `salary` esté fuera del rango 4.500.000 – 6.000.000 (es decir, menor que 4.500.000 o mayor que 6.000.000).

③ Ordena por `salary` descendente.

④ Confirma que el resultado son 6 filas, empezando por Frank 7.200.000 y terminando por Emi 3.800.000.

Editor SQL

Ejecutar una consulta para ver el resultado

LIKE — filtrar por coincidencia de patrón

Cuando quieres filtrar por un patrón de cadena — "nombres que terminan en Tanaka", "emails que contienen @example.com" — LIKE es el operador. Escribe column LIKE 'pattern'. Dentro del patrón puedes usar los dos comodines siguientes.

ComodínSignificado
%Coincide con cualquier cadena de cero o más caracteres ("cualquier cosa de cualquier longitud")
_Coincide con exactamente un carácter ("cualquier carácter individual en esta posición")

'A%' es empieza por A, '%a' es termina en a, '%a%' es contiene a, 'A___%' es empieza por A y tiene al menos tres caracteres más — combínalos como necesites. Añadir NOT LIKE devuelve filas que no coinciden con el patrón.

-- 1) Coincidencia por prefijo: name empieza por A
SELECT name FROM staff WHERE name LIKE 'A%';

-- 2) Coincidencia por sufijo: apellido Tanaka
SELECT name FROM staff WHERE name LIKE '%Tanaka';

-- 3) Contiene: name contiene 'a' en cualquier posición
SELECT name FROM staff WHERE name LIKE '%a%';

-- 4) Un solo carácter: el 2º carácter es 'a', el resto cualquier cosa
SELECT name FROM staff WHERE name LIKE '_a%';

-- 5) Negación: no termina en Tanaka
SELECT name FROM staff WHERE name NOT LIKE '%Tanaka';
Comodines de LIKE (% y _)
PatrónEjemplos de coincidenciaSignificado'A%'prefijoAlice / Adam /Appleempieza por A'%Tanaka'sufijoAlice Tanaka /Frank Tanakatermina en Tanaka'%a%'contieneAlice / David /Frank / Carolcontiene a'_a%'_ + %Carol / Dave /Jackel 2º carácter es a
% significa "cualquier longitud de cualquier cosa"; _ significa "exactamente un carácter". Combinar sus posiciones expresa prefijo / sufijo / contenido en tres patrones. Las líneas punteadas conectan cada patrón con sus ejemplos de coincidencia y una descripción en lenguaje natural.

LIKE y `=` siguen reglas distintas de sensibilidad a mayúsculas

En la consola de este curso (SQLite), dentro de ASCII, LIKE no distingue mayúsculas de minúsculas. name LIKE '%a%' y name LIKE '%A%' devuelven las mismas filas. Para hacerlo sensible a mayúsculas, ejecuta PRAGMA case_sensitive_like = 1; o normaliza ambos lados con LOWER(...).

Mientras tanto, la comparación de cadenas con `=` (cubierta en el artículo de SELECT) sí distingue mayúsculas de minúsculas — cuidado con la diferencia de comportamiento entre = y LIKE.

Buscar `%` o `_` literales — la cláusula `ESCAPE`

Si la cadena que buscas contiene un literal % o _ (por ejemplo, un código de producto como 'A_001'), por defecto el _ se interpretará como comodín. La cláusula ESCAPE te permite especificar un carácter de escape, tras el cual % / _ se tratan como caracteres literales.

Ejemplo: WHERE code LIKE 'A\_001' ESCAPE '\'; (declara \ como carácter de escape, así que \_ se trata como guion bajo literal). El carácter de escape no tiene que ser \ESCAPE '#' hace que # sea el escape, ESCAPE '!' lo hace !, etc. Recurrirás a esto al buscar columnas de código que contengan _ o %.

Ejecuta los tres patrones — prefijo, sufijo, contiene-vía-_ — en una sola consola y compara los resultados.

① Para cada consulta, saca name, city y salary de staff.

② Saca filas donde `name` empiece por `A` (coincidencia por prefijo 'A%').

③ Después saca filas donde `name` termine en `Tanaka` (coincidencia por sufijo '%Tanaka').

④ Después saca filas donde el 2º carácter de `name` sea `a` ('_a%', donde _ es cualquier carácter individual).

⑤ Confirma que los conteos de filas son 1 / 4 / 3.

Editor SQL

Ejecutar una consulta para ver el resultado

Combinar WHERE, ORDER BY y LIMIT

Las consultas del mundo real suelen combinar filtrado (WHERE) → ordenación (ORDER BY) → límite de filas (LIMIT) en ese orden exacto. El orden de cláusulas es fijo, e intercambiarlas es un error de sintaxis.

Orden de cláusulas (de izquierda a derecha)
SELECTcolsFROMtableWHEREcond.ORDER BYcolLIMITNOFFSETM
Escribe SELECT cols → FROM table → WHERE condition → ORDER BY col → LIMIT N OFFSET M, en ese orden.

El orden de ejecución del DB es aproximadamente FROM → WHERE → SELECT → ORDER BY → LIMIT — primero acota filas, elige las columnas que necesitas, ordénalas, luego corta la cantidad que quieres.

Flujo de ejecución de WHERE → ORDER BY → LIMIT
1) WHEREname LIKE '%a%'→ filtra a las filas que coinciden (9)2) ORDER BYsalary DESC→ ordena por mayor salary3) LIMITLIMIT 3→ toma las 3 primeras filasResultadoFrank 7.200.000David 6.800.000Henry 6.100.000
WHERE acota filas, ORDER BY ordena, LIMIT corta las primeras N. Tanto el orden de escritura como el orden de ejecución se alinean así — memorízalo una vez y no te confundirás.

Imagina un dashboard que muestra un ranking de salary para "staff con a en su nombre".

① De staff, saca las columnas name y salary.

② Filtra a las filas donde `name` contenga `a` (coincidencia por contenido).

③ Ordena por `salary` descendente y toma solo las 3 primeras filas.

④ Confirma que el resultado son 3 filas: Frank Tanaka 7.200.000 / David Sato 6.800.000 / Henry Sato 6.100.000.

Editor SQL

Ejecutar una consulta para ver el resultado
QUIZ

Verificación de conocimientos

Responde cada pregunta una a una.

Pregunta 1¿Cuál describe correctamente SELECT * FROM staff WHERE salary BETWEEN 5000000 AND 6000000;?

Pregunta 2¿Qué nombre coincide con el patrón name LIKE '%Tanaka'?

Pregunta 3¿Cuál de las siguientes consultas tiene las cláusulas en el orden correcto?