Достаточно распространенная ситуация — нам нужно выбрать строки по нескольким условиям. Например, мы ищем все курсы, которые созданы до 14 июня 2022 года и содержат в описании слово dolor
.
Мы можем составить два запроса: один на условие с датой, второй — на условие с текстом в описании. Потом мы сравниваем, какие строки попали в оба запроса. Этот способ крайне неудобный и чреват ошибками.
В этом уроке мы научимся решать эту задачу по-другому. Вы узнаете, как сочетать несколько условий в одном запросе с помощью логических операторов OR
и AND
.
Таблицы истинности
Прежде чем приступать к запросам, давайте рассмотрим, в чем разница между логическими операторами OR
и AND
.
Начнем с оператора OR
. Он переводится как «ИЛИ» и указывает, что выражение будет верным, если хотя бы одно условие выполняется.
Пусть у нас будет два условия: A
и B
. Например:
-
А: В описании содержится слово "dolor"?
-
B: Дата создания до 14 июня 2022 года?
Составим таблицу, в которой перечислим всевозможные сочетания этих условий и результат A OR B
. Такая таблица называется таблицей истинности оператора OR
:
A | B | A OR B |
---|---|---|
True |
True |
True |
True |
False |
True |
False |
True |
True |
False |
False |
False |
Второй оператор — это AND
. Он переводится как «И» и указывает, что выражение будет верным, только если оба условия A
и B
выполняются.
Таблица истинности оператора AND
выглядит так:
A | B | A AND B |
---|---|---|
True |
True |
True |
True |
False |
False |
False |
True |
False |
False |
False |
False |
Как объединять условия
Теперь вы знаете, как работают логические операторы. Попробуем объединить несколько условий в одном запросе.
Представим, что строка должна попасть в результирующую таблицу только если оба условия будут выполнены. В таком случае мы используем AND
.
Выведем всю информацию о курсах, созданных до 14 июня 2022 года и содержащих слово dolor
в описании:
SELECT *
FROM courses
WHERE body LIKE '%dolor%'
AND created_at < '2022-06-14';
View on DB Fiddle
В этом запросе мы выбираем по двум условиям:
-
В описании встречается слово
dolor
-
И при этом дата создания курса строго раньше 14 июня 2022 года
Обратите внимание на запись запроса выше. Он разбит на отдельные строки: строка для перечисления столбцов, строка для указания таблицы, строка для условий фильтрации. Ранее мы работали с более простыми запросами, в которых разбиение не требовалось.
Для сложных запросов будем придерживаться такого формата записи, потому что он позволяет лучше ориентироваться.
Теперь представим такую задачу: нужно выбрать пользователей с идентификатором больше 90. Мы знаем, что иногда идентификатор не проставляется из-за сбоя. Поэтому мы добавляем в результирующую таблицу еще и тех пользователей, у кого идентификатор не проставлен вовсе.
Чтобы это сделать, нам нужно использовать логический оператор OR
:
SELECT *
FROM users
WHERE id > 90 OR id IS NULL;
View on DB Fiddle
Если бы мы ошиблись в этом запросе и вместо OR
использовали бы AND
, то такой запрос всегда бы возвращал пустую таблицу — идентификатор не может быть одновременно пустым и больше 90.
Логические операторы OR
и AND
можно комбинировать, однако нужно помнить об особенности — приоритет AND
выше, чем OR
. Другими словами, всегда сначала выполняются проверки на «И», а уже потом — на «ИЛИ».
Чтобы не создавать неоднозначностей, в сложных условиях рекомендуем использовать круглые скобки. Проверка в скобках имеет больший приоритет:
SELECT *
FROM users
WHERE first_name = 'Andy'
OR (created_at > '2022-06-13' AND created_at < '2022-06-14');
View on DB Fiddle
В этом запросе мы выберем либо пользователей с именем Andy, либо тех, кто зарегистрировался между 13 и 14 июня 2022 года.
Выводы
В этом уроке мы научились объединять условия с помощью логических операторов OR
и AND
.
Если требуется выполнение обоих условий, то необходимо использовать оператор AND. Если нам достаточно выполнения какого-то одного условия из двух, то нужно использовать оператор OR.
Теперь вы сможете искать записи по нескольким условиям и писать еще более точные запросы.
Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.