SQL код скопирован в буфер обмена
EN PT FR

Урок 2.3 Объединение нескольких условий

Объединение нескольких критериев в SQL

В предыдущем уроке мы научились использовать условие WHERE с простыми операторами сравнения. Однако реальный анализ данных часто требует фильтрации по нескольким критериям одновременно. Для этого мы используем логические операторы: AND, OR и NOT.

Логические операторы

Логические операторы позволяют соединять несколько выражений в условии WHERE для создания более сложных фильтров.

1. Оператор AND (И)

Оператор AND возвращает строки только в том случае, если все условия, разделенные AND, истинны. Он используется для сужения результатов поиска.

Пример (база данных Sakila) Предположим, мы хотим найти фильмы с рейтингом 'G' и продолжительностью менее 80 минут:

SELECT title, length, rating
FROM film
WHERE length < 80 AND rating = 'G';

2. Оператор OR (ИЛИ)

Оператор OR возвращает строки, если хотя бы одно из условий, разделенных OR, истинно. Он используется для расширения результатов поиска.

Пример (база данных Sakila) Чтобы найти актеров с именами 'NICK' или 'ED':

SELECT first_name, last_name
FROM actor
WHERE first_name = 'NICK' OR first_name = 'ED';

3. Оператор NOT (НЕ)

Оператор NOT выводит запись, если условие (или условия) НЕ является истинным. Он фактически инвертирует логику условия.

Пример (база данных Sakila) Чтобы найти все фильмы, кроме тех, у которых рейтинг 'R':

SELECT title, rating
FROM film
WHERE NOT rating = 'R';

4. Оператор XOR (исключающее ИЛИ, используется редко)

Оператор XOR возвращает истину, только если истинно ровно одно из двух условий. На практике он используется редко, потому что поддерживается не всеми СУБД и часто ухудшает читаемость запроса.

Пример (база данных Sakila) Чтобы найти фильмы, где выполнено только одно условие: либо продолжительность меньше 60 минут, либо рейтинг 'G', но не оба сразу:

SELECT title, length, rating
FROM film
WHERE length < 60 XOR rating = 'G';

Для переносимости между разными СУБД ту же логику обычно записывают через AND/OR/NOT.


Приоритет операторов

Когда вы комбинируете несколько операторов в одном запросе (например, используя и AND, и OR), SQL следует определенному порядку выполнения (приоритету).

  1. NOT выполняется первым.
  2. AND выполняется вторым.
  3. XOR (если поддерживается СУБД) обычно выполняется после AND.
  4. OR выполняется последним.

Сила круглых скобок: Как и в математике, вам следует использовать круглые скобки (), чтобы управлять порядком выполнения и сделать ваши запросы более читаемыми. Без них SQL незаметно применяет порядок по умолчанию — и результат может не совпасть с тем, что вы задумывали.


Пример 1: Найти фильмы с рейтингом 'G' и 'PG' короче 60 минут

Некорректный запрос — скобки отсутствуют:

-- ОШИБКА: AND имеет более высокий приоритет, чем OR, поэтому вычисляется как:
-- rating = 'G'  OR  (rating = 'PG' AND length < 60)
-- Результат: ВСЕ фильмы 'G' (любой длины) + только КОРОТКИЕ фильмы 'PG'
SELECT title, length, rating
FROM film
WHERE rating = 'G' OR rating = 'PG' AND length < 60;

Почему это неверно: AND вычисляется раньше, поэтому фильтр length < 60 применяется только к фильмам 'PG', тогда как все фильмы 'G' — вне зависимости от длины — попадают в результат.

Корректный запрос — скобки делают логику явной:

-- ВЕРНО: скобки заставляют OR вычисляться первым
-- Результат: только фильмы с рейтингом 'G' ИЛИ 'PG' И короче 60 минут
SELECT title, length, rating
FROM film
WHERE (rating = 'G' OR rating = 'PG') AND length < 60;

Пример 2: Исключить фильмы с рейтингом 'R' и 'NC-17'

Некорректный запрос — NOT отрицает только первое условие:

-- ОШИБКА: NOT применяется только к следующему за ним условию
-- Эквивалентно: (NOT rating = 'R') AND rating = 'NC-17'
-- Результат: все фильмы с рейтингом 'NC-17' (так как 'NC-17' ≠ 'R', условие NOT всегда выполнено)
SELECT title, rating, length
FROM film
WHERE NOT rating = 'R' AND rating = 'NC-17';

Почему это неверно: NOT отрицает только rating = 'R', оставляя rating = 'NC-17' как положительный фильтр. Запрос возвращает все фильмы с рейтингом 'NC-17' — поскольку 'NC-17' не является 'R', условие NOT для них всегда истинно. Вместо того чтобы исключить фильмы NC-17, запрос возвращает именно те фильмы, которые вы хотели исключить.

Вариант A — два явных условия NOT:

-- ВЕРНО: каждое условие отрицается независимо
SELECT title, rating, length
FROM film
WHERE NOT rating = 'R' AND NOT rating = 'NC-17';

Вариант B — NOT со скобками (лаконичнее):

-- ВЕРНО: NOT применяется ко всей группе OR
SELECT title, rating, length
FROM film
WHERE NOT (rating = 'R' OR rating = 'NC-17');

Оба варианта возвращают одинаковый результат. Вариант B предпочтителен, когда нужно исключить несколько значений — он лучше масштабируется по мере роста списка.


Основные выводы из этого урока:

  • Используйте AND для обеспечения выполнения всех условий.
  • Используйте OR для поиска совпадений по любому из нескольких условий.
  • Используйте NOT для исключения определенных данных.
  • Используйте XOR осторожно: оператор удобен, но поддерживается не во всех СУБД.
  • Всегда используйте круглые скобки () при смешивании AND и OR, чтобы избежать логических ошибок и улучшить четкость.

В следующем уроке мы узнаем, как сортировать и ограничивать результаты, чтобы более эффективно организовать ваши данные.