В предыдущем уроке мы научились использовать условие WHERE с простыми операторами сравнения. Однако реальный анализ данных часто требует фильтрации по нескольким критериям одновременно. Для этого мы используем логические операторы: AND, OR и NOT.
Логические операторы позволяют соединять несколько выражений в условии WHERE для создания более сложных фильтров.
Оператор AND возвращает строки только в том случае, если все условия, разделенные AND, истинны. Он используется для сужения результатов поиска.
Пример (база данных Sakila) Предположим, мы хотим найти фильмы с рейтингом 'G' и продолжительностью менее 80 минут:
SELECT title, length, rating
FROM film
WHERE length < 80 AND rating = 'G';
Оператор OR возвращает строки, если хотя бы одно из условий, разделенных OR, истинно. Он используется для расширения результатов поиска.
Пример (база данных Sakila) Чтобы найти актеров с именами 'NICK' или 'ED':
SELECT first_name, last_name
FROM actor
WHERE first_name = 'NICK' OR first_name = 'ED';
Оператор NOT выводит запись, если условие (или условия) НЕ является истинным. Он фактически инвертирует логику условия.
Пример (база данных Sakila) Чтобы найти все фильмы, кроме тех, у которых рейтинг 'R':
SELECT title, rating
FROM film
WHERE NOT rating = 'R';
Оператор XOR возвращает истину, только если истинно ровно одно из двух условий. На практике он используется редко, потому что поддерживается не всеми СУБД и часто ухудшает читаемость запроса.
Пример (база данных Sakila) Чтобы найти фильмы, где выполнено только одно условие: либо продолжительность меньше 60 минут, либо рейтинг 'G', но не оба сразу:
SELECT title, length, rating
FROM film
WHERE length < 60 XOR rating = 'G';
Для переносимости между разными СУБД ту же логику обычно записывают через AND/OR/NOT.
Когда вы комбинируете несколько операторов в одном запросе (например, используя и AND, и OR), SQL следует определенному порядку выполнения (приоритету).
NOT выполняется первым.AND выполняется вторым.XOR (если поддерживается СУБД) обычно выполняется после AND.OR выполняется последним.Сила круглых скобок:
Как и в математике, вам следует использовать круглые скобки (), чтобы управлять порядком выполнения и сделать ваши запросы более читаемыми. Без них SQL незаметно применяет порядок по умолчанию — и результат может не совпасть с тем, что вы задумывали.
Некорректный запрос — скобки отсутствуют:
-- ОШИБКА: 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;
Некорректный запрос — 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, чтобы избежать логических ошибок и улучшить четкость.В следующем уроке мы узнаем, как сортировать и ограничивать результаты, чтобы более эффективно организовать ваши данные.