Бази данни без мъгла

Първата полезна заявка

21 min
What you'll learn
  • да пишеш заявки с явен списък колони след SELECT и филтър на редовете през WHERE
  • да превеждаш бизнес въпрос в SQL по маршрута: същност → FROM, ограничения → WHEREAND), извеждане → SELECT, ред → ORDER BY
  • да обясняваш защо SELECT * е лоша практика в работни заявки
  • да проверяваш заявката с преразказ на глас: съвпадне ли преразказът с първоначалния въпрос — заявката е вярна по смисъл

Картата е изучена — и КВЕРИ сменя правилата. Досега разглеждаше архива изцяло, като турист; архивистът работи иначе. На холопанела угасва всичко освен една таблица и се появява задание: задай въпроса така, че в отговора да няма нито един излишен ред и нито една излишна колона.

Избираме нужните колони и редове

Да взимаш всичко през * е удобно за първо запознанство, но в реалната работа е като да донесеш на касата целия склад. Обикновено ти трябват конкретни полета: изброй ги през запетая след SELECT.

С редовете е същото: вместо цялата витрина избери само нужния сегмент през WHERE. Например, да помолим «Kotomarket» само за стоките от категория Книги:

Курсант стеснява с кехлибарен лъч-филтър холографската витрина: през лъча минават само няколко реда-капсули с книги
Точен въпрос към архива: SELECT назовава нужните колони, WHERE пропуска само нужните редове.

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:

Какви книги има на витрината и колко струват:
Query result
nameprice
SQL для профи1290.00
Чистый код1490.00
Алгоритмы на практике1690.00

От бизнес въпрос — към заявка

Истинските въпроси стигат до архивиста не на SQL: «кои книги са по-евтини от хиляда и петстотин?», «какво от електрониката е по-скъпо от 5000?». Преводът винаги върви по един маршрут:

  1. Същност → таблица. За какво е въпросът: за стоки, купувачи, поръчки? «Книги под 1500» е за стоки, значи FROM products.
  2. Ограничения → WHERE. Всяко условие от въпроса е отделно условие на филтъра: категория «Книги», цена под 1500.
  3. Какво да покажем → SELECT. Какво иска да види човекът в отговора? Названието и цената — тях изброяваме, останалото е шум.
  4. Форма на отговора → 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 * е уместен най-много при интерактивно изследване на данни.

Check yourself
Какво ще покаже заявката 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.