Добро пожаловать!
Здесь вы можете найти ответ на интересующий вас вопрос в отрасли сайтостроения, познакомится ближе с web технологиями и web стандартами.

Учебник SQL

Урок 4. Фильтрация данных

На этом уроке вы узнаете, как использовать предложение WHERE оператора SELECT для указания предложений поиска.

Использование предложения WHERE

В таблицах баз данных обычно содержится очень много информации и довольно редко возникает необходимость выбирать все строки таблицы. Гораздо чаще бывает нужно извлечь какую-то часть данных таблицы для каких-либо действий или отчетов. Выборка только необходимых данных включает в себя критерий поиска, также известный под названием предложение фильтрации.

В операторе SELECT данные фильтруются путем указания критерия поиска в предложении WHERE. Предложение WHERE указывается сразу после названия таблицы (предложения FROM) следующим образом:

SELECT prod_name, prod_price
FROM Products
WHERE prod_price = 3.49;

Этот оператор извлекает два столбца из таблицы товаров, но показывает не все строки, а только те, значение в столбце prod_price которых равно 3.49:

Вывод:

prod_name            prod_price
-------------------------------
Fish bean bag toy    3.4900
Bird bean bag toy    3.4900
Rabbit bean bag toy  3.4900

В этом примере используется простая проверка на равенство: сначала проверяется, существует ли в столбце указанное значение, а затем данные фильтруются соответствующим образом. Однако SQL позволяет использовать не только проверку на равенство.

Требовательная PostgreSQL

СУБД PostgreSQL имеет строгие правила, управляющие значениями, передающимися в SQL-операторы, особенно это касается чисел с десятичными дробями. Таким образом, предыдущий пример может и не работать в PostgreSQL. Чтобы он заработал, необходимо точно указать, что 3.49 — это "правильное" число, включив в предложение WHERE его тип. Для этого замените = 3.49 на = decimal '3.49'.

Фильтрация в SQL и в приложении

Данные также могут быть отфильтрованы на уровне приложения. Для этого посредством оператора SELECT осуществляется выборка большего количества данных, чем на самом деле необходимо для клиентского приложения, а затем клиентский код обрабатывает полученные данные для извлечения только нужных строк.
Как правило, этот метод не приветствуется. Базы данных оптимизированы для быстрой и эффективной фильтрации. Заставляя клиентское приложение выполнять работу базы данных, вы значительно ухудшаете его производительность, а также затрудняете его корректное масштабирование. Кроме того, если данные фильтруются у клиента, сервер отправляет ненужные данные по сети, тем самым занимая лишнюю полосу канала.

Положение предложения WHERE

При использовании обоих предложений, ORDER BY и WHERE, убедитесь, что предложение ORDER BY следует за предложением WHERE, иначе возникнет ошибка. (Более подробно предложение ORDER BY описывается в уроке 3.)

Операции в предложении WHERE

В первом предложении WHERE, которое мы рассмотрели, проводилась проверка на равенство, т.е. определялось, содержится ли в столбце указанное значение. SQL поддерживает весь спектр условных (логических) операций, которые приведены в табл. 4.1.

Таблица 4.1. Операции в предложении WHERE

Операция Описание
= Равенство
< > Неравенство
! = Неравенство
< Меньше
< = Меньше или равно
! < Не меньше
> Больше
> = Больше или равно
! > Не больше
BETWEEN Между двумя указанными значениями
IS NULL Значение NULL

Совместимость операций

Некоторые из операций, приведенных в табл. 4.1, повторяются (например, < > — это то же самое, что и ! =). Выполнение операции ! < (не меньше чем) дает такой же результат, что и > = (больше или равно). Однако заметьте: не все из этих операций поддерживаются всеми СУБД. Обратитесь к документации вашей СУБД, чтобы точно знать, какие логические операции она поддерживает.

Проверка одного значения

Мы рассмотрели пример проверки на равенство. Теперь рассмотрим примеры использования других операций. В первом примере выводятся названия товаров, стоимость которых не превышает $10:

SELECT prod_name, prod_price
FROM Products
WHERE 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
8 inch teddy bear    5.9900
12 inch teddy bear   8.9900
Raggedy Ann          4.9900
King doll            9.4900
Queen doll           9.4900

