Фильтровать данные с предикатами.
Простейшая инструкция SELECT только с предложениями SELECT и FROM рассчитывает значения в каждой строке в таблице. Предложение WHERE задает условия, определяющие, какие строки будут обрабатываться, и потенциально сокращает результирующий набор.
Структура предложения WHERE
Предложение WHERE содержит одно или несколько условий поиска, результатом каждого из которых должно быть значение TRUE, FALSE или 'unknown' в каждой строке таблицы. Значения строк возвращаются только в том случае, если результатом выполнения предложения WHERE является TRUE. Отдельные условия действуют как фильтры данных и называются предикатами. Каждый предикат включает тестируемое условие (обычно при тестировании используются основные операторы сравнения):
- = (равно)
- <> (не равно);
- > (больше чем);
- >= (больше или равно);
- < (меньше чем);
- <= (меньше или равно).
Например, следующий запрос возвращает все продукты со значением ProductCategoryID равным 2:
SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE ProductCategoryID = 2;
Аналогичным образом следующий запрос возвращает все продукты со значением ListPrice меньшим 10,00:
SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE ListPrice < 10.00;
IS NULL / IS NOT NULL
Также можно легко фильтровать значения, чтобы разрешить или исключить значения 'unknown' или NULL с помощью инструкций IS NULL или IS NOT NULL.
SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE ProductName IS NOT NULL;
Множество условий
Несколько предикатов можно использовать совместно с операторами AND и OR, а также с круглыми скобками. Однако SQL Server будет обрабатывать только два условия за раз. Все условия должны иметь значение TRUE при использовании нескольких условий с оператором AND. При использовании оператора OR для включения двух условий одно или оба из них могут иметь значение TRUE для результирующего набора.
Например, следующий запрос возвращает продукт в категории 2, стоимость которого меньше 10,00:
SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE ProductCategoryID = 2
AND ListPrice < 10.00;
Операторы AND обрабатываются до операторов OR, если не используются круглые скобки. Рекомендуется использовать круглые скобки при использовании более двух предикатов. Следующий запрос возвращает продукты в категории 2 OR 3 AND стоимостью менее 10,00:
SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE (ProductCategoryID = 2 OR ProductCategoryID = 3)
AND (ListPrice < 10.00);
Операторы сравнения
В Transact-SQL есть ряд дополнительных операторов сравнения, с помощью которых можно упростить предложение WHERE.
В
Оператор IN является ярлыком для нескольких условий равенства для одного и того же столбца, подключенного с помощью оператора OR. Конечно, можно использовать несколько условий OR в запросе, как показано в следующем примере:
SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE ProductCategoryID = 2
OR ProductCategoryID = 3
OR ProductCategoryID = 4;
Однако использование IN является более четким и кратким, и функциональность не меняется.
SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE ProductCategoryID IN (2, 3, 4);
BETWEEN
BETWEEN — это еще один способ оптимизации, который можно использовать при фильтрации по верхней и нижней границам значения вместо использования двух условий с оператором AND. Следующие два запроса эквивалентны.
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;
Оператор BETWEEN использует инклюзивные граничные значения. В результаты будут включены продукты с ценой 1,00 или 10,00. BETWEEN также рекомендуется использовать при запросе полей даты. Например, следующий запрос включает в себя все названия продуктов, измененные в период с 1 января 2012 г. по 31 декабря 2012 г.:
SELECT ProductName, ModifiedDate
FROM Production.Product
WHERE ModifiedDate BETWEEN '2012-01-01' AND '2012-12-31';
НаименованиеПродукта
ModifiedDate
Спортивные носки, М
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
Однако поскольку не указан диапазон времени, результаты не возвращаются после 2012-12-31 00:00:00.000. Для точного указания даты и времени необходимо включить время в предикат:
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';
Базовые операторы сравнения, такие как "Больше, чем" (>) и "Равно" (=), также являются точными, если фильтрация выполняется только по дате:
SELECT ProductName, ListPrice, ModifiedDate
FROM Production.Product
WHERE ModifiedDate >= '2012-01-01'
AND ModifiedDate < '2013-01-01';
LIKE
Последний оператор сравнения можно использовать только для символьных данных. Он позволяет использовать подстановочные знаки и шаблоны регулярных выражений. С помощью подстановочных знаков можно указывать частичные строки. Например, можно использовать следующий запрос для возврата всех продуктов с именами, содержащими слово mountain:
SELECT Name, ListPrice
FROM SalesLT.Product
WHERE Name LIKE '%mountain%';
Подстановочный знак % представляет любую строку с 0 или более символов. Поэтому результаты включают продукты со словом mountain в любой части их имени, например:
Имя.
ПрейскурантнаяЦена
Спортивные носки, М
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
Вы можете использовать подстановочный знак _ (подчеркивание) для представления одного символа следующим образом:
SELECT ProductName, ListPrice
FROM SalesLT.Product
WHERE ProductName LIKE 'Mountain Bike Socks, _';
Следующие результаты содержат только продукты, которые начинаются с "Mountain Bike Socks", с один символом после:
НаименованиеПродукта
ПрейскурантнаяЦена
Спортивные носки, М
9,50
Mountain Bike Socks, L
9,50
Можно определить сложные шаблоны для строк, которые требуется найти. Например, следующий запрос выполняет поиск продуктов с именем, начинающимся с выражения "Mountain-", за которым следуют:
- три символа от 0 до 9
- пробел;
- любая строка
- запятая
- пробел;
- два символа от 0 до 9
SELECT ProductName, ListPrice
FROM SalesLT.Product
WHERE ProductName LIKE 'Mountain-[0-9][0-9][0-9] %, [0-9][0-9]';
Результаты этого запроса могут выглядеть примерно так:
НаименованиеПродукта
ПрейскурантнаяЦена
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, серебристый, 38
2319,99
Mountain-200, серебристый, 42
2319,99
Mountain-200, черный, 38
2319,99
Mountain-200, черный, 42
2319,99