WHERE: κρατάμε μόνο τις γραμμές που χρειαζόμαστε
What you'll learn
- να φιλτράρεις γραμμές με
WHEREχρησιμοποιώντας τους τελεστές σύγκρισης=,<>,<,>,<=,>= - να συνδυάζεις συνθήκες με
ANDκαιORκαι να βάζεις παρενθέσεις σε μεικτές συνθήκες - να εντοπίζεις σιωπηλά λογικά σφάλματα που προκαλούνται από την προτεραιότητα του
ANDέναντι τουOR
Κρατάμε μόνο τις γραμμές που χρειαζόμαστε
Πίσω από το τερματικό βρίσκεται η αποθήκη: σκοτάδι, χιλιάδες γραμμές βαθύ. Το να φωτίσεις τα πάντα μαζί είναι ανώφελο — τα πάρα πολλά δεδομένα σε τυφλώνουν εξίσου με το σκοτάδι. Ο αρχειοθέτης χρειάζεται μια δέσμη: στενή, στοχευμένη, έντιμη. Στη γλώσσα των ερωτημάτων αυτή η δέσμη ονομάζεται WHERE.
Το WHERE είναι ένα κόσκινο πριν από το αποτέλεσμα. Κάθε γραμμή από τον products, τον orders ή οποιονδήποτε άλλο πίνακα περνά από έλεγχο· αν δεν τον περάσει, δεν φτάνει στο αποτέλεσμα.
Τελεστές σύγκρισης: =, <> (διάφορο), <, >, <=, >=.
Οι συνθήκες συνδυάζονται με AND (και) και OR (ή). Έτσι βρίσκεις γρήγορα, για παράδειγμα, ακριβά προϊόντα που είχαν μείνει λίγα στην αποθήκη: για έναν αγοραστή του 2024 αυτό ήταν ένα σήμα, όχι απλώς μια λίστα γραμμών.
Η δέσμη πιάνει και τα θλιβερά. Στον orders υπάρχουν παραγγελίες με κατάσταση pending — «εκκρεμεί». Εκκρεμούν ήδη σχεδόν εκατόν εξήντα χρόνια: παραγγελίες που κανείς δεν θα παραλάβει ποτέ. Ο αρχειοθέτης διαβάζει τέτοιες γραμμές με προσοχή — πίσω από την καθεμία κρύβεται το βράδυ κάποιου στην παλιά Γη.
QUERY: Το
pendingεδώ σημαίνει «εκκρεμεί για πάντα». Μη στέκεσαι σε αυτό, δόκιμε. Φώτισε παρακάτω.

