Расширенная фильтрация Комбинирование предложений WHERE
Использование ключевого слова AND
Использование ключевого слова OR
Порядок обработки
Использование ключевого слова IN
Использование ключевого слова NOT
Комбинирование предложений WHERE
Все предложения WHERE, представленные в части - "Фильтрация данных", отфильтровывают данные с использованием одного критерия. Чтобы увеличить уровень контроля над фильтром в SQL, можно использовать несколько предложений WHERE. Эти предложения допустимо использовать двумя способами: в виде предложений AND или OR.
Оператор
Специальное ключевое слово, используемое для объединения или изменения предложений внутри предложения WHERE. Также известны под названием логические операторы.
Использование ключевого слова AND
Чтобы отфильтровать данные по более чем одному столбцу, необходимо воспользоваться ключевым словом AND для добавления предложений в предложение WHERE. Вот как это делается:
SELECT prod_id, prod_price, prod_name
FROM Products
WHERE vend_id = 'DLLOl' AND prod_price <=4;
Посредством данного оператора извлекается название продукции и цена для всех товаров, изготовленных производителем DLL01, с ценой $4 и меньше. Предложение WHERE в операторе SELECT состоит из двух предложений, а ключевое слово AND используется для их объединения. Ключевое слово AND указывает системе управления базой данных возвращать только те строки, которые удовлетворяют всем перечисленным предложениям. Если продукт изготовлен производителем DLL01, но стоит больше $4, он не попадет в результаты. Аналогично, товары, которые стоят меньше $4 и изготовлены отличными от указанного производителями, также не будут выведены. Данные, выданные в результате выполнения этой SQL-инструкции, будут выглядеть так:
prod_id prod_price prod_name
----------- --------------- ------------------
BNBG02 3.4900 Bird bean bag toy
BNBGOl 3.4900 Fish bean bag toy
BNBG03 3.4900 Rabbit bean bag toy
AND
Ключевое слово, используемое в предложении WHERE для того, чтобы возвращались только те строки, которые удовлетворяют всем указанным предложениям.
Использование ключевого слова OR
Действие ключевого слова OR противоположно действию ключевого слова AND. Ключевое слово OR указывает системе управления базой данных выбирать только те строки, которые удовлетворяют хотя бы одному предложению. На самом деле в большинстве лучших СУБД второе предложение даже не рассматривается в предложении OR WHERE, если удовлетворено первое предложение. (Если первое предложение выполнено, строка будет выведена независимо от второго предложения.)
Взгляните на следующий оператор SELECT:
SELECT prod_name, prod_price
FROM Products
WHERE vend_id = 'DLLOl' OR vend_id = 'BRSOl';
Посредством этого SQL-оператора выбираются названия товаров и их цены для всех продуктов, изготовленных одним из указанных производителей. Ключевое слово OR указывает СУБД использовать какое-то одно предложение, а не сразу два. Если бы здесь использовалось ключевое слово AND, мы бы не получили никаких данных. После выполнения этого SQL-запроса мы получим следующие данные:
prod_name prod_price
------------------ ---------------
Fish bean bag toy 3.4900
Bird bean bag toy 3.4900
Rabbit bean bag toy 3.4900
8 inch teddy bear 5.9900
12 inch teddy bear 8.9900
18 inch teddy bear 11.9900
Raggedy Ann 4.9900
OR
Ключевое слово, применяемое в предложении WHERE для того, чтобы возвращались все строки, удовлетворяющие любому из указанных предложений.
Порядок обработки
Предложения WHERE могут содержать любое количество логических операторов AND и OR. Комбинируя их, можно создавать сложные фильтры.
Однако при комбинировании ключевых слов AND и OR возникает одна проблема. Рассмотрим следующий пример. Необходимо вывести список всех изготовленных производителями DLL01 и BRS01 товаров, цена которых $10 и выше. В следующей инструкции SELECT используется комбинация ключевых слов AND и OR для формулирования предложения WHERE:
SELECT prod_name, prod_price FROM Products
WHERE vend_id = 'DLLOl' OR vend_id ='BRS01' AND prod_price >= 10;
prod_name prod_price
--------------------- ----------------
Fish bean bag toy 3.4900
Bird bean bag toy 3.4900
Rabbit bean bag toy 3.4900
18 inch teddy bear 11.9900
Raggedy Ann 4.9900
Взгляните на результат. В четырех возвращенных строках значатся цены ниже $10 — очевидно, строки не были отфильтрованы так, как надо. Что же произошло? Причина в порядке обработки. SQL (как и большинство других языков) вначале обрабатывает логические операторы AND, а потом уже логические операторы OR. Когда SQL "видит" такое предложение WHERE, он его считывает так: выбрать все продукты, которые стоят $10 и больше, изготовленные производителем BRS01, и все продукты, изготовленные производителем DLL01 независимо от их цены. Другими словами, так как приоритет у логического оператора AND выше, были объединены "не те" операторы.
Решение этой проблемы состоит в использовании скобок для точного группирования необходимых логических операторов. Взгляните на следующий оператор SELECT и его выходные данные:
SELECT prod_name, prod_price FROM Products
WHERE (vend_id = 'DLLOl' OR vend_id ='BRS01') AND prod_price >= 10;
proa_name prod_price
--------------------- ----------------
18 inch teddy bear 11.9900
Единственным отличием между предыдущим выражением и этим являются скобки, в которые заключены первые два предложения оператора WHERE. Поскольку скобки имеют еще больший приоритет, чем логические операторы AND и OR, СУБД вначале обрабатывает условие OR внутри скобок. Соответственно, SQL-оператор будет пониматься так: выбрать все продукты, изготовленные либо производителем DLL01, либо производителем BRS01, которые стоят $10 и больше, а это именно то, что нужно.
Использование скобок в предложениях WHERE
Когда бы вы ни использовали предложения WHERE с ключевыми словами AND и OR, всегда вставляйте скобки, чтобы точно сгруппировать логические операторы. Не полагайтесь на порядок обработки по умолчанию, даже если он подразумевает необходимый вам результат. Нет никаких недостатков в использовании скобок, кроме того, вы всегда будете застрахованы от неопределенностей.
Использование ключевого слова IN
Ключевое слово IN используется для указания диапазона условий, любое из которых может быть выполнено. При этом значения, заключенные в скобки, перечисляются через запятую. Рассмотрим следующий пример:
SELECT prod_name, prod_price FROM Products
WHERE vend_id IN ('DLLOl', 'BRSOl') ORDER BY prod_name
prod_name prod_price
-------------------- -------------------
12 inch teddy bear 8.9900
18 inch teddy bear 11.9900
8 inch teddy bear 5.9900
Bird bean bag toy 3.4900
Fish bean bag toy 3.4900
Rabbit bean bag toy 3.4900
Raggedy Ann 4.9900
Инструкция SELECT осуществляет выборку всех товаров, изготовленных производителями DLL01 и BRS01. После ключевого слова IN следует список значений через запятую, а весь список заключен в скобки.
Если вы подумаете, что ключевое слово IN выполняет ту же функцию, что и OR, то будете совершенно правы. Следующий SQL-запрос выполняет ту же функцию, что и предыдущий:
SELECT prod_name, prod_price FROM Products
WHERE vend_id = 'DLLOl' OR vend_id = 'BRS01' ORDER BY prod_name;
prod_name prod_price
-------------------- -------------------
12 inch teddy bear 8.9900
18 inch teddy bear 11.9900
8 inch teddy bear 5.9900
Bird bean bag toy 3.4900
Fish bean bag toy 3.4900
Rabbit bean bag toy 3.4900
Raggedy Ann 4.9900
Зачем же нужно ключевое слово IN? Его преимущества следующие.
При работе с длинными списками необходимых значений синтаксис логического оператора IN гораздо легче читать.
При использовании ключевого слова IN гораздо легче управлять порядком обработки (так как используется меньшее количество операторов).
Логические операторы IN почти всегда быстрее обрабатываются, чем списки логических операторов OR.
Самое большое преимущество логического оператора IN в том, что в данном операторе может содержаться еще одна инструкция SELECT, а это позволяет создавать очень динамичные предложения WHERE.
IN
Ключевое слово, используемое в предложении WHERE для указания списка значений, обрабатываемых так же, как это делается в случае применения ключевого слова OR.
Использование ключевого слова NOT
Логический оператор NOT предложения WHERE служит для выполнения только одной функции — отрицать все предложения, следующие за ним. Поскольку NOT никогда не используется сам по себе (а только вместе с другими логическими операторами), его синтаксис немного отличается от синтаксиса остальных операторов. В отличие от них, 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
Здесь логический оператор NOT отрицает предложение, следующее за ним. Поэтому СУБД извлекает не те значения vend_id, которые совпадают с DLL01, а все остальные.
Предыдущий запрос можно было также выполнить при помощи операции <>:
SELECT prod_name FROM Products WHERE vend_id <> 'DLLOl' ORDER BY prod_name;
prod_name
--------------------
12 inch teddy bear
18 inch teddy bear
8 inch teddy bear
King doll
Queen doll
Зачем же использовать логический оператор NOT? Конечно, для таких простых предложений WHERE, какие мы здесь рассматриваем, этот оператор не обязателен. Он полезен в более сложных предложениях. Например, для нахождения всех строк, которые не совпадают со списком критериев, можно использовать логический оператор NOT в паре с ключевым словом IN.
NOT в MySQL
Форма логического оператора NOT, который здесь описывается, не поддерживается в СУБД MySQL. В MySQL NOT используется только для отрицания вхождений EXISTS (т.е. как NOT EXISTS).
Метасимволы
Использование логического оператора LIKE
Метасимвол "знак процента" (%)
Метасимвол "символ подчеркивания" (_)
Метасимвол "квадратные скобки" ([ ])
Использование логического оператора LIKE
Все предыдущие операторы, которые мы рассмотрели, производили фильтрацию по известным значениям. Они искали совпадения по одному или нескольким значениям, более чем и менее чем известное значение или диапазон значений. При этом везде искалось известное значение. Однако фильтрация данных таким способом не всегда работает. Например, как бы вы искали продукты, в названии которых содержатся слова bean bag? Этого нельзя сделать при помощи простых операций сравнения, здесь на помощь приходит поиск с использованием метасимволов. При помощи метасимволов можно создавать условия поиска данных. В этом примере, для того чтобы найти все продукты, в названии которых содержатся слова bean bag, необходимо составить шаблон поиска, позволяющий найти текст bean bag в любом месте названия продукта.
Метасимволы
Специальные символы, применяемые для поиска части значения.
Шаблон поиска
Условие поиска, состоящее из текста, метасимволов и любой их комбинации.
Метасимволы сами по себе являются символами, которые имеют в условии WHERE специальное значение. В SQL поддерживаются метасимволы нескольких типов. Чтобы применять метасимволы в условиях поиска, необходимо использовать ключевое слово LIKE. Оно сообщает СУБД, что следующий шаблон для поиска необходимо сравнивать с использованием метасимволов, а не искать точные совпадения.
Предикат
Когда оператор не является оператором? Тогда, когда он является предикатом. Технически, LIKE — это предикат, а не оператор. Конечный результат остается тем же, просто не пугайтесь этого термина, если вы встретите его в документации по SQL.
Поиск с использованием метасимволов может осуществляться только в текстовых полях (строках), нельзя использовать метасимволы при поиске полей с нетекстовым типом данных.
Метасимвол "знак процента" (%)
Наиболее часто используемый метасимвол — знак процента (%). В строке поиска % означает найти все вхождения любого символа. Например, чтобы найти все продукты, названия которых начинаются со слова Fish, можно выполнить следующий запрос:
SELECT prod_id, prod_name
FROM Products
WHERE prod_name LIKE 'Fish%';
prod_id prod_name
----------- -------------------
BNBGOl Fish bean bag toy
В этом примере используется шаблон поиска 'Fish%'. При выполнении этого условия возвращаются все значения, которые начинаются с символов Fish. Знак % указывает СУБД принимать все символы после слова Fish независимо от их количества.
Метасимволы Microsoft Access
Если вы работаете в Microsoft Access, необходимо использовать символ * вместо символа %.
Зависимость от регистра
Ваша СУБД и ее конфигурация могут влиять на то, что поиск будет зависеть от регистра. В этом случае по строке 'fish%' значение Fish bean bag toy не будет найдено.
Метасимволы можно использовать в любом месте шаблона поиска, причем в неограниченном количестве. В следующем примере используются два метасимвола, по одному на каждом конце шаблона.
SELECT prod_id, prod_name
FROM Products
WHERE prod_name LIKE '%bean bag%';
prod_id prod_name
------------ -------------------
BNBGOl Fish bean bag toy
BNBG02 Bird bean bag toy
BNBG03 Rabbit bean bag toy
Шаблон поиска ' %bean bag%' означает найти все значения, содержащие bean bag в любом месте названия, независимо от количества символов перед или после указанного текста.
Метасимвол можно также использовать внутри шаблона поиска, хотя это редко бывает полезным. В следующем примере производится поиск всех продуктов, которые начинаются на F и заканчиваются на у:
SELECT prod_name
FROM Products
WHERE prod_name LIKE 'F%y';
Важно отметить, что помимо поиска одного или нескольких символов, знак % также означает и отсутствие символов в указанном месте шаблона поиска.
Следите за замыкающими пробелами
Многие СУБД, включая Microsoft Access, заполняют содержимое поля пробелами. Например, если столбец рассчитан на 50 символов, а в нем вставлен текст Fish bean bag toy (17 символов), то, чтобы заполнить столбец, в него может быть добавлено еще 33 пробела. Обычно это не влияет на данные или их использование, но может негативно отразиться на предыдущем SQL-выражении. По условию WHERE prod_name LIKE 'F%y' будут найдены только те значения prod_name, которые начинаются на F и заканчиваются на у. Если значение заполнено пробелами, оно не будет заканчиваться на у, и значение Fish bean bag toy не будет извлечено. Одним из простых решений может быть добавление второго символа % в шаблон поиска: ' F%y%', после чего будут учитываться символы (пробелы) после буквы у. Но лучше "отрезать" пробелы при помощи функций.
Метасимвол "символ подчеркивания" (_)
Еще одним полезным метасимволом является символ подчеркивания (_). Символ подчеркивания используется так же, как и %, но при этом учитывается не много символов, а только один.
Метасимволы в Microsoft Access
Если вы работаете в Microsoft Access, вам нужно использовать знак ? вместо символа _
Взгляните на этот пример.
SELECT prod_id, prod_name
FROM Products
WHERE prod_name LIKE '_ inch teddy bear';
Следите за замыкающими пробелами
Как и в предыдущем примере, возможно, понадобится добавить метасимвол % в шаблон, чтобы пример работал.
prod_id prod_name
------------- -------------------
BNBG02 12 inch teddy bear
BNBG03 18 inch teddy bear
В шаблоне поиска этого предложения WHERE использованы два метасимвола, затем следует текст. В результате были выбраны только те строки, которые удовлетворяли шаблону поиска: по двум символам подчеркивания было найдено число 12 в первой строке и 18 во второй. Продукт 8 inch teddy bear не был найден, так как в шаблоне поиска требуется два совпадения, а не одно. Для сравнения, в следующем выражении SELECT используется метасимвол %, вследствие чего извлекаются три названия товара:
SELECT prod_id, prod_name
FROM Products
WHERE prod_name LIKE '% inch teddy bear';
prod_id prod_name
------------- --------------------
BNBGOl 8 inch teddy bear
BNBG02 12 inch teddy bear
BNBG03 18 inch teddy bear
В отличие от знака %, который подразумевает также отсутствие символов, знак _ всегда означает один символ — не более и не менее.
Метасимвол "квадратные скобки" ([ ])
Метасимвол "квадратные скобки" ([ ]) используется для указания набора символов, каждый из которых должен совпадать со значением, причем точно в указанном месте (в местоположении метасимвола).
Наборы не всегда поддерживаются
В отличие от метасимволов, описанных ранее, использование квадратных скобок для создания наборов многими СУБД не поддерживается. Наборы поддерживаются в СУБД Microsoft Access, Microsoft SQL Server и Sybase Adaptive Server. Обратитесь к документации по вашей СУБД, чтобы определить, поддерживаются ли в ней наборы.
Например, чтобы найти все контакты людей, имена которых начинаются на букву J или М, необходимо сделать следующее:
SELECT prod_id, prod_name FROM Customers
WHERE cust_contact LIKE '[JM]%' ORDER BY cust_contact;
cust_contact
--------------------
Jim Jones
John Smith
Michelle Green
Условие WHERE в этом выражении выглядит как ' [ JM] %'. В этом шаблоне поиска используются два разных метасимвола. По метасимволам [JM] производится поиск всех контактных лиц, имена которых начинаются на одну из указанных в скобках букв, но при этом учитывается только один символ. Поэтому все имена длиннее одного символа не будут извлечены. По метасимволу %, следующему после [JM], производится поиск любого количества символов после первой буквы, что и приводит к требуемому результату.
Можно использовать метасимвол, выполняющий противоположное действие, добавив перед ним символ ^. Например, в следующем примере выбираются все имена, которые не начинаются с буквы J или М (в отличие от предыдущего примера):
SELECT prod_id, prod_name FROM Customers
WHERE cust_contact LIKE ' [^JM]%' ORDER BY cust_contact;
Противоположные наборы в Microsoft Access
Если вы работаете в Microsoft Access и требуется создать противоположный набор, необходимо использовать символ ! вместо ^, поэтому указывайте [! JM] ,а не [^JM].
Конечно, можно достичь того же результата, воспользовавшись логическим оператором NOT. Единственным преимуществом символа [] является более простой синтаксис при выполнении нескольких предложений WHERE.
Внимание!
Метасимвол ([ ]) поддерживается не всеми СУБД. Обратитесь к документации по вашей СУБД, чтобы определить, поддерживается ли этот метасимвол.