Anatomia lui SELECT: ce luăm și cum îi spunem
What you'll learn
- să scrii interogări minime
SELECT coloane FROM tabelși să denumești coloanele cu aliasuri prinAS - să explici ordinea logică de execuție a unei interogări:
FROM→WHERE→SELECT→ORDER BY→LIMIT - să repari eroarea „column does not exist”, repetând expresia în loc de în
WHERE - să deosebești locurile unde aliasul e deja vizibil (
ORDER BY) de cele unde încă nu există (WHERE)
Capitolul 2 — „Primul acces”
Inventarul e citit — și QUERY își ține promisiunea. În centrul sălii se desfășoară cu un clic discret un holopanou chihlimbariu: terminalul de citire se deschide pe contul tău. Cursorul clipește pe o linie goală. Arhiva e gata să răspundă — dar răspunde numai la întrebări puse corect. O interogare e un protocol de acces: fiecare cuvânt din ea stă exact la locul lui.
QUERY: Terminalul e al tău. Vorbește cu arhiva scurt și precis: nu e surdă, doar că nu răspunde la ce e bâiguit.
Din ce e alcătuită o interogare de selecție
Orice discuție cu arhiva „Kotomarket” pornește de la o întrebare simplă: ce câmpuri îți trebuie și de unde să le iei. O interogare minimă răspunde exact la asta:
SELECT coloane FROM tabel.
- după
SELECT— lista coloanelor dorite, separate prin virgulă (sau*pentru toate); - după
FROM— tabelul din care luăm datele.
Unei coloane din rezultat îi poți da un nume omenesc — un prin AS. Datele nu se schimbă: doar denumești coloana așa încât rezultatul să se citească precum o vitrină de magazin, nu ca un bon de magazie din 2024.

SELECT smulge din tabel doar coloanele de care ai nevoie — și le denumește prin 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 și price sunt denumite din capul locului ca niște coloane omenești.| товар | цена |
|---|---|
| Беспроводные наушники | 5990.00 |
| Смарт-часы | 8990.00 |
| Портативная колонка | 3490.00 |
| Веб-камера HD | 2790.00 |
| Механическая клавиатура | 4590.00 |
Arhiva citește interogarea altfel decât o scrii tu
Tu scrii interogarea de sus în jos: întâi SELECT, apoi FROM. Arhiva o execută într-o altă ordine — logică:
FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY → LIMIT
Întâi baza decide de unde ia rândurile, apoi le filtrează, le grupează și filtrează grupurile (GROUP BY și HAVING le vei întâlni în modulul 3) — și abia după aceea calculează lista SELECT propriu-zisă, aliasurile incluse. Ultimele lucrează sortarea și retezarea rezultatului.
De aici clasicul întrebat la aproape orice interviu: aliasul din SELECT nu e vizibil în WHERE — în momentul filtrării el încă nu există:
-- Așa nu se poate: la pasul WHERE aliasul sale_price încă nu există
SELECT name, price * 0.9 AS sale_price
FROM products
WHERE sale_price < 3000; -- ERROR: column "sale_price" does not exist
-- Așa se poate: repetăm expresia
SELECT name, price * 0.9 AS sale_price
FROM products
WHERE price * 0.9 < 3000;
În schimb ORDER BY sale_price va funcționa: sortarea se execută după SELECT, când aliasul există deja. În PostgreSQL aliasul e permis și în GROUP BY (e o extensie, nu standardul), iar în WHERE nu funcționează în niciun de anvergură.
Ordinea e tocmai logică: ea descrie sensul interogării. Fizic, planificatorul e liber să rearanjeze pașii de dragul vitezei, dar rezultatul e obligat să coincidă cu ordinea logică.
SELECT, dar se execută cu FROM — aliasurile se nasc abia la pasul SELECT.Interview question
Întrebare de interviu: în ce ordine se execută logic o interogare SELECT și de ce aliasul din SELECT nu poate fi folosit în WHERE, dar în ORDER BY — da?
Răspuns puternic: ordinea logică e FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY → LIMIT. WHERE se execută înainte de calcularea listei SELECT, așa că la acel pas aliasurile încă nu există — expresia trebuie repetată (sau scoasă într-o subinterogare). ORDER BY se execută după SELECT, iar acolo aliasurile sunt deja vizibile. Fizic, optimizatorul poate rearanja pașii, dar rezultatul corespunde mereu ordinii logice.
AS într-o interogare?Результат запроса — тоже таблица
Когда ты выполняешь запрос, база возвращает результат в виде таблицы.
Например:
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