WHERE είναι μια δέσμη στη σκοτεινή αποθήκη: κάθε γραμμή ελέγχεται με τη συνθήκη, και στο αποτέλεσμα φτάνουν λίγες.Базовая структура запроса с WHERE
Обычно запрос с фильтрацией выглядит так:
SELECT column_1, column_2
FROM table_name
WHERE condition;
Разберём по частям:
SELECT name, price
FROM products
WHERE price > 4000;
SELECT name, price— какие данные показать в результате;FROM products— из какой таблицы брать строки;WHERE price > 4000— какие строки оставить;price > 4000— условие, которое проверяется для каждой строки.
База данных мысленно проходит по строкам таблицы products и для каждой строки задаёт вопрос:
У этой строки
price > 4000?
Если ответ TRUE, строка проходит в результат.
Если ответ FALSE, строка отбрасывается.
Важно: WHERE не удаляет строки из таблицы.
Он просто не показывает неподходящие строки в результате конкретного запроса.
Таблица остаётся такой же, как была.
WHERE: η συνθήκη υπολογίζεται για κάθε γραμμή ξεχωριστά, και στο αποτέλεσμα περνούν μόνο οι γραμμές που απαντούν TRUE.Запрос всегда возвращает новую результирующую таблицу
Когда ты пишешь SQL-запрос, база данных не просто «показывает кусок таблицы».
Она формирует результат запроса — временную таблицу, которую ты видишь на экране.
Например:
SELECT name, price
FROM products
WHERE price > 4000;
может вернуть такой результат:
| name | price |
|---|---|
| Голографический проектор | 7800 |
| Нейроинтерфейс учебный | 12500 |
| Портативный сканер материи | 5600 |
Эта таблица результата состоит только из двух колонок: name и price.
Но фильтрация происходила по колонке price.
То есть price одновременно:
- участвовала в проверке условия;
- была показана в результате.
Но так бывает не всегда.
Можно фильтровать строки по колонке, которую ты не показываешь в результате:
SELECT name, price
FROM products
WHERE stock < 60;
Здесь в результате будут только name и price, но база всё равно использует колонку stock, чтобы понять, какие строки оставить.
Это нормальная и очень частая ситуация.
WHERE может проверять колонку, даже если этой колонки нет в SELECT.
Операторы сравнения
В WHERE чаще всего используются операторы сравнения.
Они помогают проверить, подходит ли значение в строке под нужное условие.
Основные операторы:
| Оператор | Значение | Пример |
|---|---|---|
= | равно | category = 'Книги' |
<> | не равно | status <> 'cancelled' |
> | больше | price > 4000 |
< | меньше | stock < 60 |
>= | больше или равно | rating >= 4.5 |
<= | меньше или равно | stock <= 10 |
Примеры:
SELECT name, category
FROM products
WHERE category = 'Книги';
Покажет только товары из категории «Книги».
SELECT name, status
FROM orders
WHERE status <> 'cancelled';
Покажет заказы, у которых статус не равен cancelled.
SELECT name, price
FROM products
WHERE price <= 1500;
Покажет товары с ценой 1500 или меньше.
Обрати внимание: строковые значения пишутся в одинарных кавычках:
WHERE category = 'Книги'
А числа обычно пишутся без кавычек:
WHERE price > 4000
Не надо писать так:
WHERE category = Книги
Для SQL слово Книги без кавычек будет выглядеть не как текст, а как имя колонки или другого объекта. Поэтому для текста нужны кавычки.
Важно: в SQL для проверки равенства используется один знак =.
Правильно:
WHERE status = 'paid'
Неправильно:
WHERE status == 'paid'
В некоторых языках программирования для сравнения используют ==, но в SQL стандартная запись — =.
Несколько условий: AND и OR
Одного условия часто недостаточно.
Например, закупщику может быть интересно найти не просто дорогие товары, а дорогие товары, которых осталось мало.
Для этого используются логические операторы:
AND— «и»;OR— «или».
AND: должны выполниться все условия
SELECT name, price, stock
FROM products
WHERE price > 4000 AND stock < 60;
Этот запрос покажет только те строки, где одновременно:
price > 4000;stock < 60.
То есть товар должен быть и дорогим, и с небольшим остатком на складе.
Если цена больше 4000, но остаток 200 — строка не пройдёт.
Если остаток меньше 60, но цена 900 — строка тоже не пройдёт.
AND строгий.
Он пропускает строку только тогда, когда выполнены все условия.
OR: достаточно хотя бы одного условия
SELECT name, category, price
FROM products
WHERE category = 'Книги' OR category = 'Игрушки';
Этот запрос покажет товары, которые относятся либо к категории «Книги», либо к категории «Игрушки».
Строка пройдёт, если выполнено хотя бы одно условие:
- товар из категории «Книги»;
- товар из категории «Игрушки».
OR шире, чем AND.
Он пропускает больше строк, потому что достаточно одного совпадения.
| name | price | stock |
|---|---|---|
| Кроссовки беговые | 5490.00 | 50 |
| Кофеварка капельная | 4290.00 | 40 |
Разбор запроса из примера
Посмотрим на запрос внимательнее:
SELECT name, price, stock
FROM products
WHERE price > 4000 AND stock < 60
ORDER BY price DESC;
Он делает четыре вещи:
- Берёт строки из таблицы
products. - Проверяет каждую строку условием:
price > 4000 AND stock < 60
- Оставляет только те строки, где условие истинно.
- Показывает колонки
name,price,stockи сортирует результат по цене от большей к меньшей.
Человеческое чтение запроса:
Покажи название, цену и остаток товаров из таблицы
products,
но только для товаров дороже 4000, у которых на складе меньше 60 штук,
и отсортируй их по цене от дорогих к дешёвым.
Такой запрос уже похож не на упражнение, а на рабочий аналитический инструмент.
Он отвечает на конкретный вопрос бизнеса:
Какие дорогие товары скоро могут закончиться?
В хранилище такие строки не просто цифры.
Это сигналы.
Когда-то закупщик 2024 года смотрел на подобную выборку и понимал: нужно пополнить склад до того, как клиенты увидят пустоту.
Как база «думает» при выполнении запроса
Новички часто читают SQL сверху вниз и думают, что база сначала выполняет SELECT.
Но логически запрос устроен иначе.
Для запроса:
SELECT name, price
FROM products
WHERE price > 4000
ORDER BY price DESC;
примерный логический порядок такой:
-
FROM products
База понимает, из какой таблицы брать строки. -
WHERE price > 4000
База проверяет каждую строку и оставляет только подходящие. -
SELECT name, price
База формирует колонки результата. -
ORDER BY price DESC
База сортирует итоговые строки.
То есть WHERE срабатывает до формирования финального результата.
Именно поэтому можно фильтровать строки по колонке, которую ты не показываешь в SELECT:
SELECT name
FROM products
WHERE price > 4000;
В результате будет только name, но база всё равно использует price на этапе фильтрации.
Сюжетный пример: заказы, которые ждут
Луч WHERE выхватывает не только товары и цифры.
В таблице orders есть заказы со статусом pending — «ожидает».
SELECT id, customer_name, status
FROM orders
WHERE status = 'pending';
Такой запрос покажет только заказы, которые всё ещё ожидают обработки.
В обычной системе это рабочая задача для менеджера: проверить, почему заказ завис.
Но в архиве старой Земли эти строки звучат иначе.
Некоторые заказы ожидают уже почти сто шестьдесят лет.
Их никто никогда не получит.
Но данные всё ещё честно хранят статус:
pending
ожидает.
КВЕРИ:
pendingздесь значит «ожидает вечно». Не задерживайся на этом, курсант. Свети дальше.
Η προτεραιότητα του AND και του OR: η παγίδα που σωπαίνει
Οι λογικοί τελεστές έχουν προτεραιότητα: ισχυρότερα από όλα δένει το NOT, μετά το AND, και μόνο μετά το OR. Όσο η συνθήκη έχει έναν μόνο τελεστή, δεν χρειάζεται να το σκέφτεσαι. Αλλά μόλις ανακατέψεις AND και OR χωρίς παρενθέσεις — η δέσμη αρχίζει να φωτίζει αλλού:
-- Θέλαμε: προϊόντα από τα Βιβλία ή τα Παιχνίδια φθηνότερα από 1500
SELECT name, category, price
FROM products
WHERE category = 'Книги' OR category = 'Игрушки' AND price < 1500;
Η θα το διαβάσει ως category = 'Книги' OR (category = 'Игрушки' AND price < 1500) — η συνθήκη της τιμής «κόλλησε» μόνο στα παιχνίδια. Στο αποτέλεσμα θα μπουν όλα τα βιβλία, μαζί και το «Αλγόριθμοι στην πράξη» στα 1690, συν τα φθηνά παιχνίδια. Το ερώτημα είναι συντακτικά σωστό, εκτελείται χωρίς ούτε ένα σφάλμα — και επιστρέφει λάθος απάντηση. Τέτοια σφάλματα ζουν στις αναφορές για χρόνια.
Οι παρενθέσεις επαναφέρουν το νόημα:
SELECT name, category, price
FROM products
WHERE (category = 'Книги' OR category = 'Игрушки')
AND price < 1500;
Ο κανόνας του αρχειοθέτη: όποτε σε ένα WHERE συναντώνται και AND και OR — βάζε πάντα παρενθέσεις, ακόμη κι όταν η προτεραιότητα «είναι ούτως ή άλλως προφανής». Ο αναλυτής δεν θα πιάσει το λογικό σφάλμα, και όποιος διαβάσει το ερώτημά σου σε εκατό χρόνια θα σε ευχαριστήσει.
Почему это опасно: разбор на строках
Допустим, в таблице есть такие товары:
| name | category | price |
|---|---|---|
| Алгоритмы на практике | Книги | 1690 |
| Детский дрон | Игрушки | 1200 |
| Конструктор орбитальной станции | Игрушки | 2300 |
| Кабель питания | Электроника | 700 |
Запрос без скобок:
SELECT name, category, price
FROM products
WHERE category = 'Книги' OR category = 'Игрушки' AND price < 1500;
База прочитает так:
WHERE category = 'Книги'
OR (category = 'Игрушки' AND price < 1500)
Проверим строки:
Строка 1: «Алгоритмы на практике»
category = 'Книги' → TRUE
Раз первая часть уже TRUE, строка проходит.
Цена 1690 уже не мешает, потому что условие цены относится только к игрушкам.
Строка 2: «Детский дрон»
category = 'Игрушки' → TRUE
price < 1500 → TRUE
Обе части после AND истинны, строка проходит.
Строка 3: «Конструктор орбитальной станции»
category = 'Игрушки' → TRUE
price < 1500 → FALSE
После AND получается FALSE, строка не проходит.
Строка 4: «Кабель питания»
category = 'Книги' → FALSE
category = 'Игрушки' → FALSE
Строка не проходит.
Итоговая ошибка: дорогая книга попала в результат, хотя по смыслу мы хотели товары дешевле 1500.
Скобки возвращают запросу смысл
Если мы хотим выбрать товары из категорий «Книги» или «Игрушки», но при этом все они должны быть дешевле 1500, нужно явно сгруппировать категории:
SELECT name, category, price
FROM products
WHERE (category = 'Книги' OR category = 'Игрушки')
AND price < 1500;
Теперь условие читается так:
Сначала проверь, что товар относится к книгам или игрушкам.
Потом проверь, что его цена меньше 1500.
Скобки показывают базе и человеку, как именно нужно понимать условие.
Правило архивиста:
Если в одном
WHEREвстречаются иAND, иOR, ставь скобки всегда.
Даже если тебе кажется, что приоритет «и так очевиден».
Парсер логическую ошибку не поймает.
А тот, кто будет читать твой запрос через сто лет, скажет спасибо.
Молчаливая ошибка опаснее синтаксической.
Если ты напишешь запрос с ошибкой синтаксиса, база остановится и скажет:
«Я не могу это выполнить».
Но если ты неправильно расставишь логику в WHERE, база может выполнить запрос без жалоб.
Ты получишь таблицу.
Она будет выглядеть правдоподобно.
В ней будут строки.
Может быть, даже много строк.
Но это будут не те строки, которые ты хотел получить.
Поэтому в аналитике и тестировании запросов важно проверять не только то, что запрос выполняется, но и то, что он возвращает правильный смысл.
Важная ловушка: NULL не проверяется через =
В SQL есть специальное значение NULL.
NULL означает не ноль, не пустую строку и не слово «нет».
NULL означает:
значение неизвестно или отсутствует.
Например, у заказа может ещё не быть даты доставки:
delivered_at = NULL
Новички часто пытаются найти такие строки так:
SELECT id, status, delivered_at
FROM orders
WHERE delivered_at = NULL;
Но это неправильная проверка.
В SQL нельзя сравнивать значение с NULL через =.
Потому что NULL — это неизвестность.
Правильно писать так:
SELECT id, status, delivered_at
FROM orders
WHERE delivered_at IS NULL;
А если нужно найти строки, где значение не пустое:
SELECT id, status, delivered_at
FROM orders
WHERE delivered_at IS NOT NULL;
Главная мысль:
- для обычных значений используем
=,<>,<,>,<=,>=; - для
NULLиспользуемIS NULLиIS NOT NULL.
Полностью тему NULL мы ещё будем разбирать отдельно, но уже сейчас важно запомнить:
WHERE column = NULL почти всегда ошибка.
Профессиональная деталь: в результат проходят только строки, где условие в WHERE дало TRUE.
Если условие дало FALSE — строка не проходит.
Если условие дало из-за NULL — строка тоже не проходит.
Поэтому NULL может незаметно влиять на результат фильтрации.
Частые ошибки новичков
Ошибка 1. Думать, что WHERE выбирает колонки
Неправильная мысль:
WHEREнужен, чтобы выбрать нужные поля.
Правильная мысль:
WHEREнужен, чтобы выбрать нужные строки.
Колонки выбирает SELECT.
SELECT name, price
FROM products
WHERE category = 'Книги';
Здесь:
SELECT name, priceвыбирает колонки;WHERE category = 'Книги'выбирает строки.
Ошибка 2. Писать == вместо =
Неправильно:
WHERE status == 'paid'
Правильно:
WHERE status = 'paid'
Ошибка 3. Забывать кавычки вокруг текста
Неправильно:
WHERE status = paid
Правильно:
WHERE status = 'paid'
Ошибка 4. Смешивать AND и OR без скобок
Опасно:
WHERE status = 'pending' OR status = 'paid' AND total > 5000;
Лучше:
WHERE (status = 'pending' OR status = 'paid')
AND total > 5000;
Ошибка 5. Проверять NULL через =
Неправильно:
WHERE delivered_at = NULL
Правильно:
WHERE delivered_at IS NULL
Ошибка 6. Ставить WHERE после ORDER BY
Неправильно:
SELECT name, price
FROM products
ORDER BY price DESC
WHERE price > 4000;
Правильно:
SELECT name, price
FROM products
WHERE price > 4000
ORDER BY price DESC;
В обычном запросе WHERE пишется после FROM, но до ORDER BY.
Interview question
Ερώτηση συνέντευξης: τι θα επιστρέψει η συνθήκη WHERE a = 1 OR b = 2 AND c = 3;
Δυνατή απάντηση: το AND δένει ισχυρότερα από το OR, οπότε η συνθήκη διαβάζεται ως a = 1 OR (b = 2 AND c = 3): όλες οι γραμμές με a = 1 συν οι γραμμές όπου ισχύουν ταυτόχρονα b = 2 και c = 3. Αν εννοούσες άλλη ομαδοποίηση — χρειάζονται παρενθέσεις. Στην πράξη, στις μεικτές συνθήκες αξίζει να βάζεις πάντα παρενθέσεις: είναι μια απλή ασπίδα απέναντι στα σιωπηλά λογικά σφάλματα.
WHERE?WHERE category = 'Книги' OR category = 'Игрушки' AND price < 1500