Curso de MySQL
Operadores relacionales en SQL: filtrar con precisión
Por Víctor Peña · Publicado el

Hola, ¿cómo están? Continuando con el curso de MySQL, hoy profundizamos en los operadores del WHERE. Es lo que convierte una consulta genérica en una que devuelve exactamente lo que necesitas.
¡Empecemos!
Operadores de comparación
| Operador | Significado |
|---|---|
= |
Igual |
<> o != |
Distinto |
> |
Mayor que |
< |
Menor que |
>= |
Mayor o igual |
<= |
Menor o igual |
SELECT * FROM citas WHERE costo > 200;
SELECT * FROM citas WHERE estado <> 'cancelada';
SELECT * FROM pacientes WHERE fecha_nacimiento <= '2000-12-31';
En SQL el operador de igualdad es un solo =, a diferencia de PHP donde comparar requiere == o ===. Aquí = compara; para asignar en un UPDATE también se usa =, y el contexto lo distingue.
Operadores lógicos
Combinan varias condiciones:
-- AND: se cumplen todas
SELECT * FROM citas
WHERE estado = 'programada' AND costo > 200;
-- OR: al menos una
SELECT * FROM citas
WHERE estado = 'programada' OR estado = 'atendida';
-- NOT: invierte
SELECT * FROM pacientes
WHERE NOT (telefono IS NULL);
El paréntesis no es opcional
Aquí está el error más frecuente de esta lección. AND se evalúa antes que OR:
-- Probablemente NO hace lo que esperas
SELECT * FROM citas
WHERE estado = 'programada' OR estado = 'atendida' AND costo > 250;
MySQL lo interpreta así:
WHERE estado = 'programada' OR (estado = 'atendida' AND costo > 250)
Es decir, devuelve todas las programadas sin importar el costo. Si querías filtrar por costo en ambos casos:
SELECT * FROM citas
WHERE (estado = 'programada' OR estado = 'atendida')
AND costo > 250;
Usa paréntesis siempre que mezcles AND con OR. No cuesta nada y evita resultados incorrectos que además son difíciles de detectar, porque la consulta no falla: simplemente devuelve algo distinto.
BETWEEN: rangos
SELECT * FROM citas
WHERE fecha BETWEEN '2026-04-01' AND '2026-04-30';
Equivale a fecha >= '2026-04-01' AND fecha <= '2026-04-30'. Incluye ambos extremos.
Funciona con números y fechas:
SELECT * FROM citas WHERE costo BETWEEN 200 AND 300;
SELECT * FROM citas WHERE costo NOT BETWEEN 200 AND 300;
Una trampa con DATETIME
Si la columna es DATETIME y escribes:
WHERE creado_en BETWEEN '2026-04-01' AND '2026-04-30'
MySQL interpreta la segunda fecha como 2026-04-30 00:00:00, así que pierdes todo el día 30. La forma correcta:
WHERE creado_en >= '2026-04-01' AND creado_en < '2026-05-01'
Es un error muy común en reportes mensuales, y difícil de notar porque el resultado parece razonable.
IN: lista de valores
SELECT * FROM citas
WHERE estado IN ('programada', 'atendida');
Mucho más limpio que encadenar OR. Y su negación:
SELECT * FROM doctores WHERE especialidad_id NOT IN (1, 3);
IN también acepta una subconsulta, algo que veremos más adelante:
SELECT * FROM citas
WHERE doctor_id IN (
SELECT id FROM doctores WHERE especialidad_id = 2
);
Cuidado con NOT IN y NULL
Si la lista contiene un NULL, NOT IN no devuelve ninguna fila:
SELECT * FROM citas WHERE doctor_id NOT IN (1, 2, NULL); -- vacío
La razón es la misma de siempre: nada se puede comparar con lo desconocido. Es una de las trampas más desconcertantes de SQL.
LIKE: buscar patrones en texto
SELECT * FROM pacientes WHERE apellido LIKE 'To%';
Los dos comodines:
| Comodín | Significa |
|---|---|
% |
Cualquier cantidad de caracteres, incluso ninguno |
_ |
Exactamente un carácter |
WHERE apellido LIKE 'To%' -- empieza con "To"
WHERE apellido LIKE '%ez' -- termina en "ez"
WHERE apellido LIKE '%orr%' -- contiene "orr"
WHERE cedula LIKE '1______' -- empieza con 1 y tiene 7 caracteres
El comodín al inicio mata el rendimiento
Este detalle importa mucho y lo retomaremos al hablar de índices:
WHERE apellido LIKE 'To%' -- rápido, puede usar el índice
WHERE apellido LIKE '%rr%' -- lento, recorre toda la tabla
Cuando el patrón empieza con %, MySQL no puede aprovechar el índice y tiene que revisar fila por fila. En tablas pequeñas no se nota; con un millón de registros, sí.
Para búsquedas de texto libre existe una herramienta específica, FULLTEXT, que veremos en la última lección del curso.
Mayúsculas y acentos
Con la collation utf8mb4_unicode_ci que configuramos al crear la base, LIKE no distingue mayúsculas:
WHERE nombre LIKE 'ana%' -- también encuentra "Ana"
Y en muchas configuraciones tampoco distingue acentos, lo que suele ser conveniente para buscar nombres.
IS NULL: el operador para lo desconocido
SELECT * FROM pacientes WHERE telefono IS NULL;
SELECT * FROM pacientes WHERE telefono IS NOT NULL;
Repito la regla porque es la que más errores causa: NULL no se compara con =. Ni siquiera consigo mismo.
SELECT NULL = NULL; -- devuelve NULL, no 1
SELECT NULL <=> NULL; -- devuelve 1
Ese <=> es el operador de igualdad segura para nulos. Se usa poco, pero existe para cuando lo necesites.
Combinar operadores
Una consulta realista suele mezclar varios:
SELECT
CONCAT(p.nombre, ' ', p.apellido) AS paciente,
c.fecha,
c.costo
FROM citas c
JOIN pacientes p ON c.paciente_id = p.id
WHERE c.fecha BETWEEN '2026-04-01' AND '2026-04-30'
AND c.estado IN ('programada', 'atendida')
AND c.costo >= 200
AND p.telefono IS NOT NULL
ORDER BY c.fecha, c.costo DESC;
Se lee casi como una frase: citas de abril, que estén programadas o atendidas, de al menos 200, de pacientes con teléfono registrado.
Operadores en el SELECT
También puedes usar operadores fuera del WHERE, para calcular:
SELECT
nombre,
costo,
costo * 0.13 AS impuesto,
costo * 1.13 AS total,
costo > 250 AS es_cara
FROM citas;
Esa última columna devuelve 1 o 0, porque MySQL representa los booleanos como enteros.
Ejercicios
Con los datos del sistema, resuelve:
- Citas atendidas con costo entre 200 y 280.
- Pacientes cuyo apellido contenga «or».
- Doctores que no sean de pediatría ni de cardiología.
- Citas programadas de pacientes sin teléfono registrado.
- Pacientes nacidos antes de 1990 o después de 2010.
Para la quinta, fíjate bien en dónde van los paréntesis.
Errores comunes
- Mezclar
ANDyORsin paréntesis. = NULLen lugar deIS NULL.BETWEENconDATETIMEy perder el último día.NOT INcon valores nulos en la lista.LIKE '%texto%'en tablas grandes sin considerar el costo.
Para cerrar
Los operadores son lo que hace útil al WHERE. Si te llevas tres cosas: paréntesis al mezclar AND y OR, IS NULL para lo desconocido, y cuidado con el comodín al inicio de un LIKE.
En la siguiente lección veremos los JOIN, que es donde el modelo relacional muestra para qué servía separar las tablas.
Saludos y éxitos.
Norvic Software
Desarrollamos el software que tu empresa necesita
Somos una fábrica de software en Bolivia. Construimos sistemas a medida y aplicaciones móviles, y llevamos Inteligencia Artificial a las empresas que ya tienen un sistema funcionando.
- Chatbots con Inteligencia Artificial
- Creación de agentes de IA
- Integración de IA en tus sistemas
- Desarrollo de software a medida
- Aplicaciones móviles iOS y Android
- Consultoría y asesoramiento técnico
Cotización sin costo · Respuesta directa por WhatsApp