Один запрос, одна таблица — но с контролем над строками, порядком и объёмом. Тот самый фундамент, на который встанут JOIN, агрегации и оконные функции.
Поймёшь реальный порядок выполнения запроса (не тот, в котором он написан) — и почему это объясняет
половину «странностей» SQL. Освоишь точную фильтрацию: BETWEEN, IN, LIKE/ILIKE,
сортировку с NULLS LAST и постраничный вывод LIMIT/OFFSET.
Ты пишешь запрос так: 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) алиас уже доступен.| Приём | Пример | Смысл |
|---|---|---|
| Сравнение | 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.
Пиши запрос, жми «Проверить» (⌘/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.