Базы данных без тумана

Первый полезный запрос

21 мин
Чему научишься
  • писать запросы с явным списком столбцов после SELECT и фильтром строк через WHERE
  • переводить бизнес-вопрос в SQL по маршруту: сущность → FROM, ограничения → WHEREAND), вывод → SELECT, порядок → ORDER BY
  • объяснять, почему SELECT * — плохая практика в рабочих запросах
  • проверять запрос пересказом вслух: пересказ совпал с исходным вопросом — запрос верен по смыслу

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

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

Выбираем нужные столбцы и строки

Брать всё через * удобно для первого знакомства, но в реальной работе это как принести на кассу весь склад. Обычно тебе нужны конкретные поля: перечисли их через запятую после SELECT.

Со строками так же: вместо всей витрины выбери только нужный сегмент через WHERE. Например, попросим у «Котомаркета» только товары из категории Книги:

Какие книги есть на витрине и сколько они стоят:

Из бизнес-вопроса — в запрос

Настоящие вопросы приходят к архивисту не на 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, показать название и цену, отсортировать по цене» — если пересказ совпал с исходным вопросом, запрос верен по смыслу. Если в пересказе всплыло «все столбцы» или «вся витрина» — вернись и сузь.

Вопрос с собеседования

Вопрос с собеседования: почему SELECT * считается плохой практикой в рабочих запросах?

Сильный ответ: во-первых, лишние данные: сеть и память тратятся на столбцы, которые не нужны, и база теряет возможность ответить только по индексу (index-only scan; — Глава 10). Во-вторых, хрупкость: при добавлении или переименовании столбцов ломаются отчёты и код, рассчитывающий на состав и порядок колонок. Явный список столбцов — это контракт запроса; SELECT * уместен разве что в интерактивном исследовании данных.

Проверь себя
Что покажет запрос SELECT name FROM products WHERE category = 'Книги'?

Опись прочитана: ты знаешь, что лежит в пяти таблицах и какими нитями они сшиты. КВЕРИ гасит карту, и на голопанели загорается следующий уровень допуска — терминал чтения.

КВЕРИ: Запомни главное свойство этого места: архив отвечает только на правильно заданные вопросы. Со следующего допуска учимся спрашивать точно.

Закрепление: реши задачи
Решено 0 из 3 · для зачёта достаточно 2