Anatomia do SELECT: o que buscar e como nomear
O que você vai aprender
- escrever consultas mínimas
SELECT colunas FROM tabelae dar apelidos às colunas comAS - explicar a ordem lógica de execução de uma consulta:
FROM→WHERE→SELECT→ORDER BY→LIMIT - corrigir o erro «column does not exist» repetindo a expressão em vez do apelido no
WHERE - reconhecer onde o apelido já está visível (
ORDER BY) e onde ele ainda não existe (WHERE)
Capítulo 2 — «Primeiro acesso»
O inventário foi lido, e a QUERY cumpre a promessa. No centro do salão, um holopainel âmbar se abre com um clique suave: o terminal de leitura agora está disponível na sua conta. O cursor pisca numa linha vazia. O arquivo está pronto para responder, mas só responde bem a perguntas bem formuladas. Uma consulta é um protocolo de acesso: cada palavra precisa ocupar o lugar certo.
QUERY: O terminal é seu. Fale com o arquivo de forma curta e precisa: ele não é surdo, só não responde direito quando a pergunta vem confusa.
De que é feita uma consulta de leitura
Toda conversa com o arquivo da «Kotomarket» começa com uma pergunta simples: quais campos você quer e de onde eles devem vir. A consulta mínima responde exatamente a isso:
SELECT colunas FROM tabela.
- depois de
SELECT— a lista das colunas que você quer, separadas por vírgula (ou*para todas); - depois de
FROM— a tabela de onde os dados são lidos.
Uma coluna no resultado pode ganhar um nome mais humano — um apelido com AS. Os dados não mudam: você só rotula a coluna para que a saída pareça uma vitrine de loja, não uma nota de depósito de 2024.

