🎯 Quedan pocos días este mes Apoya SQLTest.online y ayúdanos a mantener la práctica de SQL gratuita para todos. Dona hoy →
Código SQL copiado al portapapeles

Combinar varias condiciones en WHERE

Lección 2.3 · Tiempo de lectura: ~7 min · Tareas de práctica ↓

En esta lección de SQL verás cómo combinar varias condiciones en una cláusula WHERE con los operadores lógicos AND, OR y NOT. Aprenderás a crear filtros avanzados que unen varias expresiones para obtener exactamente el subconjunto de datos que necesitas. También veremos la precedencia de los operadores y por qué los paréntesis son importantes para controlar el orden de evaluación y obtener resultados correctos.

Combinar varios criterios en SQL

En la lección anterior aprendimos a usar la cláusula WHERE con operadores de comparación sencillos. Sin embargo, el análisis de datos real suele exigir filtrar por varios criterios a la vez. Para ello usamos los operadores lógicos AND, OR y NOT.

Operadores lógicos SQL AND, OR y NOT: AND se evalúa antes que OR, por eso (rating = 'G' OR rating = 'PG') AND length < 60 devuelve 43 películas y la misma condición sin paréntesis devuelve 200

Operadores lógicos en SQL

Los operadores lógicos permiten unir varias expresiones en una cláusula WHERE para crear filtros más elaborados.

El operador AND

El operador AND devuelve filas solo si todas las condiciones separadas por AND son verdaderas. Sirve para acotar los resultados.

Ejemplo (base de datos Sakila) Supongamos que queremos encontrar las películas con clasificación 'G' y que además duren menos de 80 minutos:

SELECT title, length, rating
FROM film
WHERE length < 80 AND rating = 'G';

Resultado: solo las películas que cumplen las dos condiciones a la vez.

El operador OR

El operador OR devuelve filas si alguna de las condiciones separadas por OR es verdadera. Sirve para ampliar los resultados.

Ejemplo (base de datos Sakila) Para encontrar los actores que se llaman 'NICK' o 'ED':

SELECT first_name, last_name
FROM actor
WHERE first_name = 'NICK' OR first_name = 'ED';

Resultado: las filas en las que el nombre del actor coincide con al menos uno de los valores.

El operador NOT

El operador NOT devuelve una fila cuando la condición no es verdadera. En la práctica se usa a menudo con IN y LIKE cuando hay que excluir una lista de valores o un patrón de texto.

Ejemplo 1: excluir una clasificación

Para encontrar todas las películas excepto las de clasificación 'R':

SELECT title, rating
FROM film
WHERE NOT rating = 'R';

Resultado: todas las películas cuya clasificación no es 'R'.

Ejemplo 2: usar NOT IN para excluir varios valores

Si quieres excluir varias clasificaciones a la vez, NOT IN es más cómodo:

SELECT title, rating
FROM film
WHERE rating NOT IN ('R', 'NC-17');

Resultado: las películas cuya clasificación no está en la lista 'R' y 'NC-17'.

Ejemplo 3: usar NOT LIKE para negar un patrón

Si quieres excluir los títulos que empiezan por la letra A:

SELECT title
FROM film
WHERE title NOT LIKE 'A%';

Resultado: las películas cuyo título no empieza por A.

El operador XOR (o exclusivo, poco usado)

El operador XOR devuelve verdadero solo cuando exactamente una de las dos condiciones es verdadera. En la práctica se usa poco, porque no todos los dialectos de SQL lo admiten y puede hacer la consulta menos legible.

Ejemplo (base de datos Sakila) Para encontrar las películas en las que solo se cumple una condición: o duran menos de 60 minutos o tienen clasificación 'G', pero no las dos:

SELECT title, length, rating
FROM film
WHERE length < 60 XOR rating = 'G';

Para que la consulta funcione en distintas bases de datos, la misma lógica suele escribirse con AND/OR/NOT.


Precedencia de operadores

Cuando combinas varios operadores en una misma consulta (por ejemplo, AND y OR), SQL sigue un orden concreto de evaluación (precedencia).

  1. NOT se evalúa primero.
  2. AND se evalúa en segundo lugar.
  3. XOR (si tu dialecto de SQL lo admite) suele evaluarse después de AND.
  4. OR se evalúa al final.

La importancia de los paréntesis: Igual que en matemáticas, usa paréntesis () para controlar el orden de evaluación y hacer las consultas más legibles. Sin ellos, SQL aplica en silencio su precedencia por defecto, y el resultado puede no ser el que esperabas.


Películas 'G' y 'PG' de menos de 60 minutos

Consulta con error: faltan los paréntesis

