Curso de MySQL

Operadores relacionales en SQL: filtrar con precisión

Por Víctor Peña · Publicado el

Operadores relacionales SQL

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:

  1. Citas atendidas con costo entre 200 y 280.
  2. Pacientes cuyo apellido contenga «or».
  3. Doctores que no sean de pediatría ni de cardiología.
  4. Citas programadas de pacientes sin teléfono registrado.
  5. 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 AND y OR sin paréntesis.
  • = NULL en lugar de IS NULL.
  • BETWEEN con DATETIME y perder el último día.
  • NOT IN con 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.

Solicitar cotizaciónVer todos los servicios

Cotización sin costo · Respuesta directa por WhatsApp