Фильтрация записей
Предложение WHERE
предназначено для ограничения количества
возвращаемых строк, теми которые нас интересуют. Условие после ключевого
слова WHERE
может быть простым, как проверка “AMOUNT = 3”
, так и
сложным, запутанным выражением, содержащим подзапросы, предикаты, вызовы
функций, математические и логические операторы, контекстные переменные и
многое другое.
Условие в предложении WHERE часто называют условием поиска, выражением
поиска или просто поиск. В DSQL и ESQL, выражение поиска могут содержать
параметры. Это полезно, если запрос должен быть повторен несколько раз с
разными значениями входных параметров. В строке SQL запроса,
передаваемого на сервер, вопросительные знаки используются как
заполнители для параметров. Их называют позиционными параметрами, потому
что они не могут сказать ничего кроме как о позиции в строке. Библиотеки
доступа часто поддерживают именованные параметры в виде : id
,
: amount
, : a
и т.д. Это более удобно для пользователя,
библиотека заботится о трансляции именованных параметров в позиционные
параметры, прежде чем передать запрос на сервер.
Условие поиска может также содержать локальные (PSQL) или хост (ESQL) имена переменных, предваряемых двоеточием.
Синтаксис:
SELECT ... FROM ... WHERE <search-condition>
<search-condition> - логическое выражение возвращающее TRUE
, FALSE
и возможно
UNKNOWN
(NULL
).
Только те строки, для которых условие поиска истинно, будут включены в
результирующий набор. Будьте осторожны с возможными получаемыми
значениями NULL
: если вы отрицаете выражение, дающее NULL
с
помощью NOT
, то результат такого выражения все равно будет NULL
и строка не пройдёт. Это демонстрируется в одном из ниже приведённых
примеров.
Примеры:
SELECT genus, species FROM mammals WHERE family = 'Felidae' ORDER BY genus;
SELECT * FROM persons WHERE birthyear IN (1880, 1881) OR birthyear BETWEEN 1891 AND 1898;
SELECT name, street, borough, phone FROM schools s WHERE EXISTS (SELECT * FROM pupils p WHERE p.school = s.id) ORDER BY borough, street;
SELECT * FROM employees WHERE salary >= 10000 AND position <> 'Manager';
SELECT name FROM wrestlers WHERE region = 'Europe' AND weight > ALL (SELECT weight FROM shot_putters WHERE region = 'Africa');
SELECT id, name FROM players WHERE team_id = (SELECT id FROM teams WHERE name = 'Buffaloes');
SELECT SUM (population) FROM towns WHERE name LIKE '%dam' AND province CONTAINING 'land';
SELECT pass FROM usertable WHERE username = current_user;
Следующий пример показывает, что может быть, если условие поиска вычисляется как NULL. Предположим у вас есть таблица, в которой находятся несколько детских имён и количество шариков, которыми они обладают.
Таблица MARBLETABLE
CHILD |
MARBLES |
---|---|
Маша |
5 |
Миша |
15 |
Таня |
<NULL> |
Ваня |
0 |
Коля |
7 |
Даша |
17 |
Первое, обратите внимание на разницу между NULL и 0. Известно, что Ваня не имеет шариков вовсе, однако неизвестно количество шариков у Тани.
Теперь, если ввести этот SQL оператор:
SELECT child FROM marbletable WHERE marbles > 10
вы получите имена Миша, Даша. Все эти дети имеют более чем 10 шариков.
Если вы отрицаете выражение:
SELECT child FROM marbletable WHERE NOT marbles > 10
запрос вернёт Маша, Коля, Ваня. Таня не попадет ни в одну из выборок, т.к. не известно сколько у нее шариков. Если вы измените последний запрос так:
SELECT child FROM marbletable WHERE marbles <= 100
результат будет тем же самым, поскольку выражение NULL <= 100 даёт UNKNOWN.
Это не тоже самое что TRUE, поэтому Таня не отображена. Если вы хотите что бы в списке были перечислены все «бедные» дети, то измените запрос следующим образом:
SELECT child FROM marbletable WHERE marbles <= 10 OR marbles IS NULL
Теперь условие поиска становится истинным для Тани, потому что условие «marbles is null» возвращает TRUE в этом случае. Фактически, условие поиска не может быть NULL ни для одного из них.