Първата полезна заявка
What you'll learn
- да пишеш заявки с явен списък колони след
SELECTи филтър на редовете презWHERE - да превеждаш бизнес въпрос в SQL по маршрута: същност →
FROM, ограничения →WHERE(сAND), извеждане →SELECT, ред →ORDER BY - да обясняваш защо
SELECT *е лоша практика в работни заявки - да проверяваш заявката с преразказ на глас: съвпадне ли преразказът с първоначалния въпрос — заявката е вярна по смисъл
Картата е изучена — и КВЕРИ сменя правилата. Досега разглеждаше архива изцяло, като турист; архивистът работи иначе. На холопанела угасва всичко освен една таблица и се появява задание: задай въпроса така, че в отговора да няма нито един излишен ред и нито една излишна колона.
Избираме нужните колони и редове
Да взимаш всичко през * е удобно за първо запознанство, но в реалната работа е като да донесеш на касата целия склад. Обикновено ти трябват конкретни полета: изброй ги през запетая след SELECT.
С редовете е същото: вместо цялата витрина избери само нужния сегмент през WHERE. Например, да помолим «Kotomarket» само за стоките от категория Книги:

Choosing the columns and rows you need
Grabbing everything with * is convenient for a first look, but in real work it’s like hauling the entire warehouse up to the checkout. Usually you need specific fields: list them, comma-separated, after SELECT.
It’s the same with rows: instead of the whole storefront, pick only the segment you need via WHERE. For example, let’s ask Kotomarket for only the products in the Books category:
| name | price |
|---|---|
| SQL для профи | 1290.00 |
| Чистый код | 1490.00 |
| Алгоритмы на практике | 1690.00 |
От бизнес въпрос — към заявка
Истинските въпроси стигат до архивиста не на SQL: «кои книги са по-евтини от хиляда и петстотин?», «какво от електрониката е по-скъпо от 5000?». Преводът винаги върви по един маршрут:
- Същност → таблица. За какво е въпросът: за стоки, купувачи, поръчки? «Книги под 1500» е за стоки, значи
FROM products. - Ограничения → WHERE. Всяко условие от въпроса е отделно условие на филтъра: категория «Книги», цена под 1500.
- Какво да покажем → SELECT. Какво иска да види човекът в отговора? Названието и цената — тях изброяваме, останалото е шум.
- Форма на отговора → ORDER BY. «От евтини към скъпи» е сортиране по цена.
-- «Какие книги дешевле 1500 и сколько они стоят, от дешёвых к дорогим?»
SELECT name, price
FROM products
WHERE category = 'Книги' AND price < 1500
ORDER BY price;
Няколко условия се съединяват с думата AND — подробно операторите на филтъра ще разгледаме в следващата глава.
И обратният навик на добрия архивист: прочети готовата заявка на глас като изречение. «От стоките да взема книгите под 1500, да покажа названието и цената, да сортирам по цена» — съвпадне ли преразказът с първоначалния въпрос, заявката е вярна по смисъл. Ако в преразказа изскочи «всички колони» или «цялата витрина» — върни се и стесни.
Interview question
Въпрос от интервю: защо SELECT * се смята за лоша практика в работни заявки?
Силен отговор: първо, излишни данни: мрежата и паметта се харчат за колони, които не са нужни, и базата губи възможността да отговори само по (index-only scan; индексите — Глава 10). Второ, крехкост: при добавяне или преименуване на колони се чупят отчети и код, разчитащи на състава и реда на колоните. Явният списък с колони е контрактът на заявката; SELECT * е уместен най-много при интерактивно изследване на данни.
SELECT name FROM products WHERE category = 'Книги'?The index has been read: you know what’s in the five tables and which threads stitch them together. QUERY dims the map, and the next clearance level lights up on the holopanel — the reading terminal.
QUERY: Remember the cardinal property of this place: the archive answers only well-formed questions. From the next clearance on, we learn to ask precisely.