Anatomija ta' SELECT: x'niġbdu u kif insejħulu
What you'll learn
- tikteb mistoqsijiet minimi
SELECT kolonni FROM tabellau tagħti isem lill-kolonni b' permezz ta'AS - tispjega l-ordni loġiku tal-eżekuzzjoni ta' mistoqsija:
FROM→WHERE→SELECT→ORDER BY→LIMIT - issewwi l-iżball «column does not exist», billi ttenni l-espressjoni minflok l-alias fil-
WHERE - tagħraf il-postijiet fejn l-alias diġà jidher (
ORDER BY) minn dawk fejn għadu ma jeżistix (WHERE)
Kapitlu 2 — «L-Ewwel Awtorizzazzjoni»
L-inventarju nqara — u QUERY iżomm kelmtu. F'nofs is-sala, b'tikk artab, tinfetaħ holopanel ambra: it-terminal tal-qari jinfetaħ taħt il-kont tiegħek. Il-cursor jteptep f'ringiela vojta. L-arkivju lest iwieġeb — imma jwieġeb biss għal mistoqsijiet magħmula sew. Mistoqsija hija protokoll ta' awtorizzazzjoni: kull kelma fiha tinsab eżatt fejn tappartjeni.
QUERY: It-terminal tiegħek. Kellem lill-arkivju qasir u preċiż: mhux trux, sempliċement ma jweġibx lil min ma jiftiehemx.
Minn xiex hija magħmula mistoqsija ta' għażla
Kull konverżazzjoni mal-arkivju ta' «Kotomarket» tibda b'mistoqsija sempliċi: liema oqsma teħtieġ u minn fejn tieħodhom. Il-mistoqsija minima twieġeb eżatt dan:
SELECT kolonni FROM tabella.
- wara
SELECT— il-lista tal-kolonni li teħtieġ, mifruda b'virgola (jew*għal kollha); - wara
FROM— it-tabella li minnha niġbdu d-data.
Lil kolonna fir-riżultat tista' tagħtiha isem uman — permezz ta' AS. Id-data ma tinbidilx: int sempliċement tagħti isem lill-kolonna biex ir-riżultat jinqara bħal vetrina ta' ħanut, u mhux bħal nota tal-maħżen mill-2024.

SELECT jiġbed mit-tabella biss il-kolonni li teħtieġ — u jagħtihom isem permezz ta' 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 u price mill-ewwel jingħataw isem ta' kolonni umani.| товар | цена |
|---|---|
| Беспроводные наушники | 5990.00 |
| Смарт-часы | 8990.00 |
| Портативная колонка | 3490.00 |
| Веб-камера HD | 2790.00 |
| Механическая клавиатура | 4590.00 |
L-arkivju jaqra l-mistoqsija mhux kif tiktibha int
Int tikteb il-mistoqsija minn fuq għal isfel: l-ewwel SELECT, imbagħad FROM. L-arkivju jeżegwiha f'ordni ieħor — loġiku:
FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY → LIMIT
L-ewwel id-database tiddeċiedi minn fejn tieħu r-ringieli, imbagħad tiffiltrahom, tiggruppahom u tiffiltra l-gruppi (GROUP BY u HAVING tiltaqa' magħhom fil-modulu 3) — u biss wara dan tikkalkula l-lista SELECT stess, l- inklużi. L-aħħar jaħdmu l-ordni u t-tqassir tar-riżultat.
Minn hawn tinbet il-klassika li tistaqsu kważi f'kull intervista: l-alias mill-SELECT ma jidhirx fil-WHERE — fil-mument tal-iffiltrar għadu ma jeżistix:
-- Hekk ma tistax: fil-pass WHERE l-alias sale_price għadu ma jeżistix
SELECT name, price * 0.9 AS sale_price
FROM products
WHERE sale_price < 3000; -- ERROR: column "sale_price" does not exist
-- Hekk tista': intennu l-espressjoni
SELECT name, price * 0.9 AS sale_price
FROM products
WHERE price * 0.9 < 3000;
Iżda ORDER BY sale_price jaħdem: l-ordni jsir wara SELECT, meta l-alias diġà jeżisti. Fil-PostgreSQL l-alias huwa permess ukoll fil-GROUP BY (din hija estensjoni, mhux l-istandard), filwaqt li fil-WHERE ma jaħdem fl-ebda kbira.
L-ordni huwa preċiżament loġiku: jiddeskrivi t-tifsira tal-mistoqsija. Fiżikament il-pjanifikatur huwa liberu jbiddel il-postijiet tal-passi għall-ħeffa, imma r-riżultat irid jaqbel mal-ordni loġiku.
SELECT, imma tiġi eżegwita b'FROM — l-aliases jitwieldu biss fil-pass SELECT.Interview question
Mistoqsija mill-intervista: f'liema ordni tiġi eżegwita loġikament mistoqsija SELECT u għaliex l- mill-SELECT ma jistax jintuża fil-WHERE, imma fil-ORDER BY — iva?
Tweġiba b'saħħitha: l-ordni loġiku: FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY → LIMIT. WHERE jiġi eżegwit qabel ma tiġi kkalkulata l-lista SELECT, għalhekk f'dan il-pass l-aliases għadhom ma jeżistux — l-espressjoni jkollok ittenniha (jew toħroġha f'). ORDER BY jiġi eżegwit wara SELECT, u l-aliases hemmhekk diġà jidhru. Fiżikament l-ottimizzatur jista' jbiddel il-postijiet tal-passi, imma r-riżultat dejjem jaqbel mal-ordni loġiku.
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