> SmartGate 41 752 9863

WHERE

Фильтрация строк по условию

Теория

До этого мы уже научились выбирать нужные столбцы в SELECT, сортировать результат в ORDER BY и ограничивать количество строк через LIMIT. И вспомним, что 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'.

Примеры

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
Какой вариант правильно исключит из результата отменённые заказы?