Понятия SQL. Синтаксис операторов, типы данных

ОП.08 «Основы проектирования баз данных», занятие 29 · Тема 5. Организация запросов SQL

Цель конспекта: понять, как SQL описывает желаемый результат и структуру данных, а тип столбца задаёт допустимые значения и операции.

1. SQL: язык и стандарты

SQL (Structured Query Language) — декларативный язык работы с реляционными данными. В запросе указывают, что требуется получить, а не пошаговый алгоритм обхода хранилища. SQL формировался как реляционный язык и развивается через международные редакции стандарта ISO/IEC 9075. SQL-92 закрепил развитое общее ядро запросов и определения схемы; SQL:1999 (SQL3) расширил стандартизованные объектно-реляционные и процедурные возможности, включая рекурсивные запросы и триггеры; SQL:2016 включил стандартизованные возможности JSON. Реальные СУБД реализуют стандарты частично и дополняют их собственным диалектом.

Важно: стандарт задаёт общий контракт, но не гарантирует полную взаимозаменяемость приложений и баз. Проверяйте документацию и целевую СУБД.

2. Подмножества SQL

SQL │ ┌───────────────┼─────────────────────────┐ │ │ │ │ DDL DML DCL TCL структура данные привилегии транзакции CREATE INSERT GRANT COMMIT ALTER UPDATE REVOKE ROLLBACK DROP DELETE SAVEPOINT │ └── DQL — запросы чтения (обычно SELECT) учебная классификация; часто SELECT включают в широкое понимание DML

Границы классификации в учебниках не полностью единообразны: DQL удобно выделять для акцента на чтении данных. Команда SELECT обычно называется DQL, но в широкой классификации считается DML.

3. Из чего состоит оператор

Грамматика задаёт допустимые последовательности токенов. Ключевые слова задают конструкцию; идентификаторы называют объекты; литералы записывают значения; выражения вычисляют значения; условия отбирают строки. Квадратные скобки в учебных схемах обозначают необязательную часть и обычно не вводятся в сам запрос.

Оператор SQL ├── ключевые слова (SELECT, FROM, WHERE) ├── идентификаторы (имя таблицы, столбца) ├── литералы (42, 'Сургут', DATE '2026-10-01') ├── выражения (цена * количество) ├── условия (статус = 'новый') └── клаузулы (FROM, WHERE, GROUP BY, ORDER BY)
SELECT [DISTINCT] выражение [, выражение ...]
FROM источник [, источник ...]
[WHERE условие]
[GROUP BY выражение [, ...]]
[HAVING условие]
[ORDER BY выражение [ASC | DESC] [, ...]];

Пример:

SELECT товар, цена * количество AS сумма
FROM позиция_заказа
WHERE количество > 0
ORDER BY сумма DESC;

; часто обозначает конец оператора. Строковые значения берутся в одинарные кавычки; кавычки для идентификаторов зависят от СУБД. Порядок клауз важен.

Определение структуры

CREATE TABLE заказ (
  номер BIGINT,
  создан DATE,
  сумма NUMERIC(12, 2)
);

4. Как выбирать тип столбца

  1. Определить смысл значения и допустимые операции.
  2. Установить диапазон, точность, длину и возможность отсутствия значения.
  3. Выбрать точное или приближённое представление.
  4. Проверить ограничения выбранной СУБД и согласовать формат с приложением.
  5. Не хранить число, дату или логическое значение как текст без предметной причины.

Тип — часть контракта данных: он влияет на допустимые значения, сравнение, сортировку, вычисления и хранение.

5. Сводная матрица типов

КатегорияТипы/примерыКогда применятьОсторожно
ЦелыеSMALLINT, INT/INTEGER, BIGINTСчётчики, целые количества, ключи с нужным диапазономДиапазон и размер зависят от реализации
Точные числаNUMERIC(p,s), DECIMAL(p,s)Денежная сумма, точные десятичные величиныВыбирайте достаточные точность p и масштаб s
ПриближённыеREAL, DOUBLE PRECISIONИзмерения, вычисления с допустимой погрешностьюДвоичная плавающая точка не гарантирует точность десятичной дроби
СимвольныеCHAR(n), VARCHAR(n), TEXTКод фиксированной длины; имя/строка; длинный текстОграничения длины и поведение TEXT зависят от СУБД; CHAR может дополняться пробелами
Дата/времяDATE, TIME, TIMESTAMP WITH TIME ZONE, INTERVALКалендарная дата, локальное время, момент, длительностьВременные зоны и арифметика — источник межСУБД-различий
ЛогическийBOOLEANИстинностный признакNULL добавляет состояние UNKNOWN в логические выражения
БинарныйBINARY, VARBINARY; BYTEA в PostgreSQLПоследовательности байтовИмена не переносимы между СУБД
ИдентификаторUUIDГлобально уникальный идентификаторТип и генератор UUID специфичны для СУБД
Структурированные данныеJSON; JSONB (PostgreSQL)Документ с полями переменной структурыJSONB — PostgreSQL; не заменяет продуманную реляционную модель автоматически
КоллекцииARRAY (например, FLOAT[] в PostgreSQL)Упорядоченный набор однотипных значенийПоддержка и запросы не универсальны

Записи JSONB, ::, FLOAT[] и многие UUID-функции ниже — примеры PostgreSQL, не требование стандарта к каждой СУБД.

6. Приведение типов

Явное: разработчик задаёт целевой тип и делает намерение видимым.

SELECT CAST('42' AS INTEGER);
SELECT CAST('2026-10-01' AS DATE);
-- PostgreSQL:
SELECT '42'::INTEGER;

Неявное: СУБД преобразует значение по правилам совместимости контекстно, например в выражении. Полагаться на это рискованно: результат, ошибки и правила могут отличаться.

7. Самопроверка

  1. Почему SQL называют декларативным языком?
  2. К каким учебным подмножествам отнести CREATE TABLE, UPDATE, SELECT, GRANT, COMMIT?
  3. Какие части присутствуют в SELECT-запросе, и каков порядок клауз?
  4. Какой тип выбрать для цены с двумя знаками после запятой? Почему FLOAT не равнозначен NUMERIC?
  5. Чем CHAR отличается от VARCHAR по смыслу?
  6. Когда достаточно DATE, а когда нужен TIMESTAMP?
  7. Что означает NULL в логическом выражении?
  8. Запишите явное преобразование строки '42' в INTEGER стандартной формой.
  9. Что сообщает о диалекте запись value::INTEGER?
  10. Почему нельзя утверждать, что JSONB — универсальный стандартный тип каждой СУБД?
Краткие ответы для самопроверки
  1. Описывает требуемый результат/операцию, не алгоритм исполнения.
  2. DDL; DML; DQL (либо широкое DML); DCL; TCL.
  3. SELECT, FROM, WHERE, GROUP BY, HAVING, ORDER BY — по порядку.
  4. NUMERIC/DECIMAL подходящей точности.
  5. Фиксированная и переменная длина; детали хранения задаёт реализация.
  6. DATE — календарный день; TIMESTAMP — дата и время/момент.
  7. UNKNOWN, третье значение логики SQL.
  8. CAST('42' AS INTEGER).
  9. Это PostgreSQL-синтаксис.
  10. JSONB — расширение PostgreSQL; другие платформы имеют собственную поддержку.