SQL · Postgres

Тема 01 — SELECT вглубь

Один запрос, одна таблица — но с контролем над строками, порядком и объёмом. Тот самый фундамент, на который встанут JOIN, агрегации и оконные функции.

Что заберёшь с урока

Поймёшь реальный порядок выполнения запроса (не тот, в котором он написан) — и почему это объясняет половину «странностей» SQL. Освоишь точную фильтрацию: BETWEEN, IN, LIKE/ILIKE, сортировку с NULLS LAST и постраничный вывод LIMIT/OFFSET.

Главный источник по теме PostgreSQL Docs — Queries и SELECT (справка по всем частям). Второе объяснение простыми словами — Mode SQL Tutorial.

§1 Порядок, в котором SQL реально работает

Ты пишешь запрос так: SELECT … FROM … WHERE … ORDER BY …. Но Postgres выполняет его в другом порядке:

FROM      → взять таблицу (источник строк)
WHERE     → отфильтровать строки (по одной)
SELECT    → выбрать/вычислить столбцы, задать алиасы
DISTINCT  → убрать дубликаты
ORDER BY  → отсортировать
LIMIT/OFFSET → отрезать нужный кусок

Отсюда практический вывод: в WHERE ещё нет алиасов из SELECT — ведь WHERE считается раньше. А в ORDER BY алиас уже можно, потому что он идёт после SELECT.

Проверка: почему алиас из SELECT нельзя использовать в WHERE?

Верно: WHERE выполняется раньше SELECT, поэтому алиас, заданный в SELECT, в WHERE ещё не существует. В ORDER BY (он после SELECT) алиас уже доступен.

§2 Инструменты фильтрации и вывода

ПриёмПримерСмысл
Сравнениеprice >= 50, status <> 'paid'<> — «не равно»
Диапазонprice BETWEEN 20 AND 40границы включаются
Списокcategory_id IN (1, 5)одно из значений
Шаблонname LIKE 'C%'% — любые символы, _ — один
Шаблон без регистраname ILIKE '%smith%'Postgres: ILIKE игнорирует регистр
Только уникальныеSELECT DISTINCT status …убрать повторы строк
СортировкаORDER BY price DESC, nameнесколько ключей; DESC — по убыванию
NULL в конецORDER BY country NULLS LASTкуда девать NULL при сортировке
ПостраничноLIMIT 3 OFFSET 3взять 3 строки, пропустив первые 3

Поиграй вживую: поменяй условие, добавь ORDER BY, попробуй LIMIT.


§3 Практика · 12 упражнений

решено 0 / 12

Пиши запрос, жми «Проверить» (⌘/Ctrl+Enter). Сначала пробуй сам; подсказка и решение — рядом, но бери их только когда действительно застрял (усилие памяти = прочный навык). Держи схему под рукой.

1. Выведи name всех товаров из категории с category_id = 2 (Books).

2. Выведи name и price товаров, чья цена от 20 до 40 включительно. Используй BETWEEN.

3. Выведи все различные значения status из таблицы orders (без повторов).

4. Пять самых дешёвых товаров: name и price, по возрастанию цены. (важен порядок)

5. Выведи name и category_id товаров из категорий 1 или 5. Используй IN.

6. Выведи name товаров, чьё название начинается на «C». Используй LIKE.

7. Найди покупателя, в чьём имени встречается smith без учёта регистра. Выведи name.

8. Отсортируй товары по цене по убыванию и выведи вторую «страницу» по 3 товара — то есть name и price для мест 4–6. Используй LIMIT и OFFSET. (важен порядок)

9. Выведи name, category_id, price товаров, которые либо из категории 1 и дешевле 50, либо дороже 100 (независимо от категории). Следи за скобками!

10. Выведи category_id, name, price всех товаров: сначала по category_id по возрастанию, а внутри категории — по price по убыванию. (важен порядок)

11. Выведи name и country всех покупателей: отсортируй по country по алфавиту, покупателей без страны (NULL) — в самый конец, а при равной стране — по name. (важен порядок)

12. Капстоун. Три самых свежих заказа со статусом paid: выведи order_id и created_at, самые новые сверху. (важен порядок)

Частая ловушка

Строки в SQL — в одинарных кавычках: 'paid', не "paid". Двойные кавычки в Postgres означают имя столбца/таблицы, а не текст. И помни: ORDER BY без явного ASC/DESC — это ASC.