6. SELECT + WHERE
🧭 Введение: почему чтение данных начинается с SELECT + WHERE
Когда в проекте появляется таблица, следующий вопрос всегда один: как быстро и точно достать нужные записи.
Именно здесь начинается базовая аналитика, отчётность, админка и большая часть API-методов чтения.
Именно здесь начинается базовая аналитика, отчётность, админка и большая часть API-методов чтения.
SELECT отвечает на вопрос «какие поля показать», а WHERE — «какие строки вообще подходят».Если неправильно задать фильтр, можно вернуть лишние данные, сломать отчёт или не найти нужную запись.
💡 Совет:
Сначала формулируйте запрос человеческой фразой («покажи активные заказы за сегодня»), а потом переводите её в SQL.
✅ Вывод:
SELECT + WHERE — это базовый навык чтения данных, от которого зависит корректность почти всех экранов и отчётов.⚠️ Проблема -> решение
Без структуры запросов команды часто пишут «рабочий, но случайный» SQL: выбирают
В результате API отдаёт не те данные, а поиск в интерфейсе ведёт себя непредсказуемо.
*, забывают условия, смешивают AND/OR без скобок.В результате API отдаёт не те данные, а поиск в интерфейсе ведёт себя непредсказуемо.
Решение — строить запрос по чёткому алгоритму:
- определить таблицу и поля (
SELECT ... FROM ...), - явно зафиксировать условия (
WHERE ...), - проверить логику комбинаций условий,
- сделать запрос читаемым через алиасы.
🟢 Если совсем просто:
Сначала решаем «что показать», потом — «что отфильтровать», и только затем шлифуем читаемость.
🎯 Как понять, что этап прошёл успешно:
Запрос возвращает ровно те строки, которые ожидались в бизнес-сценарии, без «лишнего шума».
🛠️ Чем помогает и как работает
Грамотный
Это база для сложных тем: сортировки, агрегации,
SELECT + WHERE уменьшает число ошибок в чтении данных и ускоряет отладку.Это база для сложных тем: сортировки, агрегации,
JOIN, подзапросов.🟢 Если совсем просто:
Это язык, на котором вы задаёте БД вопрос и получаете точный ответ.
🎯 Как понять, что этап прошёл успешно:
Любой фильтр в интерфейсе можно прозрачно объяснить соответствующим условием в SQL.
Чем помогает:
- убирает неоднозначность в запросах;
- снижает риск логических ошибок в фильтрации;
- делает SQL читаемым для команды;
- готовит основу для производительной аналитики.
Как это работает:
- Шаг 1: выбираем источник данных (
FROM). - Шаг 2: перечисляем нужные колонки в
SELECTвместо безусловного*. - Шаг 3: задаём фильтр через
WHEREи операторы сравнения. - Шаг 4: при нескольких условиях фиксируем приоритет скобками.
- Шаг 5: добавляем алиасы, чтобы запрос читался как документ.
- Шаг 6: проверяем результат на мини-наборе тестовых кейсов.
✅ Вывод:
SELECT + WHERE — это не «синтаксис ради синтаксиса», а управляемая логика отбора данных.📚 Ключевые термины (простыми словами)
Перед практикой полезно синхронизировать словарь, чтобы одинаково читать и ревьюить запросы.
🟢 Если совсем просто:
Это минимальный набор слов, без которого сложно обсуждать SQL в команде.
🎯 Как понять, что этап прошёл успешно:
Вы можете объяснить каждый термин на примере своего запроса.
- SELECT (выборка) — какие колонки вернуть в результате.
- FROM (источник) — из какой таблицы читать данные.
- WHERE (фильтр) — какие строки оставить.
- Comparison operators (операторы сравнения) —
=,<>,>,>=,<,<=. - Logical operators (логические операторы) —
AND,OR,NOTдля комбинации условий. - Alias (алиас/псевдоним) — короткое имя колонки или таблицы в рамках запроса.
- Predicate (предикат) — условие, которое возвращает true/false для каждой строки.
- NULL (отсутствующее/неизвестное значение) — специальное состояние, которое нельзя сравнивать обычным
=или<>.
✅ Вывод:
Общий словарь снижает число ошибок «из-за разного понимания одного и того же запроса».
🔎 1. Базовый SELECT: что выбрать и откуда
Самая частая ошибка новичка — начинать с
Это усложняет чтение результата и увеличивает объём лишних данных.
SELECT * и только потом пытаться понять, какие поля реально нужны.Это усложняет чтение результата и увеличивает объём лишних данных.
🟢 Если совсем просто:
Чем точнее список колонок, тем понятнее и аккуратнее запрос.
🎯 Как понять, что этап прошёл успешно:
В выдаче нет случайных колонок, и каждое поле в результате можно обосновать бизнес-задачей.
Назначение:
Получать только те поля, которые действительно нужны для экрана, отчёта или API.
Простыми словами:
SELECT — это список того, что вы просите показать.Для новичка:
Если вам нужны имя, email и статус, не просите всю строку целиком.
Чем меньше лишнего, тем проще проверять результат.
Чем меньше лишнего, тем проще проверять результат.
Аналогия:
Это как заказывать в магазине только нужные товары, а не «весь склад сразу».
Пример:
SELECT id, full_name, email, is_activeFROM users;🔎 Как это происходит на практике:
- Контекст: backend делает endpoint списка пользователей для админки.
- Действия: команда выбирает только нужные поля для таблицы в UI.
- Результат: ответ API компактный, понятный и без «мусорных» данных.
Характеристики:
- явный список колонок повышает читаемость;
- легче отлавливать ошибки в контракте API;
- проще контролировать чувствительные поля (например, не выдать лишнее).
Когда использовать:
Всегда, когда есть конкретная цель выборки;
SELECT * допустим только для быстрой локальной диагностики.✅ Вывод:
Точный
SELECT — это базовая дисциплина качества данных в ответе.🎯 2. WHERE и операторы сравнения: точный фильтр
WHERE — ядро фильтрации.Именно здесь определяется, какие строки останутся в результате, а какие будут отброшены.
🟢 Если совсем просто:
WHERE — это правило отбора строк «покажи только те, где условие истинно».🎯 Как понять, что этап прошёл успешно:
Вы можете руками проверить 3-5 строк и точно предсказать, попадут они в результат или нет.
Назначение:
Ограничить выборку только релевантными строками.
Простыми словами:
Операторы сравнения позволяют задать математические и логические границы для поля.
Для новичка:
Начните с простого условия (
status = 'active'), выполните запрос, затем добавляйте сложность по одному правилу.Аналогия:
Это как фильтр в маркетплейсе: цена до 5000, рейтинг выше 4, доставка сегодня.
Пример:
SELECT id, user_id, status, total_amountFROM ordersWHERE status = 'paid' AND total_amount >= 1000 AND total_amount < 10000;🔎 Как это происходит на практике:
- Контекст: финансовый отдел запрашивает оплаченные заказы в целевом диапазоне сумм.
- Действия: разработчик собирает фильтр через
=,>=,<. - Результат: отчёт строится по нужному сегменту без ручной чистки.
Характеристики:
=и<>работают как «равно / не равно»;>,>=,<,<=задают границы диапазонов;- условия в
WHEREприменяются к каждой строке отдельно.
Мини-пример для NULL:
SELECT id, phoneFROM customersWHERE phone IS NULL;= NULL и <> NULL не дают ожидаемого результата, потому что NULL — это «неизвестно», а не обычное значение.Для таких проверок используйте только
IS NULL / IS NOT NULL.Когда использовать:
При любом чтении, где нужны не все строки таблицы, а конкретный бизнес-срез.
✅ Вывод:
WHERE превращает «выгрузку всего» в точный инструмент отбора.🧠 3. Множественные условия: AND, OR, NOT и скобки
Когда бизнес-правило становится сложнее одного фильтра, подключаются логические операторы.
Главная боль здесь — неверный приоритет операций, особенно при смешивании
Главная боль здесь — неверный приоритет операций, особенно при смешивании
AND и OR.🟢 Если совсем просто:
AND — нужно выполнить всё, OR — достаточно одного, NOT — исключаем условие.🎯 Как понять, что этап прошёл успешно:
Вы явно используете скобки в спорных местах и получаете ожидаемое количество строк.
Назначение:
Комбинировать фильтры так, чтобы SQL отражал реальное бизнес-правило.
Простыми словами:
Логические операторы связывают несколько проверок в одно итоговое решение.
Для новичка:
Если в условии есть и
Это защищает от «тихих» ошибок, когда запрос синтаксически верный, но логически неправильный.
AND, и OR, ставьте скобки сразу.Это защищает от «тихих» ошибок, когда запрос синтаксически верный, но логически неправильный.
Аналогия:
«Пустить на мероприятие тех, кто в списке гостей и старше 18, или сотрудников по пропуску».
Пример:
SELECT id, status, total_amount, cityFROM ordersWHERE (status = 'paid' OR status = 'shipped') AND total_amount >= 3000 AND city <> 'test-city';🔎 Как это происходит на практике:
- Контекст: маркетинг строит выборку для кампании по активным заказам.
- Действия: команда объединяет статусы через
OR, а обязательные критерии — черезAND. - Результат: сегмент без шумовых и тестовых записей.
Характеристики:
ANDсужает выборку;ORрасширяет выборку;NOTинвертирует условие;- скобки управляют приоритетом и снимают неоднозначность.
Когда использовать:
Когда бизнес-условие состоит из нескольких критериев, которые нельзя выразить одним сравнением.
✅ Вывод:
Множественные условия безопасны только тогда, когда приоритет явно задан скобками.
🧩 4. Операторы для практичной фильтрации: IN, BETWEEN, LIKE, ILIKE
В реальных запросах часто нужен не один точный матч, а список вариантов, диапазон или поиск по шаблону.
Для этого удобны
Для этого удобны
IN, BETWEEN, LIKE и ILIKE (в PostgreSQL).🟢 Если совсем просто:
IN — список значений, BETWEEN — диапазон, LIKE/ILIKE — шаблон строки.🎯 Как понять, что этап прошёл успешно:
Запрос проще читать, чем длинная цепочка однотипных
OR.Назначение:
Сделать фильтры компактными и читаемыми для типовых сценариев отбора.
Простыми словами:
Эти операторы сокращают «многословные» условия в понятные конструкции.
Для новичка:
Если у вас три и более одинаковых проверки по одному полю, почти всегда стоит проверить, можно ли заменить их на
IN.Аналогия:
Это как фильтры в приложении: «статусы из списка», «цена от и до», «имя начинается с A».
Пример:
SELECT id, status, total_amount, created_atFROM ordersWHERE status IN ('new', 'paid', 'shipped') AND total_amount BETWEEN 1000 AND 5000 AND customer_email ILIKE '%@company.com';🔎 Как это происходит на практике:
- Контекст: support ищет корпоративные заказы со статусами в заданном пуле.
- Действия: вместо длинных
ORкоманда используетIN, а диапазон оформляет черезBETWEEN. - Результат: запрос короче, легче читать и проще поддерживать.
Характеристики:
IN (...)удобен для конечного списка значений;BETWEEN a AND bвключает обе границы;LIKEприменяется для шаблонного поиска в строках;- в PostgreSQL
ILIKEдаёт case-insensitive поиск по шаблону; LIKE 'abc%'часто лучше дружит с индексами, чемLIKE '%abc%'(зависит от СУБД и коллации);LIKE '%abc%'часто требует полный проход или специальный индекс (например, триграммы в PostgreSQL).
Важная оговорка для дат и времени:
BETWEEN включает обе границы, и для TIMESTAMP это часто ловушка.-- Плохо для "за 2026-03-05": почти ничего не вернёт, кроме полуночиWHERE created_at BETWEEN TIMESTAMP '2026-03-05 00:00:00' AND TIMESTAMP '2026-03-05 00:00:00' -- Лучше: полуинтервалWHERE created_at >= TIMESTAMP '2026-03-05 00:00:00' AND created_at < TIMESTAMP '2026-03-06 00:00:00'Когда использовать:
Когда фильтр естественно описывается списком, диапазоном или строковым шаблоном.
✅ Вывод:
IN/BETWEEN/LIKE/ILIKE делают SQL ближе к реальному языку бизнес-условий.🏷️ 5. Алиасы в запросах: AS для колонок и таблиц
Когда запрос растёт, без алиасов он становится «шумным»: длинные имена колонок, повтор таблиц, неочевидные заголовки результата.
Алиасы решают это без изменения самих данных.
Алиасы решают это без изменения самих данных.
🟢 Если совсем просто:
Алиас — это удобное временное имя в пределах одного запроса.
🎯 Как понять, что этап прошёл успешно:
Запрос читается слева направо без «расшифровки», а названия столбцов в результате понятны бизнесу.
Назначение:
Сделать запрос и его результат более читаемыми и удобными для использования.
Простыми словами:
AS позволяет переименовать колонку или таблицу только на время выполнения запроса.Для новичка:
Используйте алиасы, если без них запрос тяжело читать глазами.
Хорошее имя алиаса должно объяснять смысл поля, а не быть случайной аббревиатурой.
Хорошее имя алиаса должно объяснять смысл поля, а не быть случайной аббревиатурой.
Аналогия:
Это как подписать коробки на складе короткими понятными ярлыками.
Пример:
SELECT o.id AS order_id, o.created_at AS order_created_at, o.total_amount AS amount, o.status AS order_statusFROM orders AS oWHERE o.status = 'paid' AND o.total_amount >= 2000;🔎 Как это происходит на практике:
- Контекст: frontend ждёт поля с предсказуемыми именами.
- Действия: backend задаёт алиасы колонок под контракт API.
- Результат: уменьшается число преобразований и путаницы на стороне клиента.
Характеристики:
- алиасы колонок улучшают читабельность результата;
- алиасы таблиц сокращают запись и упрощают фильтры;
ASповышает поддержку сложных запросов и ревью кода.
Когда использовать:
Когда нужно улучшить читаемость запроса, унифицировать названия для API или убрать неоднозначность.
✅ Вывод:
Алиасы — простой способ сделать SQL понятным для разработчиков и бизнеса.
⚖️ Сравнение операторов фильтрации
| Оператор | Для чего использовать | Частая ошибка |
|---|---|---|
= | точное совпадение | сравнивать с неправильным типом значения |
<> | исключить конкретное значение | забывать, что это только одно значение |
> / < | строгие границы | перепутать направление сравнения |
>= / <= | границы с включением | ожидать исключение границы |
IN (...) | список допустимых значений | писать длинную цепочку OR вместо IN |
BETWEEN ... AND ... | диапазон с обеими границами | думать, что верхняя граница исключена |
LIKE / ILIKE | строковый шаблон (с/без учёта регистра) | ставить %...% без понимания влияния на индексы |
✅ Вывод:
Оператор выбирают по смыслу фильтра, а не «по привычке из прошлого запроса».
📌 Must-know факты
SELECTбезWHEREвернёт все строки таблицы.SELECT *удобен для черновой проверки, но плох как стандарт в production-коде.- В смешанных условиях
AND/ORбезопаснее всегда использовать скобки. - Для отсутствующих значений используйте
IS NULL/IS NOT NULL, а не= NULL. - Для диапазонов по
TIMESTAMPчаще безопаснее полуинтервал>= start AND < next_day. - Алиасы не меняют данные в таблице, они работают только в текущем запросе.
- Читаемость запроса напрямую влияет на скорость ревью и поддержку.
- Сначала корректность логики, затем оптимизация.
🧨 Частые мифы
❌ Миф:
SELECT * — нормальный стандарт для любого запроса.✅ Как правильно:
Выбирайте только нужные поля, особенно в API и отчётах.
Выбирайте только нужные поля, особенно в API и отчётах.
📎 Почему это важно:
Меньше лишних данных, меньше риска утечки и проще сопровождение.
Меньше лишних данных, меньше риска утечки и проще сопровождение.
❌ Миф:
Если запрос выполнился без ошибки, фильтр точно корректный.
Если запрос выполнился без ошибки, фильтр точно корректный.
✅ Как правильно:
Проверяйте бизнес-логику на тестовых кейсах и количество возвращённых строк.
Проверяйте бизнес-логику на тестовых кейсах и количество возвращённых строк.
📎 Почему это важно:
Логическая ошибка в
Логическая ошибка в
WHERE часто не даёт SQL-ошибку, но ломает результат.❌ Миф:
AND и OR можно писать подряд без скобок, БД «и так поймёт».✅ Как правильно:
Явно задавайте приоритет через скобки.
Явно задавайте приоритет через скобки.
📎 Почему это важно:
Иначе легко получить неожиданную выборку и скрытый баг в отчётах.
Иначе легко получить неожиданную выборку и скрытый баг в отчётах.
❌ Миф:
Алиасы нужны только для очень сложных запросов.
Алиасы нужны только для очень сложных запросов.
✅ Как правильно:
Используйте алиасы в любых запросах, где они повышают читаемость.
Используйте алиасы в любых запросах, где они повышают читаемость.
📎 Почему это важно:
Понятный SQL быстрее ревьюится и легче передаётся между разработчиками.
Понятный SQL быстрее ревьюится и легче передаётся между разработчиками.
❓ Часто спрашивают на собеседованиях
❓ Вопрос: Чем
SELECT * хуже явного списка колонок?
✅ Ответ: Явный список даёт контроль над контрактом, снижает шум и уменьшает риск вернуть лишние данные.❓ Вопрос: Какой приоритет у
AND и OR в WHERE?
✅ Ответ: Без скобок приоритет выше у AND, поэтому смешанные условия лучше всегда группировать скобками.❓ Вопрос: Когда использовать
IN, а не много OR?
✅ Ответ: Когда сравниваете одно поле с конечным списком значений; IN делает запрос короче и понятнее.❓ Вопрос: Что даёт алиас колонки через
AS?
✅ Ответ: Понятное имя поля в результате запроса, удобное для API, отчётов и дальнейшей обработки.❓ Вопрос: Можно ли считать
WHERE только «фильтром для UI»?
✅ Ответ: Нет, WHERE — часть бизнес-логики данных и ключевой элемент корректности выборки.❓ Вопрос: Почему полезно сначала писать простой фильтр, а потом усложнять?
✅ Ответ: Пошаговая сборка облегчает проверку логики и быстрее выявляет ошибочный кусок условия.
🚫 Типичные ошибки
Ошибка 1: всегда писать SELECT *
❌ Неправильно:
Брать все колонки даже для короткого списка в интерфейсе.
Брать все колонки даже для короткого списка в интерфейсе.
✅ Правильно:
Явно перечислять поля под конкретную задачу.
Явно перечислять поля под конкретную задачу.
Почему:
Так запрос легче поддерживать и безопаснее использовать в API.
Так запрос легче поддерживать и безопаснее использовать в API.
Ошибка 2: забывать WHERE в «боевом» запросе
❌ Неправильно:
Запрос для отчёта без фильтра по периоду/статусу.
Запрос для отчёта без фильтра по периоду/статусу.
✅ Правильно:
Явно задавать обязательные фильтры.
Явно задавать обязательные фильтры.
Почему:
Иначе легко получить огромную и неверную выборку.
Иначе легко получить огромную и неверную выборку.
Ошибка 3: смешивать AND и OR без скобок
❌ Неправильно:
Надеяться на «интуитивный» приоритет.
Надеяться на «интуитивный» приоритет.
✅ Правильно:
Ставить скобки в каждом неоднозначном выражении.
Ставить скобки в каждом неоднозначном выражении.
Почему:
Синтаксис может быть корректным, а бизнес-логика — нет.
Синтаксис может быть корректным, а бизнес-логика — нет.
Ошибка 4: использовать неинформативные алиасы
❌ Неправильно:
Писать
Писать
a, b, c, если запрос читает вся команда.✅ Правильно:
Давать алиасы, отражающие смысл (
Давать алиасы, отражающие смысл (
order_total, customer_email).Почему:
Понятные имена снижают когнитивную нагрузку при ревью.
Понятные имена снижают когнитивную нагрузку при ревью.
Ошибка 5: пытаться решить все условия в одном длинном выражении сразу
❌ Неправильно:
Писать сложный
Писать сложный
WHERE «в один заход» без промежуточной проверки.✅ Правильно:
Собирать фильтр по частям и проверять результат после каждого шага.
Собирать фильтр по частям и проверять результат после каждого шага.
Почему:
Так быстрее найти ошибку и доказать корректность логики.
Так быстрее найти ошибку и доказать корректность логики.
✅ Best Practices
- Формулируйте условие в человеческом виде до написания SQL.
- Используйте явный список колонок вместо
SELECT *в рабочем коде. - При смешивании
AND/ORвсегда расставляйте скобки. - Для списков значений используйте
IN, для диапазонов —BETWEEN. - Для
NULL-проверок используйте толькоIS NULL/IS NOT NULL. - Для поиска без учёта регистра в PostgreSQL используйте
ILIKEосознанно и учитывайте индексацию. - Давайте осмысленные алиасы колонкам, которые уходят в API/отчёты.
- Проверяйте запрос на маленьком тестовом наборе, прежде чем запускать на полном объёме.
🧾 Заключение
SELECT + WHERE — фундамент чтения данных в SQL.Через эти конструкции строятся почти все пользовательские списки, фильтры и отчёты.
Ключевые мысли
SELECTопределяет структуру ответа,WHERE— его точность.- Операторы сравнения и логические связки нужно выбирать по бизнес-смыслу.
- Скобки и алиасы делают запрос безопасным и читаемым.
- Сильная база в
SELECT + WHEREупрощает изучение следующих тем SQL.