Перейти к основному содержимому

Оператор SELECT — синтаксис и стиль

SELECT — главный способ прочитать данные — что показать, откуда, какие строки оставить (WHERE), в каком порядке (ORDER BY). JOIN, группировка и подзапросы почти всегда строятся вокруг этого каркаса.

Разработчику Аналитику Тестировщику Архитектору

Перед чтением: Операторы — общие понятия оператора, операнда, приоритетов и типов операций; здесь те же идеи в синтаксисе запросов.


Логическая структура SELECT

Текстовый порядок предложений в запросе не совпадает с порядком выполнения СУБД:

SELECT /* проекция: столбцы и выражения */
FROM /* источник: таблица, представление, подзапрос */
WHERE /* фильтрация строк до группировки */
GROUP BY /* группировка — при наличии агрегатов */
HAVING /* фильтрация групп */
ORDER BY /* сортировка результата */
LIMIT /* ограничение числа строк — PostgreSQL */

Логический порядок выполнения для простого запроса без группировки:

  1. FROM — формирование исходного множества строк;
  2. WHERE — отбор по предикату;
  3. SELECT — вычисление выражений и проекция столбцов;
  4. ORDER BY — сортировка;
  5. 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.


Контрольные вопросы

  1. Почему WHERE price = NULL не возвращает строк?
  2. В каком порядке СУБД выполняет FROM, WHERE и SELECT?
  3. Чем SELECT * отличается от явного списка столбцов при изменении схемы таблицы?
  4. Почему LIKE 'ABC%' может использовать индекс, а LIKE '%ABC' — обычно нет?

См. также