В следующем выражении выбираются все товары, которые стоят $10 и меньше (результат будет такой же, как и в первом примере, так как в базе данных нет товаров, которые бы стоили ровно $10):

SELECT prod_name, prod_price
FROM Products
WHERE prod_price <= 10;

Проверка на несовпадения

В этом примере выводятся товары, не изготовленные фирмой DLL01.

SELECT vend_id, prod_name
FROM Products
WHERE vend_id <> 'DLL01';

Вывод:

vend_id  prod_name
---------------------------
BRS01    8 inch teddy bear
BRS01    12 inch teddy bear
BRS01    18 inch teddy bear
FNG01    King doll
FNG01    Queen doll

Когда использовать кавычки

Если вы внимательно рассмотрите выражения в предыдущих предложениях WHERE, то заметите, что некоторые значения заключены в одинарные кавычки, а некоторые — нет. Одинарные кавычки используются для определения границ строки. При сравнении значения со столбцом, содержащим строковые данные, необходимы отделяющие строку кавычки. При использовании числовых столбцов кавычки не используются.

Ниже приведен тот же пример, только здесь уже используется операция !=, вместо <>:

SELECT vend_id, prod_price
FROM Products
WHERE vend_id != 'DLL01';

Операция != или <>

Операции != и <> обычно взаимозаменяемы. Однако не во всех СУБД поддерживаются обе формы операции неравенства. Например, в Microsoft Access поддерживается операция <> и не поддерживается !=. Если у вас возникли сомнения по поводу своей СУБД, обратитесь к ее документации.

Проверка на диапазон значений

Для поиска диапазона значений можно использовать операцию BETWEEN. Ее синтаксис немного отличается от других операций предложения WHERE, так как для нее требуются два значения: начальное и конечное. Например, операцию BETWEEN можно использовать для поиска товаров, цена которых находится в промежутке между $5 и $10, или всех дней, которые попадают в диапазон между указанными начальным и конечным числами.

В следующем примере демонстрируется использование операции BETWEEN для выборки всех товаров, цена которых выше $5 и ниже $10:

SELECT prod_name, prod_price
FROM Products
WHERE prod_price BETWEEN 5 AND 10;

Вывод:

prod_name           prod_price
------------------------------
8 inch teddy bear   5.9900
12 inch teddy bear  8.9900
King doll           9.4900
Queen doll          9.4900

Как видно из этого примера, при использовании операции BETWEEN нужно указывать два значения — меньшее и большее из выбранного диапазона. Эти два значения должны быть разделены ключевым словом AND. При этом выбираются все значения из диапазона, включая указанные начальное и конечное значения.

Проверка на отсутствие значения

После создания таблицы разработчик может указать, допустимо ли, чтобы в отдельных ее столбцах не содержались никакие значения. Когда в столбце не содержится никакого значения, это значит, что в нем содержится значение NULL.

NULL

Отсутствие какого-либо значения, в отличие от поля, содержащего или 0, или пустую строку, или просто несколько пробелов.

Для оператора SELECT предусмотрена специальная форма предложения WHERE, которая используется для проверки значений NULL в столбцах и содержит проверку IS NULL. Синтаксис выглядит следующим образом:

SELECT prod_name
FROM Products
WHERE prod_price IS NULL;

Это выражение возвращает список товаров без цены (поле prod_price пустое, а не с ценой 0), а поскольку таковых нет, никаких данных мы не получим. Однако в таблице Vendors есть столбцы со значениями NULL — в столбце vend_state будет содержаться NULL, если не указан никакой штат (в случае, когда адресат находится за пределами Соединенных Штатов):

SELECT vend_id
FROM Vendors
WHERE vend_state IS NULL;

Вывод:

vend_id
-------
FNG1
JTS01

Особые операции СУБД

Во многих СУБД набор операций расширен дополнительными фильтрами. Обратитесь к документации вашей СУБД за дополнительной информацией.

Резюме

В этом уроке рассказывалось о том, как отфильтровывать возвращаемые данные при помощи предложения WHERE оператора SELECT. Теперь вы знаете, как можно проверить данные на равенство, неравенство, наличие значений больше чем и меньше чем, диапазон значений, а также на значение NULL.