SELECT extrai da tabela só as colunas necessárias — e as rotula com AS.Что на самом деле делает SELECT
В SQL часто говорят:
SELECT «выбирает столбцы».
Это удобно для первого объяснения, но не совсем полно.
На самом деле SELECT формирует результат запроса.
Этот результат выглядит как таблица: у него есть колонки и строки. Но эти колонки не обязаны быть точными копиями колонок из исходной таблицы.
SELECT может показать:
- столбцы из таблицы;
- конкретные числа;
- текстовые значения;
- результаты вычислений;
- выражения на основе столбцов;
- результаты функций;
- временные названия колонок через .
То есть SELECT отвечает на вопрос:
Что должно оказаться в итоговой выдаче?
Самый частый вариант — взять данные из таблицы:
SELECT name, price
FROM products;
Этот запрос говорит:
Покажи из таблицы
productsзначения столбцовnameиprice.
Но SELECT умеет больше. Например, в PostgreSQL можно выполнить запрос вообще без таблицы:
SELECT 1;
Результатом будет маленькая таблица из одной строки и одной колонки.
Можно вывести текст:
SELECT 'Котомаркет';
Можно вывести вычисление:
SELECT 2 + 2;
Можно сразу подписать результат понятным именем:
SELECT 2 + 2 AS result;
Такой запрос не «достаёт колонку из таблицы». Он просит базу вычислить выражение и показать его как результат.
Это важная мысль:
SELECTне всегда забирает готовые столбцы. Иногда он создаёт колонки результата прямо в момент выполнения запроса.
Минимальный запрос к таблице
Когда тебе нужны данные из таблицы, запрос обычно строится так:
SELECT столбцы
FROM таблица;
Например:
SELECT name, price
FROM products;
Разберём:
SELECT name, price— какие значения показать в результате;FROM products— из какой таблицы брать строки;;— конец SQL-команды.
После SELECT перечисляют нужные столбцы через запятую:
SELECT name, price, stock
FROM products;
Этот запрос покажет три колонки результата:
name;price;stock.
А если нужно посмотреть все столбцы таблицы, можно использовать *:
SELECT *
FROM products;
Звёздочка означает:
Покажи все столбцы, которые есть в таблице.
Это удобно для первого знакомства с таблицей, но в рабочих запросах лучше не злоупотреблять *.
Почему?
Потому что SELECT * может вернуть лишние данные: технические поля, большие текстовые описания, служебные даты, внутренние идентификаторы. Кроме того, если структура таблицы изменится, результат SELECT * тоже изменится.
Для учебного исследования * — нормально.
Для аккуратного рабочего запроса лучше явно перечислять нужные столбцы.
Алиасы: как назвать колонку результата
Иногда имена столбцов в базе удобны для разработчика, но не очень удобны для человека.
Например, в таблице может быть столбец:
name
Но в результате отчёта хочется видеть:
товар
Для этого используют алиас — временное имя колонки в результате запроса.
SELECT name AS товар, price AS цена
FROM products;
AS можно читать как «назвать как»:
name AS товар
То есть:
Возьми значение из столбца
name, но в результате подпиши эту колонку кактовар.
Важно: алиас не переименовывает столбец в самой таблице.
Он меняет только подпись колонки в результате конкретного запроса.
Таблица products после такого запроса не меняется.
В ней как был столбец name, так он и остаётся.
Алиас — это не ремонт архива.
Это подпись на экране терминала.
Данные не меняются: ты просто подписываешь колонку так, чтобы выдача читалась как витрина магазина, а не как складская накладная из 2024 года.
name e price já aparecem como colunas legíveis.| товар | цена |
|---|---|
| Беспроводные наушники | 5990.00 |
| Смарт-часы | 8990.00 |
| Портативная колонка | 3490.00 |
| Веб-камера HD | 2790.00 |
| Механическая клавиатура | 4590.00 |
O arquivo lê a consulta em outra ordem
Você escreve a consulta de cima para baixo: primeiro SELECT, depois FROM. O arquivo executa tudo em outra ordem — a ordem lógica:
FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY → LIMIT
Primeiro o banco decide de onde buscar as linhas, depois filtra, agrupa e filtra os grupos (GROUP BY e HAVING aparecem no módulo 3). Só então ele calcula a lista do SELECT, incluindo os apelidos. A ordenação e o corte do resultado vêm por último.
Daí nasce um clássico de entrevista: um apelido do SELECT não fica visível no WHERE. Na hora do filtro, ele ainda não existe:
-- Não pode: no passo WHERE o apelido sale_price ainda não existe
SELECT name, price * 0.9 AS sale_price
FROM products
WHERE sale_price < 3000; -- ERROR: column "sale_price" does not exist
-- Pode: repetimos a expressão
SELECT name, price * 0.9 AS sale_price
FROM products
WHERE price * 0.9 < 3000;
Já ORDER BY sale_price funciona: a ordenação acontece depois do SELECT, quando o apelido já foi criado. No PostgreSQL, o apelido também pode aparecer no GROUP BY (uma extensão, não o padrão). No WHERE, porém, ele não funciona em nenhum SGBD importante.
Essa ordem é estritamente lógica: ela descreve o significado da consulta. Por baixo dos panos, o planejador pode reorganizar etapas para ganhar velocidade, mas o resultado precisa bater com a ordem lógica.
SELECT, mas executada a partir do FROM — os apelidos só nascem no passo SELECT.Interview question
Pergunta de entrevista: em que ordem uma consulta SELECT é executada logicamente e por que um apelido do SELECT não pode ser usado no WHERE, mas pode no ORDER BY?
Resposta forte: a ordem lógica é FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY → LIMIT. O WHERE roda antes de a lista do SELECT ser calculada, então os apelidos ainda não existem nesse ponto — é preciso repetir a expressão ou movê-la para uma subconsulta. O ORDER BY roda depois do SELECT, quando os apelidos já estão visíveis. Fisicamente, o otimizador pode reorganizar etapas, mas o resultado sempre segue a ordem lógica.
AS em uma consulta?Результат запроса — тоже таблица
Когда ты выполняешь запрос, база возвращает результат в виде таблицы.
Например:
SELECT name AS товар, price AS цена
FROM products
LIMIT 5;
может вернуть:
| товар | цена |
|---|---|
| Нейроошейник «Мур-7» | 4200 |
| Автокормушка «Орбита» | 3100 |
| Лазерная мышь тренировочная | 900 |
| Капсула сна для кота | 12500 |
| Переноска антигравитационная | 7800 |
Эта таблица результата не обязана полностью повторять таблицу products.
В таблице products могут быть десятки столбцов:
id;name;category;price;stock;created_at;updated_at;- и другие.
Но в результате ты попросил только две колонки:
SELECT name AS товар, price AS цена
Поэтому терминал показывает только их.
Запрос — это не сама таблица.
Запрос — это инструкция, по которой база собирает временную выдачу.
SELECT без таблицы
В большинстве учебных примеров SELECT используется вместе с FROM:
SELECT name
FROM products;
Но в PostgreSQL SELECT может работать и без таблицы.
Например:
SELECT 1;
База вернёт одну строку с числом 1.
Можно вывести текст:
SELECT 'Архив активен';
Можно выполнить вычисление:
SELECT 10 * 3;
Можно дать результату понятное имя:
SELECT 10 * 3 AS total;
Результат будет выглядеть примерно так:
| total |
|---|
| 30 |
Зачем это нужно?
Во-первых, так удобно проверять простые выражения.
Во-вторых, это помогает понять важную идею: SELECT не просто копирует столбцы из таблицы. Он формирует колонки результата.
Иногда эти колонки берутся из таблицы.
Иногда вычисляются прямо в запросе.
КВЕРИ: Архив не обязан открывать ящик, чтобы ответить на вопрос. Иногда ответ уже содержится в самом запросе.
Примечание: в этом курсе мы ориентируемся на PostgreSQL. В некоторых других синтаксис для запроса без обычной таблицы может отличаться.
Выражения в SELECT
В SELECT можно писать не только имена столбцов, но и выражения.
Например, в таблице products есть цена товара:
price
Если нужно показать цену со скидкой 10%, можно написать:
SELECT name, price, price * 0.9 AS sale_price
FROM products;
Здесь:
name— обычный столбец;price— обычный столбец;price * 0.9— вычисление;AS sale_price— имя для вычисленной колонки в результате.
База берёт значение price в каждой строке, умножает его на 0.9 и показывает результат в новой колонке sale_price.
Если в таблице есть такие данные:
| name | price |
|---|---|
| Нейроошейник «Мур-7» | 4200 |
| Лазерная мышь тренировочная | 900 |
то запрос:
SELECT name, price, price * 0.9 AS sale_price
FROM products;
вернёт примерно:
| name | price | sale_price |
|---|---|---|
| Нейроошейник «Мур-7» | 4200 | 3780 |
| Лазерная мышь тренировочная | 900 | 810 |
Важный момент: колонка sale_price не появилась в таблице products.
Она появилась только в результате запроса.
То есть SELECT может создавать вычисляемые колонки результата.
AS: временная подпись, а не изменение таблицы
Алиас через AS можно дать:
- обычному столбцу;
- вычисленному выражению;
- текстовому значению;
- результату функции.
Примеры:
SELECT name AS product_name
FROM products;
SELECT price * 0.9 AS sale_price
FROM products;
SELECT 'Котомаркет' AS archive_name;
AS делает результат понятнее.
Сравни:
SELECT price * 0.9
FROM products;
В результате название колонки может выглядеть технически и не очень понятно.
Лучше:
SELECT price * 0.9 AS sale_price
FROM products;
Теперь сразу ясно, что это цена со скидкой.
Иногда AS можно не писать:
SELECT name product_name
FROM products;
Но для новичков и для читаемого учебного кода лучше использовать AS явно:
SELECT name AS product_name
FROM products;
Так запрос легче читать.
Алиасы из нескольких слов
Если хочешь назвать колонку несколькими словами, нужны двойные кавычки:
SELECT price * 0.9 AS "цена со скидкой"
FROM products;
Но в учебных и рабочих запросах обычно удобнее использовать короткие имена без пробелов:
SELECT price * 0.9 AS sale_price
FROM products;
Такой проще использовать дальше в ORDER BY и легче читать в коде.
Важно не путать:
- одинарные кавычки
'...'— для текста; - двойные кавычки
"..."— для имён столбцов, алиасов и других идентификаторов, если они содержат пробелы или требуют точного написания.
Пример текста:
SELECT 'цена со скидкой' AS label;
Пример имени колонки результата:
SELECT price * 0.9 AS "цена со скидкой"
FROM products;
SELECT *: быстро посмотреть всё
Звёздочка * означает «все столбцы».
SELECT *
FROM products;
Такой запрос удобен, когда ты впервые знакомишься с таблицей и хочешь понять, какие данные в ней есть.
Но SELECT * — это грубый прожектор.
Он освещает всё сразу: нужное, лишнее, служебное, временное, техническое.
В учебных запросах он помогает быстро сориентироваться.
В рабочих запросах лучше писать явно:
SELECT name, price, stock
FROM products;
Так ты точно контролируешь результат.
Плохая привычка новичка:
SELECT *
FROM products;
даже когда нужны только название и цена.
Хорошая привычка:
SELECT name, price
FROM products;
Такой запрос понятнее, аккуратнее и безопаснее для будущих изменений.
Разбор первого рабочего запроса
Посмотрим на запрос из терминала:
SELECT name AS товар, price AS цена
FROM products
LIMIT 5;
Он читается так:
Из таблицы
productsпокажи значения столбцовnameиprice,
но в результате подпиши их кактоварицена,
и выведи только первые 5 строк.
Разбор по строкам:
SELECT name AS товар, price AS цена
Формирует колонки результата.
FROM products
Указывает, из какой таблицы брать данные.
LIMIT 5
Ограничивает выдачу пятью строками.
LIMIT полезен, когда таблица большая. Если в архиве тысячи или миллионы товаров, не всегда нужно выводить всё сразу. Иногда достаточно первых нескольких строк, чтобы проверить структуру данных.
КВЕРИ: Не открывай весь шлюз, если хочешь проверить давление. Пяти строк достаточно, чтобы понять, отвечает ли архив правильно.
Ошибка новичка: использовать слишком рано.
Такой запрос выглядит логично для человека:
SELECT name, price * 0.9 AS sale_price
FROM products
WHERE sale_price < 3000;
Но для базы он неверный.
На момент выполнения WHERE алиаса sale_price ещё нет. Он появится позже, на шаге SELECT.
Правильно:
SELECT name, price * 0.9 AS sale_price
FROM products
WHERE price * 0.9 < 3000;
Или, если выражение большое и не хочется повторять его, позже можно будет использовать . Но это тема следующих модулей.
Где алиас виден, а где нет
Главное правило:
Алиас виден только после того, как он создан на шаге
SELECT.
Поэтому:
| Часть запроса | Можно использовать из SELECT? | Почему |
|---|---|---|
WHERE | Нет | WHERE выполняется раньше SELECT |
SELECT | Алиас создаётся здесь | На этом шаге появляется имя результата |
ORDER BY | Да | ORDER BY выполняется после SELECT |
LIMIT | Не относится к алиасам | Он просто ограничивает количество строк |
Пример, где алиас не работает:
SELECT name, price * 0.9 AS sale_price
FROM products
WHERE sale_price < 3000;
Пример, где алиас работает:
SELECT name, price * 0.9 AS sale_price
FROM products
ORDER BY sale_price;
Если запомнить логический порядок, такие ошибки становятся намного понятнее.
Частые ошибки в первых SELECT-запросах
Ошибка 1. Забыть запятую между столбцами
Неправильно:
SELECT name price
FROM products;
База может понять это не так, как ты ожидаешь: как будто price — это для name.
Правильно:
SELECT name, price
FROM products;
Ошибка 2. Поставить FROM раньше SELECT
Неправильно:
FROM products
SELECT name, price;
Правильно:
SELECT name, price
FROM products;
SQL пишется в своём синтаксическом порядке: сначала SELECT, потом FROM.
Но логически база начинает обработку с FROM.
Ошибка 3. Думать, что алиас меняет таблицу
SELECT name AS товар
FROM products;
После этого в таблице не появляется столбец товар.
Алиас существует только в результате этого запроса.
Ошибка 4. Использовать одинарные кавычки для имени алиаса
Лучше не писать так:
SELECT price AS 'цена'
FROM products;
В PostgreSQL одинарные кавычки используются для строкового текста, а не для имён колонок.
Правильно:
SELECT price AS цена
FROM products;
Или, если нужен алиас с пробелом:
SELECT price AS "цена товара"
FROM products;
Ошибка 5. Использовать алиас в WHERE
Неправильно:
SELECT price * 0.9 AS sale_price
FROM products
WHERE sale_price < 3000;
Правильно:
SELECT price * 0.9 AS sale_price
FROM products
WHERE price * 0.9 < 3000;
Ошибка 6. Всегда писать SELECT *
Для первого знакомства с таблицей можно:
SELECT *
FROM products;
Но для понятного запроса лучше:
SELECT name, price
FROM products;
Так сразу видно, какие данные нужны.
SELECT?SELECT name, price * 0.9 AS sale_price
FROM products
WHERE sale_price < 3000;
SELECT 2 + 2 AS result;
КВЕРИ: Первый допуск получен. Ты больше не смотришь на архив как на стену данных. Ты умеешь задавать ему форму ответа.
- Product Showcase: Rename the ColumnsEASY
- Customer card: projection with aliasesEASY
- Warehouse shelf: SKU, weight and price under readable namesEASY