-- BUG: AND binds tighter than OR, so this is evaluated as:
-- rating = 'G'  OR  (rating = 'PG' AND length < 60)
-- Result: ALL 'G' films (any length) + only SHORT 'PG' films
SELECT title, length, rating
FROM film
WHERE rating = 'G' OR rating = 'PG' AND length < 60;

Por qué está mal: la condición AND se evalúa primero, así que el filtro length < 60 solo se aplica a las películas 'PG', mientras que todas las películas 'G', duren lo que duren, pasan el filtro.

Consulta corregida: los paréntesis dejan clara la intención

-- CORRECT: parentheses force OR to be evaluated first
-- Result: only films rated 'G' OR 'PG' AND shorter than 60 minutes
SELECT title, length, rating
FROM film
WHERE (rating = 'G' OR rating = 'PG') AND length < 60;

Resultado: solo las películas con clasificación 'G' o 'PG' que duran menos de 60 minutos.


Excluir las películas 'R' y 'NC-17'

Consulta con error: NOT solo niega la primera condición

-- BUG: NOT applies only to the immediately following condition
-- Equivalent to: (NOT rating = 'R') AND rating = 'NC-17'
-- Result: films rated 'NC-17' that are also not rated 'R' - always empty
SELECT title, rating, length
FROM film
WHERE NOT rating = 'R' AND rating = 'NC-17';

Por qué está mal: NOT solo niega rating = 'R' y deja rating = 'NC-17' como filtro positivo. En la práctica, la consulta devuelve todas las películas 'NC-17': como 'NC-17' no es 'R', la condición con NOT siempre se cumple en esas filas. En lugar de excluir las películas NC-17, la consulta devuelve justo las que querías excluir.

Opción A: dos condiciones NOT explícitas

-- CORRECT: each condition is independently negated
SELECT title, rating, length
FROM film
WHERE NOT rating = 'R' AND NOT rating = 'NC-17';

Opción B: NOT con paréntesis (más concisa)

-- CORRECT: NOT applies to the whole OR group
SELECT title, rating, length
FROM film
WHERE NOT (rating = 'R' OR rating = 'NC-17');

Las dos opciones devuelven el mismo resultado. Al excluir varios valores se suele preferir la opción B, porque escala mejor cuando la lista crece.


Preguntas frecuentes

¿Cuándo usar AND en lugar de OR?

Usa AND cuando una fila debe cumplir todas las condiciones a la vez. Usa OR cuando basta con que cumpla una de varias condiciones. Si los dos operadores aparecen en la misma consulta, conviene usar paréntesis.

¿En qué se diferencia NOT IN de varias condiciones con AND?

NOT IN es una forma compacta de excluir varios valores de una misma columna. Es más fácil de leer y de ampliar que una larga cadena de comparaciones negadas unidas con AND.

¿Cuándo usar NOT LIKE?

Usa NOT LIKE cuando quieras excluir las filas que coinciden con un patrón de texto. Es útil para filtrar en negativo por prefijo, sufijo o subcadena.


Preguntas de entrevista

¿Cómo explicarías la precedencia de operadores en SQL en una entrevista?

En SQL, primero se evalúa NOT, después AND y, por último, OR. Cuando una consulta mezcla operadores, los paréntesis dejan explícita la lógica deseada y evitan resultados accidentales.

¿Cuándo usarías NOT IN en lugar de NOT =?

Usa NOT IN cuando necesites excluir varios valores de la misma columna. Es una opción más legible y escalable que repetir varias comparaciones con AND.

¿Cómo funciona NOT LIKE?

NOT LIKE devuelve las filas que no coinciden con el patrón indicado. Por ejemplo, title NOT LIKE 'A%' excluye todos los títulos que empiezan por A.

¿Por qué son importantes los paréntesis en cláusulas WHERE complejas?

Los paréntesis controlan el orden de evaluación y eliminan la ambigüedad entre AND y OR. Permiten escribir exactamente la lógica que querías, en lugar de depender de la precedencia por defecto.

Puntos clave de esta lección:

  • Usa AND para exigir que se cumplan todas las condiciones.
  • Usa OR para encontrar coincidencias con cualquiera de varias condiciones.
  • Usa NOT, NOT IN y NOT LIKE para excluir datos.
  • Usa XOR con cuidado: puede ser útil, pero no todos los dialectos de SQL lo admiten.
  • Usa siempre paréntesis () al mezclar AND y OR, para evitar errores de lógica y ganar claridad.

Intenta resolver las siguientes tareas para reforzar lo que aprendiste en esta lección.

  1. Clientes con Apellidos que Comienzan con "A"
  2. Encontrar clientes que comienzan con la letra "A" (2)
  3. Orden de ejecución de operadores lógicos
  4. Lista de Películas Restringidas
  5. Lista de Películas Restringidas