WHERE
Фильтрация строк по условию
Теория
До этого мы уже научились выбирать нужные столбцы в SELECT, сортировать результат в ORDER BY и ограничивать количество строк через LIMIT. И вспомним, что LIMIT отвечает только на вопрос «сколько строк показать», а не «какие именно строки нужны».
Но часто нам может понадобиться:
• показать только клиентов из Москвы;
• вывести только товары дороже 50000;
• оставить только заказы после определённой даты.
Другими словами нам нужно получить в результате только строки, которые удовлетворяют определенному условию, то есть пропустить строки через фильтрацию и оставить в результате только те, которые пройдут эту фильтрацию. Такая фильтрация в SQL выполняется оператором WHERE.
WHERE фильтрует строки. Он проверяет условие для каждой строки таблицы и оставляет те, где это условие выполняется. Всё лишнее отбрасывается еще до начала выполнения других операций, например таких как сортировка или ограничение количества строк.
Аналогия: допустим нам нужно вывести только тех клиентов, которые проживают в городе 'Москва'. Мы добавляем это условие в оператор WHERE (ниже будет показано как). При выполнении запроса PostgreSQL увидит, что мы указали условие фильтрации в запросе и начнет каждую строку таблицы проверять на выполнение этого условия. Если условие выполняется, то есть пользователь действительно живет в 'Москва' такая строка выводится в результат. Если пользователь живет в другом городе, строка отбрасывается из результата, потому что для нее заданное условие не выполнилось.
Важно: сначала SQL берёт данные из таблицы через FROM, потом отфильтровывает строки через WHERE, и только после этого может сортировать результат через ORDER BY или обрезать его через LIMIT. Поэтому WHERE отвечает за состав результата, а LIMIT — только за его размер.
Но часто нам может понадобиться:
• показать только клиентов из Москвы;
• вывести только товары дороже 50000;
• оставить только заказы после определённой даты.
Другими словами нам нужно получить в результате только строки, которые удовлетворяют определенному условию, то есть пропустить строки через фильтрацию и оставить в результате только те, которые пройдут эту фильтрацию. Такая фильтрация в SQL выполняется оператором WHERE.
WHERE фильтрует строки. Он проверяет условие для каждой строки таблицы и оставляет те, где это условие выполняется. Всё лишнее отбрасывается еще до начала выполнения других операций, например таких как сортировка или ограничение количества строк.
Аналогия: допустим нам нужно вывести только тех клиентов, которые проживают в городе 'Москва'. Мы добавляем это условие в оператор WHERE (ниже будет показано как). При выполнении запроса PostgreSQL увидит, что мы указали условие фильтрации в запросе и начнет каждую строку таблицы проверять на выполнение этого условия. Если условие выполняется, то есть пользователь действительно живет в 'Москва' такая строка выводится в результат. Если пользователь живет в другом городе, строка отбрасывается из результата, потому что для нее заданное условие не выполнилось.
Важно: сначала SQL берёт данные из таблицы через FROM, потом отфильтровывает строки через WHERE, и только после этого может сортировать результат через ORDER BY или обрезать его через LIMIT. Поэтому WHERE отвечает за состав результата, а LIMIT — только за его размер.
Синтаксис
SELECT column1, column2, ...
FROM table_name
WHERE condition;
SQL
После WHERE пишется столбец и условие проверки для значений из этого столбца. В самой простой форме это выглядит так: столбец оператор значение.
Чаще всего в WHERE используют такие операторы:
• = — равно;
• != или <> — не равно;
• > — больше;
• < — меньше;
• >= — больше или равно;
• <= — меньше или равно.
Числа, с которыми выполняется сравнение после операторов, обычно пишутся без кавычек. Текст и даты — всегда в кавычках: 'Москва', '2024-01-01'.
Чаще всего в WHERE используют такие операторы:
• = — равно;
• != или <> — не равно;
• > — больше;
• < — меньше;
• >= — больше или равно;
• <= — меньше или равно.
Числа, с которыми выполняется сравнение после операторов, обычно пишутся без кавычек. Текст и даты — всегда в кавычках: 'Москва', '2024-01-01'.
Примеры
1. Показываем работников только из одного отдела
Запрос вернёт только тех работников, у кого department_id равен 3. Остальные строки будут отброшены ещё до вывода результата.
🔄 Попробуйте изменить запрос:
- • Поменяйте 3 на 2 и сравните выборку
- • Добавьте в SELECT столбец salary
2. Оставляем только дорогие товары
Здесь условие проверяет цену. В результат попадут только товары дороже 98000. Всё, что стоит дешевле или ровно столько, будет исключено.
🔄 Попробуйте изменить запрос:
- • Замените > на >= и посмотрите, что изменится
- • Поставьте другой порог, например 30000
3. Фильтрация по текстовому значению
Это проверка по строковому значению. Здесь важно, что текст пишется в кавычках. Запрос покажет только пользователей из Москвы.
🔄 Попробуйте изменить запрос:
- • Замените 'Москва' на другой город из таблицы
- • Добавьте сортировку по дате регистрации: ORDER BY registration_date DESC
4. Находим заказы после определённой даты
Сначала WHERE оставит только заказы начиная с '2024-01-01', а затем ORDER BY выведет более свежие даты сверху. Это хороший пример того, как фильтрация и сортировка работают вместе в правильном порядке.
🔄 Попробуйте изменить запрос:
- • Поменяйте дату на '2023-01-01'
- • Уберите ORDER BY и сравните результат
5. Исключаем ненужный статус
Условие с != работает наоборот: оно убирает строки с указанным значением из результата. Здесь в выборке останутся все заказы, кроме отменённых.
🔄 Попробуйте изменить запрос:
- • Замените != на <> и убедитесь, что результат тот же
- • Попробуйте оставить только один статус, заменив условие на status = 'доставлен'
Типичные ошибки
Забывают кавычки для текста и дат
WHERE city = Москва — ошибка. Для строк и дат нужны кавычки: WHERE city = 'Москва'.
Пишут == вместо =
В SQL одно равно — это проверка на равенство. Запись == сюда не подходит.
Ставят WHERE не на своё место
Сначала идёт FROM, потом WHERE, и только после этого ORDER BY и LIMIT.
Пытаются использовать псевдоним из SELECT внутри WHERE
WHERE выполняется раньше, чем список столбцов из SELECT. Поэтому такой запрос не сработает:
Не правильно:
SELECT product_name,
price * 2 AS double_price
FROM products
WHERE double_price > 100000;
Правильно:
SELECT product_name,
price * 2 AS double_price
FROM products
WHERE price * 2 > 100000;
Практика
Проверь себя
Ответьте на вопросы, чтобы закрепить материал:
1
Что делает WHERE в запросе SQL?
2
Напишите запрос, который выведет worker_id, first_name и salary только для работников с зарплатой не меньше 90000.
3
Какой запрос правильно оставит только товары дороже 50000?
4
Что здесь не так: SELECT first_name, city FROM users WHERE city = Москва;?
5
Напишите запрос, который покажет order_id, status и order_date только для заказов со статусом 'доставлен'.
6
Почему такой запрос не сработает: SELECT product_name, price * 2 AS double_price FROM products WHERE double_price > 100000;?
7
Какой вариант правильно исключит из результата отменённые заказы?