Зарегистрируйтесь для доступа к 15+ бесплатным курсам по программированию с тренажером

Сложные условия фильтрации Основы SQL

Достаточно распространенная ситуация — нам нужно выбрать строки по нескольким условиям. Например, мы ищем все курсы, которые созданы до 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.

Теперь вы сможете искать записи по нескольким условиям и писать еще более точные запросы.


Аватары экспертов Хекслета

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты

Об обучении на Хекслете

Для полного доступа к курсу нужен базовый план

Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.

Получить доступ
1000
упражнений
2000+
часов теории
3200
тестов

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов
Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff
Рекомендуемые программы
профессия
от 6 300 ₽ в месяц
Разработка веб-приложений на Django
10 месяцев
с нуля
Старт 9 мая
профессия
от 6 183 ₽ в месяц
Ручное тестирование веб-приложений
4 месяца
с нуля
Старт 9 мая
профессия
от 6 300 ₽ в месяц
Разработка приложений на языке Java
10 месяцев
с нуля
Старт 9 мая
профессия
от 5 025 ₽ в месяц
новый
Сбор, анализ и интерпретация данных
9 месяцев
с нуля
Старт 9 мая
профессия
от 6 300 ₽ в месяц
Разработка веб-приложений на Laravel
10 месяцев
с нуля
Старт 9 мая
профессия
от 9 900 ₽ в месяц
Разработка фронтенд- и бэкенд-компонентов для веб-приложений
16 месяцев
с нуля
Старт 9 мая
профессия
от 6 300 ₽ в месяц
Разработка бэкенд-компонентов для веб-приложений
10 месяцев
с нуля
Старт 9 мая
профессия
новый
Автоматизированное тестирование веб-приложений на JavaScript
8 месяцев
c опытом
в разработке
Старт 9 мая

Используйте Хекслет по-максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

Зарегистрируйтесь или войдите в свой аккаунт

Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»