Понятия SQL. Синтаксис операторов, типы данных
Зачем SQL — и что он описывает?
Язык работы с реляционными данными. Декларативно задаёт структуру, изменение данных и требуемый результат.
Фокус: что должно получиться, а не как пошагово пройти каждую строку.
Стандарты развиваются
- SQL-92: развитое ядро языка.
- SQL:1999: SQL3, объектно-реляционные и процедурные возможности, рекурсия, триггеры.
- SQL:2016: в том числе стандартизованные возможности JSON.
Стандарт ≠ одинаковая реализация в каждой СУБД.
Пять учебных групп команд
| Класс | Задача | Примеры |
|---|---|---|
| DDL | Структура | CREATE, ALTER, DROP |
| DML | Изменение данных | INSERT, UPDATE, DELETE |
| DQL | Чтение/выборка | SELECT |
| DCL | Права | GRANT, REVOKE |
| TCL | Транзакции | COMMIT, ROLLBACK |
DQL — удобная учебная категория; некоторые классификации включают SELECT в DML.
Как читать запрос
SELECT выражение FROM источник WHERE условие ORDER BY выражение;
Ключевые слова · идентификаторы · литералы · выражения · условия · клаузы
Грамматика: SELECT
SELECT [DISTINCT] выражение [, ...] FROM источник [, ...] [WHERE условие] [GROUP BY выражение [, ...]] [HAVING условие] [ORDER BY выражение [ASC | DESC] [, ...]];
Скобки в схеме означают необязательные части, а не печатаемые символы.
DDL: тип — часть контракта
CREATE TABLE товар ( код BIGINT, название VARCHAR(120), цена NUMERIC(12,2), создан DATE );
Тип ограничивает значения и задаёт допустимые сравнения и вычисления.
Целые и вещественные числа
SMALLINT · INT · BIGINT — целые, диапазон зависит от реализации.
NUMERIC / DECIMAL(p,s) — точная десятичная арифметика.
REAL / DOUBLE PRECISION — приближённая плавающая точка; не для точных денег.
Строки: смысл важнее названия
CHAR(n) — фиксированная длина.
VARCHAR(n) — переменная строка с ограничением длины.
TEXT — длинный текст, семантика/лимиты зависят от СУБД.
Дата в VARCHAR теряет календарную семантику.
Дата, время, длительность
DATE — календарная дата · TIME — время суток.
TIMESTAMP WITH TIME ZONE — представление времени с учётом часового пояса; уточняйте поведение СУБД.
INTERVAL — промежуток/длительность.
Логика и специализированные типы
BOOLEAN · бинарные данные · UUID · JSON/JSONB · ARRAY
JSONB, ::, FLOAT[], генераторы UUID ниже — PostgreSQL-специфичные примеры.
Портируемость всегда проверяют по целевой СУБД.
Явное приведение типов
SELECT CAST('42' AS INTEGER);
SELECT CAST('2026-10-01' AS DATE);Намерение видно в запросе. Невалидная строка, переполнение и потеря точности всё равно дают ошибку/изменение значения.
Неявное и диалектное приведение
-- Стандартная форма CAST(значение AS тип) -- PostgreSQL значение::тип
Неявные преобразования зависят от контекста и СУБД. Не полагайтесь на них вместо корректного проектирования типов.
Быстрый выбор: четыре вопроса
- Каков предметный смысл значения?
- Каковы диапазон, точность и допустимая длина?
- Нужны точные или приближённые вычисления?
- Какие ограничения у выбранной СУБД?
Точная цена → NUMERIC/DECIMAL; измерение с погрешностью → REAL/DOUBLE.
SQL-мем: Little Bobby Tables
Когда данные выглядят как команда — это всё ещё данные. Разделяйте SQL-код и значения параметрами.
Randall Munroe, “Exploits of a Mom”, xkcd #327 (2007), автор оригинала и изображения — Randall Munroe; лицензия Creative Commons Attribution-NonCommercial 2.5 (CC BY-NC 2.5). Изображение встроено автономно как data:image/jpeg;base64.
Принцип: параметризованные запросы, а не склейка пользовательского текста в SQL.