AND, OR, NOT
Логические операторы для составления более точных условий
Теория
Например, может понадобиться:
• показать работников из отдела продаж с зарплатой выше 90000;
• найти пользователей из Москвы или Алматы;
• исключить из выборки отменённые заказы дороже определенного значения;
• выбрать товары из одной группы условий, но исключить другую.
В SQL для этого есть логические операторы:
• AND — когда должны выполняться сразу все условия;
• OR — когда достаточно хотя бы одного условия;
• NOT — когда нужно перевернуть условие, то есть наоборот исключить его.
Другими словами AND — это «И одновременно», OR — это «ИЛИ хотя бы одно», а NOT — это «НЕ».
Самое важное здесь — это почувствовать логику. SQL проверяет условие для каждой строки отдельно. Если строка подходит под вашу комбинацию условий, она попадает в результат. Если нет — отбрасывается.
Аналогия:Представьте, что вы ищите пользователей по фамилии Иванов, проживающих в городе Москва. Это два условия. За фамилии здесь отвечает столбец last_name, а за города city. Таким образом в запросе вам нужно будет комбинировать оба условия и в данном случае через оператор AND. Увидев это PostgreSQL для каждой строки будет проверять выполнения обоих условий, если хоть одно не будет выполнено строка в результат не попадет. Допустим пользователь по фамилии Иванов, но проживающей в Казани в результат не попадет. Так как для него выполнено только одно из обязательных условий. А вот если вместо AND написать OR то попадет.
Синтаксис
SELECT column1, column2, ...
FROM table_name
WHERE condition1 AND condition2;
SELECT column1, column2, ...
FROM table_name
WHERE condition1 OR condition2;
SELECT column1, column2, ...
FROM table_name
WHERE NOT condition;
SQL
Коротко по смыслу:
• AND — строка должна пройти все проверки сразу;
• OR — строке достаточно пройти хотя бы одну проверку;
• NOT — меняет условие на противоположное.
Важно помнить и про порядок выполнения:
• сначала SQL обрабатывает NOT;
• потом AND;
• и только потом OR.
Если вы смешиваете AND и OR в одном запросе, почти всегда лучше сразу ставить скобки для приоритетности нужных условий. Так запрос проще читать и труднее случайно испортить.
Примеры
1. Оставляем только нужных работников
🔄 Попробуйте изменить запрос:
- • Поменяйте 90000 на 70000 и сравните выборку
- • Поменяйте AND на OR и посмотрите, насколько больше строк попадет в результат
2. Ищем пользователей из одного города или другого
🔄 Попробуйте изменить запрос:
- • Замените один из городов на 'Санкт-Петербург'
- • Попробуйте OR заменить на AND и объяснить пустой результат
3. Исключаем дорогие товары
🔄 Попробуйте изменить запрос:
- • Замените условие на NOT price < 50000 и посмотрите, как изменится выборка
- • Перепишите запрос без NOT, используя прямое, а не обратное сравнение
4. Скобки меняют смысл запроса
🔄 Попробуйте изменить запрос:
- • Уберите скобки и сравните результат
- • Поменяйте дату на '2023-12-01'
Типичные ошибки
Смешивают AND и OR без скобок
Это самая частая ошибка. Кажется, что запрос читается «как на русском», но SQL сначала выполнит AND, а потом OR. Если логика важна, лучше явно расставить скобки.
Ставят AND там, где условие физически не может выполниться
Например, city = 'Москва' AND city = 'Алматы'. Одна и та же строка не может одновременно иметь два разных значения в одном столбце. В таких случаях обычно нужен OR.
Используют NOT там, где прямое условие было бы понятнее
Запрос NOT price > 100000 работает, но иногда запись price <= 100000 читается проще. Если без NOT условие становится яснее, лучше так и написать.
Забывают полностью повторить условие после OR
WHERE city = 'Москва' OR 'Алматы' приведет к ошибке. Нужно писать полностью: city = 'Москва' OR city = 'Алматы'. SQL не будет догадываться за нас.
Практика
Проверь себя
Ответьте на вопросы, чтобы закрепить материал: