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

Зачем SQL — и что он описывает?

Язык работы с реляционными данными. Декларативно задаёт структуру, изменение данных и требуемый результат.

Фокус: что должно получиться, а не как пошагово пройти каждую строку.

Стандарты развиваются

Стандарт ≠ одинаковая реализация в каждой СУБД.

Пять учебных групп команд

КлассЗадачаПримеры
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
значение::тип

Неявные преобразования зависят от контекста и СУБД. Не полагайтесь на них вместо корректного проектирования типов.

Быстрый выбор: четыре вопроса

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

Точная цена → NUMERIC/DECIMAL; измерение с погрешностью → REAL/DOUBLE.

SQL-мем: Little Bobby Tables

Когда данные выглядят как команда — это всё ещё данные. Разделяйте SQL-код и значения параметрами.

xkcd: Exploits of a Mom — Little Bobby Tables

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.