Lesión 2.3 · Tiempo de lectura: ~7 min
Esta lección de SQL cubre cómo combinar múltiples condiciones en una cláusula WHERE utilizando operadores lógicos: AND, OR y NOT. Aprenderás a crear filtros avanzados de base de datos para recuperar subconjuntos de datos específicos conectando múltiples expresiones. La lección explica la precedencia de los operadores y la importancia de usar paréntesis para controlar el orden de evaluación y asegurar la precisión de la consulta. Domina técnicas complejas de filtrado de datos para mejorar tus habilidades de consulta SQL para un análisis y reporte de datos más efectivos.
Combinando Múltiples Condiciones en WHERE
Combinando Múltiples Criterios en SQL
En la lección anterior, aprendimos a usar la cláusula WHERE con operadores de comparación simples. Sin embargo, el análisis de datos en el mundo real a menudo requiere filtrar por múltiples criterios simultáneamente. Para hacer esto, usamos operadores lógicos: AND, OR y NOT.
Operadores Lógicos en SQL
Los operadores lógicos te permiten conectar múltiples expresiones en una cláusula WHERE para crear filtros más sofisticados.
El Operador AND
El operador AND devuelve filas solo si todas las condiciones separadas por AND son verdaderas. Se utiliza para reducir tus resultados.
Ejemplo (Base de Datos Sakila) Supongamos que queremos encontrar películas que estén clasificadas como 'G' y que duren menos de 80 minutos:
SELECT title, length, rating
FROM film
WHERE length < 80 AND rating = 'G';
Resultado: solo películas que coinciden con ambas condiciones al mismo tiempo.
El Operador OR
El operador OR devuelve filas si cualquiera de las condiciones separadas por OR es verdadera. Se utiliza para ampliar tus resultados.
Ejemplo (Base de Datos Sakila) Para encontrar actores con el nombre 'NICK' o 'ED':
SELECT first_name, last_name
FROM actor
WHERE first_name = 'NICK' OR first_name = 'ED';
Resultado: filas donde el nombre del actor coincide con al menos un valor.
El Operador NOT
El operador NOT devuelve una fila cuando la condición no es verdadera. En la práctica, a menudo se usa con IN y LIKE cuando necesitas excluir una lista de valores o un patrón de texto.
Ejemplo 1: excluir una clasificación
Para encontrar todas las películas excepto aquellas con una 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 múltiples valores
Si deseas excluir varias clasificaciones a la vez, NOT IN es más conveniente:
SELECT title, rating
FROM film
WHERE rating NOT IN ('R', 'NC-17');
Resultado: películas cuya clasificación no está incluida en la lista 'R' y 'NC-17'.
Ejemplo 3: usar NOT LIKE para negar un patrón
Si deseas excluir títulos que comienzan con la letra A:
SELECT title
FROM film
WHERE title NOT LIKE 'A%';
Resultado: películas cuyos títulos no comienzan con A.
El Operador XOR (O Exclusivo, Raramente Usado)
El operador XOR devuelve verdadero solo cuando exactamente una de las dos condiciones es verdadera. En la práctica, rara vez se usa porque no es compatible con todos los dialectos de SQL y puede reducir la legibilidad de la consulta.
Ejemplo (Base de Datos Sakila) Para encontrar películas donde solo una condición es verdadera: o la duración es menor a 60 minutos o la clasificación es 'G', pero no ambas:
SELECT title, length, rating
FROM film
WHERE length < 60 XOR rating = 'G';
Para la portabilidad entre diferentes bases de datos, la misma lógica generalmente se escribe con AND/OR/NOT.
Precedencia de Operadores
Cuando combinas múltiples operadores en una sola consulta (por ejemplo, usando tanto AND como OR), SQL sigue un orden específico de operaciones (precedencia).
NOTse evalúa primero.ANDse evalúa segundo.XOR(si es compatible con tu dialecto SQL) generalmente se evalúa después deAND.ORse evalúa por último.
El Poder de los Paréntesis:
Al igual que en matemáticas, debes usar paréntesis () para controlar el orden de evaluación y hacer que tus consultas sean más legibles. Sin ellos, SQL aplica silenciosamente su precedencia por defecto — y el resultado puede no ser lo que pretendías.
Encontrar películas 'G' y 'PG' que duren menos de 60 minutos
Consulta con errores — falta de paréntesis:
-- ERROR: AND se une más fuerte que OR, por lo que esto se evalúa como:
-- rating = 'G' OR (rating = 'PG' AND length < 60)
-- Resultado: TODAS las películas 'G' (cualquier duración) + solo las películas 'PG' CORTAS
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, por lo que el filtro length < 60 solo se aplica a las películas 'PG', mientras que todas las películas 'G' — independientemente de la duración — pasan.
Consulta corregida — los paréntesis hacen explícita la intención:
-- CORRECTO: los paréntesis obligan a que OR se evalúe primero
-- Resultado: solo películas clasificadas como 'G' O 'PG' Y que duren menos de 60 minutos
SELECT title, length, rating
FROM film
WHERE (rating = 'G' OR rating = 'PG') AND length < 60;
Resultado: solo películas clasificadas como 'G' o 'PG' que son más cortas de 60 minutos.
Excluir películas clasificadas como 'R' y 'NC-17'
Consulta con errores — NOT solo niega la primera condición:
-- ERROR: NOT se aplica solo a la condición inmediatamente siguiente
-- Equivalente a: (NOT rating = 'R') AND rating = 'NC-17'
-- Resultado: películas clasificadas como 'NC-17' que también no están clasificadas como 'R' — siempre vacío
SELECT title, rating, length
FROM film
WHERE NOT rating = 'R' AND rating = 'NC-17';
Por qué está mal: NOT solo niega rating = 'R', dejando rating = 'NC-17' como un filtro positivo. La consulta devuelve efectivamente todas las películas clasificadas como 'NC-17' — porque 'NC-17' no es 'R', la condición NOT siempre se satisface para esas filas. En lugar de excluir películas 'NC-17', la consulta devuelve exactamente las películas que querías excluir.
Opción A — dos condiciones NOT explícitas:
-- CORRECTO: cada condición se niega independientemente
SELECT title, rating, length
FROM film
WHERE NOT rating = 'R' AND NOT rating = 'NC-17';
Opción B — NOT con paréntesis (más conciso):
-- CORRECTO: NOT se aplica a todo el grupo OR
SELECT title, rating, length
FROM film
WHERE NOT (rating = 'R' OR rating = 'NC-17');
Ambas opciones devuelven el mismo resultado. La opción B se prefiere generalmente al excluir varios valores — se adapta mejor a medida que la lista crece.
Preguntas Frecuentes
¿Cuándo debo usar AND en lugar de OR?
Usa AND cuando una fila debe satisfacer todas las condiciones al mismo tiempo. Usa OR cuando coincidir con cualquiera de varias condiciones es suficiente. Si ambos operadores aparecen en la misma consulta, los paréntesis suelen ser una buena idea.
¿Cómo se diferencia NOT IN de múltiples condiciones AND?
NOT IN es una forma compacta de excluir varios valores de la misma columna. Es más fácil de leer y extender que una larga cadena de comparaciones negadas separadas unidas con AND.
¿Cuándo debo usar NOT LIKE?
Usa NOT LIKE cuando quieras excluir filas que coincidan con un patrón de texto. Es útil para filtrado negativo por prefijo, sufijo o subcadena.
Preguntas de Entrevista
¿Cómo explicarías la precedencia de operadores en SQL durante una entrevista?
En SQL, NOT se evalúa primero, luego AND, y finalmente OR. Cuando una consulta mezcla operadores, los paréntesis hacen que la lógica pretendida sea explícita y previenen 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 múltiples comparaciones con AND.
¿Cómo funciona NOT LIKE?
NOT LIKE devuelve filas que no coinciden con el patrón especificado. Por ejemplo, title NOT LIKE 'A%' excluye cada título que comienza con 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. Te permiten escribir exactamente la lógica que pretendías en lugar de depender de la precedencia por defecto.
Conclusiones Clave de esta Lección:
- Usa
ANDpara asegurar que se cumplan todas las condiciones. - Usa
ORpara encontrar coincidencias para cualquiera de varias condiciones. - Usa
NOT,NOT INyNOT LIKEpara excluir datos. - Usa
XORcon cuidado: puede ser útil, pero no es compatible en todos los dialectos de SQL. - Siempre usa paréntesis
()al mezclarANDyORpara evitar errores lógicos y mejorar la claridad.
En la próxima lección, aprenderemos a Ordenar y Limitar resultados para organizar tus datos de manera más efectiva.