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