Оператор SELECT — синтаксис и стиль
Логическая структура 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 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.
SELECT name, price
FROM products
WHERE category = 'Книги'
AND stock_qty > 0
AND price BETWEEN 300 AND 1000;
SELECT name FROM products WHERE name LIKE 'А%';
SELECT name, price, stock_qty
FROM products
WHERE (category = 'Аксессуары' AND price < 1000)
OR stock_qty = 0;
-- NULL: только IS NULL / IS NOT NULL
SELECT name, price FROM products WHERE price IS NULL;
SELECT name, price FROM products WHERE price IS NOT NULL;
Сортировка 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. - Нетривиальные условия поясняют комментарием
--.
Пример оформления:
SELECT
product_id,
name,
category,
price,
stock_qty
FROM products
WHERE
category IN ('Книги', 'Аксессуары')
AND price BETWEEN 100 AND 1500
AND stock_qty > 0
ORDER BY
category ASC,
price DESC;
Тестовые данные для практики
CREATE TABLE products (
product_id SERIAL PRIMARY KEY,
sku VARCHAR(20) NOT NULL,
name TEXT NOT NULL,
category VARCHAR(30),
price NUMERIC(10, 2) NOT NULL,
stock_qty INTEGER NOT NULL DEFAULT 0,
created_at DATE NOT NULL
);
INSERT INTO products (sku, name, category, price, stock_qty, created_at) VALUES
('BOOK-001', 'Алгоритмы', 'Книги', 799.00, 15, '2023-01-15'),
('BOOK-002', 'SQL для профессионалов', 'Книги', 1299.00, 0, '2023-02-20'),
('GADGET-001', 'USB-кабель', 'Аксессуары', 299.00, 42, '2023-03-10'),
('GADGET-002', 'Power bank', 'Аксессуары', 1499.00, 8, '2023-03-12'),
('OFFICE-001', 'Блокнот', 'Канцелярия', 99.00, 120, '2023-01-30');
Контрольные вопросы
- Почему
WHERE price = NULLне возвращает строк? - В каком порядке СУБД выполняет
FROM,WHEREиSELECT? - Чем
SELECT *отличается от явного списка столбцов при изменении схемы таблицы? - Почему
LIKE 'ABC%'может использовать индекс, аLIKE '%ABC'— обычно нет?
См. также
- Фильтрация и группировка в SQL
- Алиасы, JOIN и объединение таблиц
- Чтение и анализ сложных SQL-запросов
См. также
Другие статьи этого же раздела в боковом меню (как на странице «О разделе»). Вот SQL как раз обеспечивает такую связь и это главное отличие реляционных БД - реляции (relations), что означает связи. Знакомимся с языком - ставим программы, запускаем, выполняем первые запросы. От файлового хранения к реляционной и современной мультимодельной СУБД — термины, причины появления SQL и базовая классификация систем. Домены, атрибуты, кортежи и отношения — свойства реляционных таблиц и ограничения целостности при проектировании схемы. Функциональные зависимости, нормальные формы 1НФ–3НФ, аномалии обновления и осознанная денормализация при проектировании схемы. Метаданные СУБД через information_schema и pg_catalog — запросы к структуре таблиц, ключей и индексов в PostgreSQL. Логическое и физическое резервное копирование, pg_dump, pg_restore, WAL и восстановление на точку во времени (PITR). Скалярные и коррелированные подзапросы, EXISTS против IN, особенности NULL и выбор между подзапросом и JOIN. AND, OR, NOT, приоритет операторов, NULL и UNKNOWN, IS NULL, NOT IN и IS DISTINCT FROM в PostgreSQL. MVCC, уровни блокировок таблиц, FOR UPDATE, SKIP LOCKED, взаимоблокировки и диагностика через pg_locks. Учебная схема интернет-магазина для PostgreSQL — DDL и примеры запросов по темам курса SQL. Принципы работы SQL-движка - подключение к СУБД, разбор и выполнение запроса и возврат результата клиенту.SQL - язык структурированных запросов
Первые шаги с SQL
Эволюция систем хранения данных
Реляционная модель данных
Нормализация данных
Словарь данных и системные каталоги
Резервное копирование и восстановление PostgreSQL
Подзапросы, EXISTS и IN
Фильтрация и трёхзначная логика
Блокировки и конкурентный доступ в PostgreSQL
Практикум shop_data
Принципы работы SQL-движка