Вопрос 3: Фильтрация данных. Использование операторов сравнения. Логические операции.
Операторы сравнения позволяют проверить, одинаковы ли два выражения. Операторы сравнения можно применять ко всем выражениям, за исключением выражений типов text, ntext и image. Операторы сравнения Transact-SQL приведены в следующей таблице:
Оператор | Значение |
---|---|
= (равно) | Равно |
> (больше) | Больше чем |
< (меньше) | Меньше чем |
>= (больше или равно) | Больше или равно |
<= (меньше или равно) | Меньше или равно |
<> (не равно) | Не равно |
!= (не равно) | Не равно (не определено стандартом ISO) |
!< (не меньше) | Не меньше (не определено стандартом ISO) |
!> (не больше чем) | Не больше (не определено стандартом ISO) |
Результат выполнения оператора сравнения имеет тип данных Boolean. Он может иметь одно из трех значений: TRUE, FALSE и UNKNOWN. Выражения, возвращающие значения типа Boolean, называются логическими. Выражения со значениями типа Boolean используются в предложении WHERE для фильтрации строк, удовлетворяющих условиям поиска, и в инструкциях языка управления потоком, таких как IF и WHILE, например:
DECLARE @MyProduct int;
SET @MyProduct = 750;
IF (@MyProduct <> 0)
SELECT ProductID, Name, ProductNumber
FROM Production.Product
WHERE ProductID = @MyProduct;
Логические операторы проверяют истину некоторого условия. Логические операторы, например оператор сравнения, возвращают тип данных Boolean. Логические операторы приведены в таблице.
Оператор | Значение |
---|---|
ALL | TRUE, если все сравнения в наборе равны TRUE. |
AND | TRUE, если оба выражения типа Boolean равны TRUE. |
ANY | TRUE, если любое из сравнений в наборе равно TRUE. |
BETWEEN | TRUE, если операнд принадлежит указанному диапазону. |
EXISTS | TRUE, если вложенный запрос возвращает как минимум одну строку. |
IN | TRUE, если операнд содержится в заданном списке выражений. |
LIKE | TRUE, если оператор удовлетворяет шаблону. |
NOT | Меняет значение оператора типа Boolean на противоположное. |
OR | TRUE, если одно из выражений типа Boolean равно TRUE. |
SOME | TRUE, если некоторые из сравнений в наборе равны TRUE. |
Запрос возвращает значение TRUE для ANY, так как 3 меньше некоторых из значений в таблице. И апрос возвращает значение FALSE для ALL, так как 3 не меньше каждого из значений в таблице.
CREATE TABLE T1
(ID int) ;
GO
INSERT T1 VALUES (1) ;
INSERT T1 VALUES (2) ;
INSERT T1 VALUES (3) ;
INSERT T1 VALUES (4) ;
IF 3 < SOME (SELECT ID FROM T1)
PRINT 'TRUE'
ELSE
PRINT 'FALSE' ;
IF 3 < ALL (SELECT ID FROM T1)
PRINT 'TRUE'
ELSE
PRINT 'FALSE' ;
Если сложное выражение содержит множество операторов, порядок выполнения операций определяется приоритетом операторов. Порядок исполнения может существенно повлиять на результирующее значение. Уровни приоритета операторов показаны в следующей таблице. Оператор с более высоким уровнем выполняется прежде, чем оператор с более низким уровнем. В следующей таблице самым высоким уровнем является 1, а самым низким — 8. Если два оператора в выражении имеют один и тот же уровень приоритета, они вычисляются в порядке слева направо по мере их появления в выражении.
Level | Операторы |
---|---|
1 | ~ (побитовое НЕ) |
2 | * (умножение), / (деление), % (остаток деления) |
3 | + (положительное), – (отрицательное), + (сложение), +( объединение), – (вычитание), & (побитовое И), ^ (побитовое исключающее ИЛИ), (побитовое ИЛИ) |
4 | =, >, <, >=, <=, <>, !=, !>, !< (операторы сравнения) |
5 | NOT |
6 | AND |
7 | ALL, ANY, BETWEEN, IN, LIKE, OR, SOME |
8 | = (присваивание) |
Фильтрация данных осуществаляется при помощи WHERE и HAVING.
WHERE Определяет условия поиска строк, возвращаемых запросом. Ключевое слово WHERE нельзя использовать с агрегатными функциями.
Нахождение строк, которые должны удовлетворять нескольким условиям:
SELECT EmployeeKey, LastName
FROM DimEmployee
WHERE EmployeeKey <= 500 AND LastName LIKE '%Smi%' AND FirstName LIKE '%A%';
Нахождение строк, находящихся в списке значений:
SELECT EmployeeKey, LastName
FROM DimEmployee
WHERE LastName IN ('Smith', 'Godfrey', 'Johnson');
HAVING Определяет условие поиска для группы или статистического выражения. Предложение HAVING можно использовать только в инструкции SELECT. HAVING обычно используется с предложением GROUP BY. Если предложение GROUP BY не используется, имеется одна неявная агрегированная группа. HAVING - фильтрующее выражение. Оно применяется к результату операции и выполняется уже после того как этот результат будет получен, в отличии от WHERE. В следующем примере, который использует простое предложение HAVING, из таблицы SalesOrderID извлекается сумма всех полей SalesOrderDetail, значение которых превышает 100000.00.
SELECT SalesOrderID, SUM(LineTotal) AS SubTotal
FROM Sales.SalesOrderDetail
GROUP BY SalesOrderID
HAVING SUM(LineTotal) > 100000.00
ORDER BY SalesOrderID ;