En el artículo anterior vimos cómo usar WHERE para filtrar filas. Pero la vida real rara vez es tan simple como para usar una sola condición.
Generalmente, no queremos solo “los clientes de Madrid”. Queremos:
“los clientes de Madrid Y que hayan comprado este mes”
“los productos que cuesten ENTRE 10 y 50 euros”
Para expresar estas reglas de negocio, T-SQL nos ofrece un conjunto de Operadores que nos permiten comparar valores y combinar múltiples condiciones lógicas.
Operadores de comparación
Son los más básicos. Nos permiten comparar dos expresiones (una columna contra un valor, o dos columnas entre sí).
El resultado de esta comparación siempre es TRUE, FALSE o UNKNOWN (en caso de nulos).
| Operador | Descripción | Ejemplo |
|---|---|---|
= | Igual a | Precio = 10 |
> | Mayor que | Edad > 18 |
< | Menor que | Stock < 5 |
>= | Mayor o igual que | Fecha >= '2023-01-01' |
<= | Menor o igual que | Nota <= 5 |
<> | Distinto de (Estándar SQL) | Pais <> 'España' |
!= | Distinto de (No estándar) | Pais != 'España' |
Aunque != funciona en T-SQL, lo recomendable es usar <>.
Es el operador definido por el estándar ANSI SQL y garantiza que tu código sea más portable a otras bases de datos.
Operadores lógicos (AND, OR, NOT)
Estos operadores son el “pegamento” que nos permite unir varias condiciones de comparación dentro de un mismo WHERE.
Para que la fila sea seleccionada, ambas condiciones deben ser verdaderas. Es restrictivo.
-- Clientes de Madrid QUE ADEMÁS estén activos
SELECT * FROM Clientes
WHERE Ciudad = 'Madrid' AND Activo = 1;
Para que la fila sea seleccionada, basta con que una de las condiciones sea verdadera. Es inclusivo.
-- Clientes que sean de Madrid O de Barcelona
SELECT * FROM Clientes
WHERE Ciudad = 'Madrid' OR Ciudad = 'Barcelona';
Invierte el resultado de la condición. Si es TRUE pasa a FALSE, y viceversa.
-- Clientes que NO son de Madrid
SELECT * FROM Clientes
WHERE NOT Ciudad = 'Madrid'; -- Equivalente a Ciudad <> 'Madrid'
La precedencia de operadores
SQL Server tiene un orden de prioridad de operadores. El operador AND se evalúa antes que el OR.
Imaginad que queremos buscar:
Clientes de Madrid O Barcelona Y que tengan más de 18 años
-- ¡OJO! Esta consulta está MAL planteada
SELECT * FROM Clientes
WHERE Ciudad = 'Madrid' OR Ciudad = 'Barcelona' AND Edad > 18;
¿Qué hace SQL aquí? Debido a la prioridad, entiende esto:
- Clientes de Barcelona con más de 18 años.
- O cualquier cliente de Madrid (tenga la edad que tenga).
Para corregirlo, debemos usar paréntesis para forzar el orden de evaluación, igual que en matemáticas:
-- Consulta CORRECTA
SELECT * FROM Clientes
WHERE (Ciudad = 'Madrid' OR Ciudad = 'Barcelona') AND Edad > 18;
Ante la duda, usa paréntesis. Mejor un paréntesis de más, que un error.
También conviene a veces, usar saltos de línea para verlo más fácilmente (no afectan a la consulta, pero mejoran la legibilidad).
Operadores Especiales
T-SQL incluye ciertos operadores que, aunque podríamos simular con AND y OR, hacen el código mucho más legible y elegante.
BETWEEN (Rango)
Sirve para buscar valores dentro de un intervalo. Importante: BETWEEN es inclusivo. Incluye tanto el valor inicial como el final.
-- Buscar productos entre 10 y 50 euros (ambos incluidos)
SELECT * FROM Productos
WHERE Precio BETWEEN 10 AND 50;
-- Equivalente a:
-- WHERE Precio >= 10 AND Precio <= 50;
IN (Lista de valores)
Nos permite especificar una lista de valores posibles. Es mucho más limpio que escribir múltiples OR.
-- Clientes de estas tres ciudades
SELECT * FROM Clientes
WHERE Ciudad IN ('Madrid', 'Barcelona', 'Valencia');
-- Equivalente a:
-- WHERE Ciudad = 'Madrid' OR Ciudad = 'Barcelona' OR Ciudad = 'Valencia';
LIKE (Patrones de texto)
Hasta ahora hemos buscado texto exacto (=). Pero, ¿y si buscamos a todos los clientes cuyo apellido empiece por “L”?
El operador LIKE nos permite buscar patrones utilizando comodines:
%(Porcentaje): Representa cualquier cadena de texto de cero o más caracteres._(Guion bajo): Representa exactamente un carácter.
-- Apellidos que empiezan por "Garc" (García, Garzón, Garcés...)
SELECT * FROM Empleados
WHERE Apellido LIKE 'Garc%';
-- Emails que terminan en ".com"
SELECT * FROM Clientes
WHERE Email LIKE '%.com';
-- Contiene "Llamas" en cualquier parte del nombre
SELECT * FROM Clientes
WHERE Nombre LIKE '%Llamas%';
-- Un código de 3 letras donde la primera es A y la última C (ej: ABC, ADC, AXC)
SELECT * FROM Productos
WHERE Codigo LIKE 'A_C';
Rendimiento del LIKE:
- Usar
LIKE 'Texto%'es rápido porque puede usar índices. - Usar
LIKE '%Texto'(empezando con comodín) es muy lento, ya que obliga a SQL Server a leer toda la tabla fila por fila para buscar el texto dentro.
