Оператор SELECT — синтаксис и стиль
SELECT — главный способ прочитать данные — что показать, откуда, какие строки оставить (WHERE), в каком порядке (ORDER BY). JOIN, группировка и подзапросы почти всегда строятся вокруг этого каркаса.
Перед чтением: Операторы — общие понятия оператора, операнда, приоритетов и типов операций; здесь те же идеи в синтаксисе запросов.
Логическая структура SELECT
Текстовый порядок предложений в запросе не совпадает с порядком выполнения СУБД:
SELECT /* проекция: столбцы и выражения */
FROM /* источник: таблица, представление, подзапрос */
WHERE /* фильтрация строк до группировки */
GROUP BY /* группировка — при наличии агрегатов */
HAVING /* фильтрация групп */
ORDER BY /* сортировка результата */
LIMIT /* ограничение числа строк — PostgreSQL */
Логический порядок выполнения для простого запроса без группировки:
FROM— формирование исходного множества строк;WHERE— отбор по предикату;SELECT— вычисление выражений и проекция столбцов;ORDER BY— сортировка;LIMIT/OFFSET— обрезка результата.
Псевдоним столбца из SELECT нельзя использовать в WHERE того же уровня — WHERE выполняется раньше проекции.
Подробная схема с JOIN, HAVING, оконными функциями: Принципы работы SQL-движка.
Краткая шпаргалка — конструкции чтения
Основные ключевые слова в SELECT-запросе и их роль (как в учебных шпаргалках по SQL):
| Конструкция | Назначение |
|---|---|
| SELECT | Какие столбцы и выражения вернуть клиенту |
| FROM | Откуда брать строки (таблица, представление, подзапрос) |
| WHERE | Отфильтровать строки до группировки |
| AS | Псевдоним столбца или таблицы в этом запросе |
| JOIN | Собрать строки из двух и более таблиц по условию связи |
| AND / OR | Несколько условий: должны выполниться все / хотя бы одно |
| IN | Значение входит в заданный список |
| LIKE | Поиск по шаблону (%, _) |
| IS NULL | Строки, где значение отсутствует |
| CASE | Условное значение в выражении (аналог if в проекции) |
| GROUP BY | Сгруппировать строки для агрегатов |
| HAVING | Отфильтровать группы (как WHERE, но после GROUP BY) |
| ORDER BY | Порядок строк в ответе; DESC — по убыванию |
| LIMIT | Сколько строк вернуть (в SQL Server — TOP, в стандарте — FETCH) |
SELECT в тексте запроса пишут первым, но СУБД обрабатывает блоки в логическом порядке. Агрегаты (COUNT, SUM, …) — в Фильтрации и группировке; типы JOIN — в Алиасы, JOIN и объединение таблиц.
Play ITЗагрузка интерактивного демо…
Проекция данных
-- Явный список столбцов (рекомендуется в прикладном коде)
SELECT product_id, name, price FROM products;
-- Все столбцы — только для отладки
SELECT * FROM products;
-- Вычисляемый столбец и псевдоним
SELECT name, price, price * 1.2 AS price_with_vat FROM products;
-- Уникальные значения столбца
SELECT DISTINCT category FROM products;
Фильтрация WHERE
| Конструкция | Назначение |
|---|---|
=, <>, <, <=, >, >= | Сравнение |
IS NULL, IS NOT NULL | Проверка отсутствия значения |
BETWEEN a AND b | Диапазон включительно |
IN (...) | Принадлежность списку |
LIKE 'шаблон' | % — любая длина, _ — один символ |
ILIKE | Регистронезависимый поиск (PostgreSQL) |
AND, OR, NOT | Приоритет: NOT > AND > OR; скобки обязательны |
Трёхзначная логика: сравнение с NULL через = или <> даёт UNKNOWN, а не TRUE/FALSE. Условие WHERE price = NULL не вернёт строк — используйте IS NULL / IS NOT NULL.
Код ITЗагрузка примера кода…
Сортировка ORDER BY
SELECT name, price FROM products ORDER BY price DESC;
SELECT category, name, price
FROM products
ORDER BY category ASC, price DESC;
-- PostgreSQL: явная позиция NULL
SELECT name, stock_qty
FROM products
ORDER BY stock_qty NULLS LAST;
Сортировка по номеру столбца (ORDER BY 2) допустима, но снижает читаемость — предпочтительны имена.
Правила форматирования
- Каждое предложение
SELECT,FROM,WHERE,ORDER BY— с новой строки. - Список из более двух столбцов — по одному на строку.
- Бинарные операторы окружают пробелами:
price = 100, неprice=100. - Сложные условия
WHEREвыравнивают поAND/OR. - Нетривиальные условия поясняют комментарием
--. - При частом включении и отключении фильтров вручную начинайте
WHEREс1 = 1, дальше только строкиAND— подробнее в шаблон WHERE 1=1.
Пример оформления:
Код ITЗагрузка примера кода…
Тестовые данные для практики
Код ITЗагрузка примера кода…
Готовые запросы на похожей схеме магазина (фильтр по цене, даты, сортировка) с разбором каждой строки — SQL — реальные кейсы. Полный DDL и заказы — практикум shop_data.
Контрольные вопросы
- Почему
WHERE price = NULLне возвращает строк? - В каком порядке СУБД выполняет
FROM,WHEREиSELECT? - Чем
SELECT *отличается от явного списка столбцов при изменении схемы таблицы? - Почему
LIKE 'ABC%'может использовать индекс, аLIKE '%ABC'— обычно нет?
См. также
- Фильтрация и группировка в SQL
- Алиасы, JOIN и объединение таблиц
- Чтение и анализ сложных SQL-запросов
- SQL — реальные кейсы —
SELECT,WHERE,ORDER BYна схеме магазина с разбором по строкам