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