Anatomija SELECT: kaj vzamemo in kako poimenujemo
What you'll learn
- pisati minimalne poizvedbe
SELECT stolpci FROM tabelain stolpce poimenovati z vzdevki prekAS - razložiti logični vrstni red izvajanja poizvedbe:
FROM→WHERE→SELECT→ORDER BY→LIMIT - popraviti napako »column does not exist« tako, da v
WHEREnamesto vzdevka ponoviš izraz - ločiti mesta, kjer je vzdevek že viden (
ORDER BY), od mest, kjer še ne obstaja (WHERE)
2. poglavje — »Prvi dostop«
Popis je prebran — in QUERY drži obljubo. Sredi dvorane se z mehkim klikom razgrne jantarni holopanel: bralni terminal se odpre pod tvojim računom. Kazalka utripa v prazni vrstici. Arhiv je pripravljen odgovarjati — a odgovarja le na pravilno zastavljena vprašanja. Poizvedba je protokol dostopa: vsaka beseda v njej stoji točno na svojem mestu.
QUERY: Terminal je tvoj. Z arhivom govori kratko in natančno: ni gluh, le na nerazločno ne odgovarja.
Iz česa je sestavljena bralna poizvedba
Vsak pogovor z arhivom Kotomarketa se začne s preprostim vprašanjem: katera polja potrebuješ in od kod jih vzeti. Minimalna poizvedba odgovori prav na to:
SELECT stolpci FROM tabela.
- za
SELECT— seznam želenih stolpcev, ločenih z vejicami (ali*za vse); - za
FROM— tabela, iz katere jemljemo podatke.
Stolpcu v rezultatu lahko daš človeško ime — vzdevek prek AS. Podatki se ne spremenijo: stolpec preprosto poimenuješ tako, da se izpis bere kot izložba trgovine in ne kot skladiščna dobavnica iz leta 2024.

SELECT iz tabele potegne samo želene stolpce — in jih poimenuje prek 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 in price sta takoj poimenovana kot človeku berljiva stolpca.| товар | цена |
|---|---|
| Беспроводные наушники | 5990.00 |
| Смарт-часы | 8990.00 |
| Портативная колонка | 3490.00 |
| Веб-камера HD | 2790.00 |
| Механическая клавиатура | 4590.00 |
Arhiv bere poizvedbo drugače, kot jo pišeš
Poizvedbo pišeš od zgoraj navzdol: najprej SELECT, nato FROM. Arhiv jo izvede v drugem — logičnem — vrstnem redu:
FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY → LIMIT
Najprej baza odloči, od kod vzeti vrstice, nato jih prefiltrira, združi in prefiltrira skupine (GROUP BY in HAVING boš srečal v 3. modulu) — in šele nato izračuna sam seznam SELECT, vključno z vzdevki. Nazadnje delujeta razvrščanje in obrez rezultata.
Od tod klasika, ki jo sprašujejo skoraj na vsakem razgovoru: vzdevek iz SELECT ni viden v WHERE — v trenutku filtriranja še ne obstaja:
-- Tako ne gre: na koraku WHERE vzdevka sale_price še ni
SELECT name, price * 0.9 AS sale_price
FROM products
WHERE sale_price < 3000; -- ERROR: column "sale_price" does not exist
-- Tako gre: izraz ponovimo
SELECT name, price * 0.9 AS sale_price
FROM products
WHERE price * 0.9 < 3000;
Zato pa ORDER BY sale_price deluje: razvrščanje se izvede po SELECT, ko vzdevek že obstaja. V PostgreSQL je vzdevek dovoljen tudi v GROUP BY (to je razširitev, ne standard), v WHERE pa ne deluje v nobenem večjem -u.
Vrstni red je ravno logičen: opisuje pomen poizvedbe. Fizično lahko načrtovalnik korake prerazporeja zaradi hitrosti, a rezultat se mora ujemati z logičnim vrstnim redom.
SELECT, izvaja pa s FROM — vzdevki se rodijo šele na koraku SELECT.Interview question
Vprašanje z razgovora: v kakšnem vrstnem redu se logično izvede poizvedba SELECT in zakaj vzdevka iz SELECT ni mogoče uporabiti v WHERE, v ORDER BY pa ga je?
Močan odgovor: logični vrstni red: FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY → LIMIT. WHERE se izvede pred izračunom seznama SELECT, zato vzdevki na tem koraku še ne obstajajo — izraz je treba ponoviti (ali ga prenesti v podpoizvedbo). ORDER BY se izvede po SELECT, kjer so vzdevki že vidni. Fizično lahko optimizator korake prerazporeja, a rezultat se vedno ujema z logičnim vrstnim redom.
AS?Результат запроса — тоже таблица
Когда ты выполняешь запрос, база возвращает результат в виде таблицы.
Например:
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