Расширенная фильтрация данных
5. Расширенная фильтрация данных
В SQL для увеличения уровня контроля над фильтром можно использовать несколько предложений в WHERE. Эти предложения допустимо использовать двумя способами: в виде предложений AND или OR.
5.1. Использование ключевого слова AND
В примере извлекается название продукции и цена для всех товаров, изготовленных производителем DLL01, с ценой $4 и выше. Предложение WHERE в операторе SELECT состоит из двух предложений, объединенных ключевым словом AND. Возвращаются товары, которые удовлетворяют все перечисленным предложениям.
SELECT prod_id, prod_price, prod_name выбор столбцов
FROM Products из таблицы
WHERE vend_id = ‘DLL01’ AND prod_price <=4; критерий поиска
--------------------------
prod_id prod_price prod_name
Рекомендуемые материалы
BNBG01 3,49р. Fish bean bag toy
BNBG02 3,49р. Bird bean bag toy
BNBG03 3,49р. Rabbit bean bag toy
5.2. Использование ключевого слова OR
В примере выбираются названия и их цены для всех продуктов, изготовленных одним из указанных производителей. Ключевое слово OR указывает СУБД использовать какое-то предложение, а не сразу два.
SELECT prod_name, prod_price выбор столбцов
FROM Products из таблицы
WHERE vend_id = ‘DLL01’ OR vend_id = ’BRS01’; критерий поиска
--------------------------
prod_name prod_price
Fish bean bag toy 3,49р.
Bird bean bag toy 3,49р.
Rabbit bean bag toy 3,49р.
8 inch teddy bear 5,99р.
12 inch teddy bear 8,99р.
18 inch teddy bear 11,99р.
Raggedy Ann 4,99р.
5.3. Порядок обработки предложений с ключевыми словами AND и OR
Предложения WHERE могут содержать любое количество логических операторов AND и OR. Комбинируя их, можно создавать сложные фильтры. При комбинировании возникает проблема в порядке обработки таких комбинаций.
В примере необходимо вывести список всех изготовленных производителями DLL01 и BRS01 товаров, цена которых $10 и выше.
SELECT prod_name, prod_price выбор столбцов
FROM Products из таблицы
WHERE vend_id = ‘DLL01’ OR vend_id = ’BRS01’ критерий поиска
AND prod_price >=10;
--------------------------
prod_name prod_price
Fish bean bag toy 3,49р.
Bird bean bag toy 3,49р.
Rabbit bean bag toy 3,49р.
18 inch teddy bear 11,99р.
Raggedy Ann 4,99р.
В четырех строках значение цены ниже $10. Это объясняется тем, что вначале обрабатываются операторы AND, а потом уже OR. Сначала выбираются все продукты, которые стоят $10 и больше, изготовленные производителем BRS01 и добавляются все продукты , изготовленные производителем DLL01 независимо от их цены. Это происходит из за того, что приоритет AND выше.
Для правильного получения результата необходимо использовать скобки.
SELECT prod_name, prod_price выбор столбцов
FROM Products из таблицы
WHERE (vend_id = ‘DLL01’ OR vend_id = ’BRS01’) критерий поиска
AND prod_price >=10;
--------------------------
prod_name prod_price
18 inch teddy bear 11,99р.
5.4. Использование ключевого слова IN
Ключевое слово IN используется для указания диапазона условий, любое из которых может быть выполнено. При этом значения, заключенные в скобки, перечисляются через запятую.
В примере осуществляется выборка всех товаров, изготовленных производителями DLL01 и BRS01.
SELECT prod_name, prod_price выбор столбцов
FROM Products из таблицы
WHERE vend_id IN (‘DLL01’, ’BRS01’) критерий поиска
ORDER BY prod_name;
--------------------------
prod_name prod_price
12 inch teddy bear 8,99р.
18 inch teddy bear 11,99р.
8 inch teddy bear 5,99р.
Bird bean bag toy 3,49р.
Fish bean bag toy 3,49р.
Rabbit bean bag toy 3,49р.
Raggedy Ann 4,99р.
Ключевое слово IN выполняет ту же функцию, что и OR. Выполним следующий запрос. Он даст тот же результат.
SELECT prod_name, prod_price выбор столбцов
FROM Products из таблицы
WHERE vend_id = ‘DLL01’ OR vend_id = ’BRS01’ критерий поиска
ORDER BY prod_name;
--------------------------
prod_name prod_price
12 inch teddy bear 8,99р.
18 inch teddy bear 11,99р.
8 inch teddy bear 5,99р.
Bird bean bag toy 3,49р.
Fish bean bag toy 3,49р.
Rabbit bean bag toy 3,49р.
Raggedy Ann 4,99р.
Преимущества ключевого слова IN:
1) При работе с длинными списками необходимых значений синтаксис логического оператора IN легче читать.
2) При использовании ключевого слова IN легче управлять порядком обработки, та как используется меньшее количество операторов.
3) Логические операторы IN почти всегда быстрее обрабатываются, чем списки логических операторов OR.
4) Самое большое преимущество логического оператора IN в том, что в данном операторе может содержаться еще одна инструкция SELECT, а это позволяет создавать очень динамичные предложения WHERE, использовать подзапросы.
5.5. Использование ключевого слова NOT
Логический оператор NOT предложения WHERE служит для выполнения функции отрицания предложения, следующего за ним. NOT вставляется перед названием столбца, значение которого нужно отфильтровать, а не после, как другие ключевые слова.
В примере извлекается список продуктов, изготовленных всеми производителями, кроме DLL01.
SELECT prod_name выбор столбцов
FROM Products из таблицы
WHERE NOT vend_id = ‘DLL01’ критерий поиска
ORDER BY prod_name;
--------------------------
prod_name
12 inch teddy bear
18 inch teddy bear
8 inch teddy bear
King doll
Queen doll
Этот запрос можно выполнить и в следующем виде.
SELECT prod_name выбор столбцов
FROM Products из таблицы
WHERE vend_id <> ‘DLL01’ критерий поиска
ORDER BY prod_name;
--------------------------
prod_name
12 inch teddy bear
Вместе с этой лекцией читают "Файловая система ext2".
18 inch teddy bear
8 inch teddy bear
King doll
Queen doll
Зачем же нужен оператор NOT, если можно выполнять и без него. Он полезен в более сложных предложениях. Например, для нахождения всех строк, которые не совпадают со списком критериев, можно использовать логический оператор NOT в паре с ключевым словом IN.
Примечание. В некоторых СУБД форма оператора NOT может отличаться. Например, СУБД MySQL в виде NOT не поддерживается. NOT используется только для отрицания вхождений EXISTS (т.е. как NOT EXISTS).