В секции WHERE
задается логическое условие, которому должны удовлетворять записи итогового набора. На практике команда SELECT
почти всегда содержит как минимум одну уточняющую секцию WHERE
.
Предположим, вы хотите получить список всех книг о компьютерных технологиях в базе данных booktown. У этих книг поле subject_id
равно 4. Соответственно в секцию WHERE
включается оператор =
, который проверяет это условие. Пример приведен в листинге 19.
booktown=# SELECT * FROM books WHERE subject_id = 4;
id | title | author_id | subject_id
41472 | Practical PostgreSQL | 1212 | 4
41473 | Programming Python | 7805 | 4
41477 | Learning PostgreSQ L | 7805 | 4
41478 | Perl Cookbook | 7806 | 4
(4 rows)
Запрос из листинга 19 возвращает только те записи, у которых поле subject_id
совпадает с целочисленной константой 4. Итоговый набор содержит всего 4 записи книг о компьютерах вместо 15 записей, приведенных в листинге 12.
Секция WHERE
может содержать несколько условий, объединенных логическими операторами (например, AND
или OR
) и возвращающими одно логическое значение. Допустим, вас интересуют все записи для книг о компьютерах, которые, кроме того, что они о компьютерах, написаны Марком Лутцем. Запрос уточняется объединением двух условий при помощи логического оператора AND
. Возможен и другой вариант – например, поиск всех книг, посвященных компьютерным технологиям или искусству; в этом случае два условия объединяются логическим оператором OR
. В листинге 20 продемонстрированы оба сценария с ключевыми словами AND
и OR
.
booktown=# SELECT title FROM books WHERE subject_id = 4 AND author_id = 7805;
title
Programming Python
Learning Python
(2 rows)
booktown=# SELECT title FROM books WHERE subject_id = 4 OR subject_id = 0;
title
Dynamic Anatomy
Practical PostgreSQL
Programming Python
Learning Python
Perl Cookbook
(5 rows)
Первая команда SELECT
в листинге 20 содержит два условия, объединенных логическим оператором AND
. Первое условие проверяет, что книга посвящена компьютерным технологиям (поле subject_id
равно 4), а второе – что автором книги является Марк Лутц (поле author_id
равно 7805). Объединение условий уменьшает объем итогового набора – в него входят всего две записи, удовлетворяющие обоим условиям.
Во второй команде SELECT
в листинге 20 прежнее первое условие (книги по компьютерной тематике) объединяется со вторым условием: книги по искусству (поле subject_id
равно 0). В результате объем итогового набора увеличивается до пяти записей, каждая из которых удовлетворяет хотя бы одному из этих условий.
Количество условий, объединяемых в секции WHERE
, не ограничено, хотя при наличии двух и более условий обычно выполняется группировка при помощи круглых скобок, наглядно демонстрирующая логическую связь между условиями. Листинг 21 показывает, как простое добавление круглых скобок влияет на результат выполнения команды.
booktown=# SELECT * FROM books WHERE author_id = 1866 AND subject_id = 15 OR subject_id = 3;
id | title | autho_id | subject_id
4513 | Dune | 1866 | 15
1234 | The Velveteen Rabbit | 25041 | 3
(2 rows)
booktown=# SELECT * FROM books WHERE author_id = 1866
AND (subject_id = 15
OR subject_id = 3);
id | title | author_id | subject_id
4513 | Dune | 1866 | 15
(1 row)
В этом примере продемонстрированы две попытки выборки из базы данных booktown записей, у которых поле author_id
равно 1866. Кроме того, поле subject_id
должно быть равно либо 15, либо 3. Как видно из результатов первой команды, при перечислении всех трех условий без круглых скобок команда интерпретируется неправильно. Добавление круглых скобок приводит к тому, что вычисления в скобках производятся до проверки внешних условий.
Удаление дубликатов и ключевое слово DISTINCT | Объединение наборов данных |