Filtrado de los datos con predicados
Las instrucciones SELECT más simples con solo las cláusulas SELECT y FROM evaluarán cada fila de una tabla. Con el uso de una cláusula WHERE, se definen condiciones que determinan qué filas se procesarán y potencialmente reducirán el conjunto de resultados.
La estructura de la cláusula WHERE
La cláusula WHERE está compuesta de una o varias condiciones de búsqueda, cada una de las cuales debe evaluarse como TRUE, FALSE o “unknown” para cada fila de la tabla. Solo se devolverán las filas cuando la cláusula WHERE se evalúe como TRUE. Las condiciones individuales actúan como filtros en los datos y se conocen como “predicados”. Cada predicado incluye una condición que se prueba, por lo general mediante los operadores básicos de comparación:
- = (es igual a)
- <> (no es igual a)
- > (mayor que)
- >= (mayor o igual que)
- < (menor que)
- <= (menor o igual que)
Por ejemplo, la consulta siguiente devuelve todos los productos con un valor ProductCategoryID de 2:
SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE ProductCategoryID = 2;
De manera similar, la consulta siguiente devuelve todos los productos con un valor ListPrice menor que 10,00:
SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE ListPrice < 10.00;
IS NULL/IS NOT NULL
También puede filtrar fácilmente para permitir o excluir los valores “unknown” o NULL mediante IS NULL o IS NOT NULL.
SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE ProductName IS NOT NULL;
Varias condiciones
Se pueden combinar varios predicados con los operadores AND y OR, y con paréntesis. Sin embargo, SQL Server solo procesará dos condiciones a la vez. Todas las condiciones deben ser TRUE al conectar varias condiciones con el operador AND. Cuando se usa el operador OR para conectar dos condiciones, una o ambas pueden ser TRUE para el conjunto de resultados.
Por ejemplo, la consulta siguiente devuelve un producto de la categoría 2 que cuesta menos de 10,00:
SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE ProductCategoryID = 2
AND ListPrice < 10.00;
Los operadores AND se procesan antes que los operadores OR, a menos que se utilicen paréntesis. Para el procedimiento recomendado, use paréntesis al usar más de dos predicados. La siguiente consulta devuelve productos de la categoría 2 OR (O) 3 AND (Y) cuesta menos de 10,00:
SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE (ProductCategoryID = 2 OR ProductCategoryID = 3)
AND (ListPrice < 10.00);
Operadores de comparación
Transact-SQL incluye operadores de comparación adicionales que pueden ayudar a simplificar la cláusula WHERE.
IN
El operador IN es un acceso directo para varias condiciones de igualdad para la misma columna conectada con OR. No hay ningún problema con el uso de varias condiciones OR en una consulta, como en el ejemplo siguiente:
SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE ProductCategoryID = 2
OR ProductCategoryID = 3
OR ProductCategoryID = 4;
Sin embargo, el uso de IN es claro y conciso, y el rendimiento de la consulta no se verá afectado.
SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE ProductCategoryID IN (2, 3, 4);
BETWEEN
BETWEEN es otro acceso directo que se puede usar al filtrar para un límite superior e inferior del valor, en lugar de usar dos condiciones con el operador AND. Las dos consultas siguientes son equivalentes:
SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE ListPrice >= 1.00
AND ListPrice <= 10.00;
SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE ListPrice BETWEEN 1.00 AND 10.00;
El operador BETWEEN usa valores de límite inclusivos. Los productos con un precio de 1,00 o 10,00 se incluirán en los resultados. BETWEEN también es útil al consultar campos de fecha. Por ejemplo, la siguiente consulta incluirá todos los nombres de producto modificados entre el 1 de enero de 2012 y el 31 de diciembre de 2012:
SELECT ProductName, ModifiedDate
FROM Production.Product
WHERE ModifiedDate BETWEEN '2012-01-01' AND '2012-12-31';
ProductName
ModifiedDate
Mountain Bike Socks, M
2012-01-01 00:00:00.000
HL Mountain Frame - Silver, 42
2012-03-05 00:00:00.000
HL Mountain Frame - Silver, 38
2012-08-29 00:00:00.000
Mountain-100 Silver, 38
2012-12-31 00:00:00.000
Sin embargo, dado que no se especifica un intervalo de tiempo, no se devuelve ningún resultado después de 2012-12-31 00:00:00.000. Para incluir con precisión la fecha y hora, es necesario incluir la hora en el predicado:
SELECT ProductName, ListPrice, ModifiedDate
FROM Production.Product
WHERE ModifiedDate BETWEEN '2012-01-01 00:00:00.000' AND '2012-12-31 23:59:59.999';
Los operadores de comparación básicos, como Greater Than (>) y Equals (=) también son precisos cuando solo se filtran por fecha:
SELECT ProductName, ListPrice, ModifiedDate
FROM Production.Product
WHERE ModifiedDate >= '2012-01-01'
AND ModifiedDate < '2013-01-01';
LIKE
El operador de comparación final solo se puede usar para los datos de caracteres y nos permite usar caracteres comodín y patrones de expresiones regulares. Los caracteres comodín nos permiten especificar cadenas parciales. Por ejemplo, podría usar la consulta siguiente para devolver todos los productos con nombres que contengan la palabra "mountain":
SELECT Name, ListPrice
FROM SalesLT.Product
WHERE Name LIKE '%mountain%';
El carácter comodín % representa cualquier cadena de 0 caracteres o más, por lo que los resultados incluyen productos con la palabra "mountain" en cualquier parte del nombre, como se muestra a continuación:
Nombre
ListPrice
Mountain Bike Socks, M
9,50
Mountain Bike Socks, L
9,50
HL Mountain Frame - Silver, 42
1364,0
HL Mountain Frame - Black, 42
1349,60
HL Mountain Frame - Silver, 38
1364,50
Mountain-100 Silver, 38
3399,99
Puede usar el carácter comodín _ (guión bajo) para representar un carácter único, como este:
SELECT ProductName, ListPrice
FROM SalesLT.Product
WHERE ProductName LIKE 'Mountain Bike Socks, _';
Los siguientes resultados solo incluyen productos que comienzan por “Mountain Bike Socks”, y un solo carácter después de:
ProductName
ListPrice
Mountain Bike Socks, M
9,50
Mountain Bike Socks, L
9,50
También puede definir patrones complejos para las cadenas que desea buscar. Por ejemplo, la siguiente consulta busca productos con un nombre que comience por “Mountain-”, seguido de:
- tres caracteres entre 0 y 9
- un espacio
- cualquier cadena
- una coma
- un espacio
- dos caracteres entre 0 y 9
SELECT ProductName, ListPrice
FROM SalesLT.Product
WHERE ProductName LIKE 'Mountain-[0-9][0-9][0-9] %, [0-9][0-9]';
Los resultados de esta consulta podrían tener un aspecto parecido al siguiente:
ProductName
ListPrice
Mountain-100 Silver, 38
3399,99
Mountain-100 Silver, 42
3399,99
Mountain-100 Black, 38
3399,99
Mountain-100 Black, 42
3399,99
Mountain-200 Silver, 38
2319,99
Mountain-200 Silver, 42
2319,99
Mountain-200 Black, 38
2319,99
Mountain-200 Black, 42
2319,99