Основы языка SQL

Назначение языка и типы данных

В лекции излагаются основы языка SQL: его происхождение, назначение, логика стандартизации и возникновения диалектов. Раскрывается двойственная природа языка как средства определения структур данных (DDL) и манипулирования ими (DML). Детально анализируются встроенные типы данных — от целочисленных и строковых с фиксированной/переменной длиной до чисел с плавающей точкой и точного десятичного типа. На примерах показаны компромиссы между точностью хранения и возможностью вычислений, а также обсуждается уместность применения BLOB. Завершается материал переходом к практическому освоению DDL.

Основные мысли

В результате изучения лекции слушатель будет способен:
1. Дать определение языка SQL и его основных подмножеств (DDL, DML).
2. Объяснить роль стандартов SQL и причины возникновения диалектов у различных производителей СУБД.
3. Классифицировать встроенные типы данных по категориям (строковые, числовые, для даты/времени, бинарные).
4. Аргументировать выбор между типами CHAR и VARCHAR в зависимости от характера хранимых строк.
5. Описать внутреннее различие хранения чисел в типах FLOAT и DECIMAL.
6. Спрогнозировать возможные проблемы округления при использовании типа FLOAT и пути их решения через DECIMAL.
7. Определить ситуации, в которых применение типа BLOB нерационально, и предложить альтернативы.
8. Осознать ограничения типа DECIMAL при выполнении арифметических операций, ведущих к выходу за пределы заданной точности.
Показывать лекцию целиком
Краткое изложение

Примеры запросов для курса: SQL-Examples

Онлайн тренажёр: https://www.sql-ex.ru/

Введение в SQL и его предназначение

SQL (Structured Query Language, язык структурированных запросов) — это язык, предназначенный для манипулирования данными и структурами внутри базы данных. Он появился вместе с концепцией реляционных баз данных как необходимый инструмент для работы с ними. Впоследствии был выработан базовый стандарт операций, который определяет, что язык должен уметь выполнять, и регламентирует схемы исполнения этих операций.

Современный рынок предлагает множество СУБД от разных производителей, каждый из которых реализует собственный диалект SQL. Эти диалекты, с одной стороны, поддерживают общепринятый стандарт, а с другой — добавляют уникальные расширения, присущие конкретной системе. Например, T-SQL (Transact-SQL) — это редакция SQL, реализованная в Microsoft SQL Server. В лекции для демонстрации синтаксиса используется SQL Firebird, однако на практике при написании кода будет применяться T-SQL.

SQL является полноценным языком программирования. Его возможности выходят далеко за рамки простого манипулирования данными: язык способен взаимодействовать с оперативной памятью, файловой системой, обращаться к файлам и изменять их содержимое, независимо от того, относятся ли эти файлы к базе данных. Изучение SQL в полном объёме — трудоёмкая задача, и под «знанием SQL» чаще всего понимают умение использовать его именно в контексте конкретной СУБД. Наш курс сфокусирован на основах, входящих в общий стандарт, а также на некоторых спецификах Microsoft SQL Server, не затрагивая сложные темы вроде оконных функций.

Стандарты и диалекты

Наличие стандартов обеспеивает единообразие базовых операций. Последним общепринятым стандартом является SQL:2003 — он реализован во всех современных базах данных. Более новые стандарты поддерживаются не повсеместно и постепенно внедряются вендорами. Стандарт пополняется по мере роста технических возможностей и закрепления тех или иных функций, часто используемых разработчиками.

Подмножества языка: DDL и DML

В любом диалекте SQL обязательно присутствуют два ключевых подмножества:
• DDL (Data Definition Language) — язык определения структур. С его помощью создаются базы данных, таблицы, изменяются их структуры (добавляются поля, меняются типы), задаются ограничения. DDL отвечает за работу с самой архитектурой данных.
• DML (Data Manipulation Language) — язык манипулирования данными. Он используется для добавления, удаления и изменения данных внутри таблиц.

Уникальность SQL в том, что оба этих подмножества реализованы в рамках одного языка, что позволяет и проектировать структуры, и наполнять их информацией с помощью единого инструмента.

Типы данных, поддерживаемые стандартом

Целочисленные типы

• INTEGER — для хранения целых чисел стандартной длины.
• SMALLINT — для коротких целых чисел. Отличается от INTEGER только объёмом занимаемой памяти и допустимым диапазоном.

Строковые типы: CHAR и VARCHAR

• CHAR(n) — строка фиксированной длины. Если в ячейку CHAR(10) записать слово «Привет» (6 символов), оставшиеся 4 позиции будут заполнены пробелами, и длина строки всегда будет равна 10. Этот тип рационально использовать, когда длина данных заранее известна и постоянна (например, табельный номер фиксированного формата).
• VARCHAR(n) — строка переменной длины. Максимальный размер ограничен *n*, но фактически хранится столько символов, сколько было вставлено. VARCHAR экономит память при хранении данных переменной длины, таких как имена или фамилии. Если для VARCHAR(50) вставить фамилию «Ким» (3 символа), будет выделено место под 3 символа, а не под 50, как в случае с CHAR.

Вещественные типы: FLOAT, DECIMAL, DOUBLE PRECISION

FLOAT и проблема точности

FLOAT предназначен для хранения чисел с плавающей запятой. Компьютер переводит десятичное число в двоичную систему. При этом конечная десятичная дробь может стать бесконечной двоичной. Поскольку бесконечный «хвост» хранить невозможно, число обрезается, что ведёт к хранению с определённой точностью. Последующие операции с таким числом могут дать результат, заметно отличающийся от ожидаемого (аналогично тому, как возведение в квадрат приближённого значения корня из трёх не даёт ровно три).

DECIMAL — точное десятичное хранение

DECIMAL(p, n) решает проблему точности: число хранится в исходном десятичном виде, без перевода в двоичную систему. Параметр *p* (precision) задаёт общее количество цифр, а *n* (scale) — количество цифр после запятой. Например, число 10,4 соответствует типу DECIMAL(3,1).
Арифметические операции с DECIMAL эмулируются по правилам десятичной арифметики, что гарантирует абсолютную точность хранения. Главный недостаток — жёсткие рамки типа: результат операции (например, деления) может не уместиться в заданные параметры *p* и *n*, что приведёт к ошибке или необходимости пересмотра точности. DECIMAL идеален для ситуаций, где данные нужно хранить абсолютно точно, а вычисления производятся во внешней системе.

DOUBLE PRECISION

DOUBLE PRECISION — это тип, использующий для хранения числа вдвое больше памяти по сравнению с FLOAT (8 байт против 4). Удвоенная длина «хвоста» позволяет хранить числа с более высокой точностью, чем стандартный FLOAT.

BLOB и бинарные данные

BLOB (Binary Large Object) служит для хранения больших объёмов бинарных данных: изображений, аудиозаписей, документов. Несмотря на такую возможность, хранить тяжёлые медиафайлы напрямую в реляционной базе данных зачастую нерационально. Это создаёт избыточную нагрузку на СУБД, усложняет отображение контента и управление им. Более логичным решением является использование облачных хранилищ или, в закрытых системах, FTP-серверов, а в базе данных хранить только ссылки на эти файлы.

Типы для даты и времени

Типы DATETIME и их разновидности — неотъемлемый компонент любой базы данных, позволяющий хранить значения даты и времени.

Пользовательские типы данных

Большинство СУБД позволяют разработчику определять собственные типы данных на основе стандартных, адаптируя схему под уникальные потребности предметной области.

Переход к изучению DDL

Далее следует детальное знакомство с набором базовых операторов и функций языка SQL в части создания и манипулирования структурами базы данных — переход к аспекту DDL.

Краткие итоги

Путь изучения SQL начинается с осознания его фундаментальной двойственности: язык служит одновременно для построения архитектуры данных (DDL) и для работы с их содержимым (DML). Эта унификация является ключевым преимуществом, позволяя в рамках единого синтаксиса сначала создать таблицу, а затем наполнить её записями.

Второй важной вехой становится понимание баланса между стандартизацией и вариативностью. Наличие общепринятых норм, таких как SQL:2003, обеспечивает переносимость базовых знаний между различными платформами. Однако практическая работа всегда происходит в среде конкретного диалекта (например, T-SQL), расширяющего стандарт уникальными возможностями. Это формирует прагматичный подход: освоив стандартное ядро, специалист затем углубляется в особенности выбранной системы.

Центральное место в фундаменте занимает детальный разбор типов данных, поскольку именно с их выбора начинается проектирование любой надёжной схемы. Анализ типов выходит за рамки простого перечисления. Проводится чёткое разграничение между строковыми типами по критерию эффективности использования памяти: CHAR для детерминированных по длине значений (коды, маски) и VARCHAR для вариативных (имена, описания). В числовой категории раскрывается принципиальная дилемма «точность против гибкости вычислений». На примере FLOAT и DECIMAL демонстрируется, что удобство и скорость операций с плавающей точкой сопряжены с риском незаметных погрешностей из-за двоичного представления. В противовес этому DECIMAL гарантирует арифметическую точность десятичного хранения, но ценой жёстких ограничений на разрядность результата, что может привести к ошибкам переполнения точности. Эти знания напрямую ведут к осознанному выбору: финансовый учёт требует DECIMAL, а научные расчёты с заданной погрешностью — FLOAT. Обсуждение бинарных объектов (BLOB) дополняет картину практической рекомендацией — избегать прямого хранения тяжеловесных файлов в реляционной БД, отдавая предпочтение внешним хранилищам со ссылками из таблиц. Такой подход оптимизирует производительность и управляемость системы. В итоге закладывается основа для грамотного моделирования данных, где выбор каждого типа — не техническая формальность, а продуманное проектное решение.
Что такое SQL

SQL (Structured Query Language) — это язык структурированных запросов, предназначенный для работы с данными и структурами внутри реляционных баз данных. Это полноценный язык программирования, способный не только манипулировать таблицами, но и взаимодействовать с файловой системой.

Стандарт и диалекты

Для обеспечения единообразия разработаны стандарты языка. Последний общепринятый — SQL:2003, реализованный во всех современных СУБД. Каждый производитель создаёт свой диалект, поддерживающий стандарт, но добавляющий уникальные расширения. Например, T-SQL (Transact-SQL) — диалект Microsoft SQL Server.

Два подмножества SQL

Любой диалект SQL включает два обязательных компонента, объединённых в одном языке:
• DDL (Data Definition Language) — язык определения структур. Отвечает за создание, изменение и удаление баз данных и таблиц, управление их архитектурой.
• DML (Data Manipulation Language) — язык манипулирования данными. Позволяет добавлять, изменять, удалять и читать данные внутри таблиц.

Базовые типы данных

Стандарт предписывает поддержку определённого набора типов данных, выбор которых критически важен при проектировании.

Целочисленные:
• INTEGER — стандартное целое число.
• SMALLINT — короткое целое число.

Строковые:
• CHAR(n) — строка фиксированной длины. Вставка значения «Привет» в CHAR(10) дополнит строку 4 пробелами. Используется для данных с заранее известной длиной (например, коды).
• VARCHAR(n) — строка переменной длины. Занимает ровно столько места, сколько символов вставлено, при максимуме *n*. Идеален для ФИО, адресов и других данных с непредсказуемой длиной.

Числа с плавающей точкой и точные десятичные:
• FLOAT — хранит числа, переводя их в двоичную систему. Конечная десятичная дробь может стать бесконечной двоичной, что вызывает обрезание и потерю точности. Подходит для научных расчётов, где допустима погрешность.
• DECIMAL(p, n) — хранит число в точном десятичном виде, без перевода в двоичную систему. Параметр *p* — общее количество цифр, *n* — количество цифр после запятой (10,4 → DECIMAL(3,1)). Гарантирует точность хранения, но результат операций (например, деления) может не уместиться в заданные рамки. Идеален для финансовых данных, где важна точность, а вычисления можно вынести вовне.
• DOUBLE PRECISION — аналог FLOAT, использующий вдвое больше памяти (8 байт против 4) для повышения точности.

Бинарные типы и дата/время:
• BLOB — для хранения больших бинарных объектов (файлы, картинки). Хранение мультимедиа напрямую в БД часто нерационально из-за нагрузки на СУБД. Рекомендуется хранить файлы во внешнем хранилище, а в базе — только ссылку.
• Типы даты/времени (DATETIME и др.) — обязательный компонент любой БД.
• Пользовательские типы — возможность создавать собственные типы на основе стандартных.

Выводы

1. SQL объединяет функции определения структур (DDL) и манипулирования данными (DML).
2. Стандарт SQL:2003 является общепринятым базисом, обеспечивающим совместимость между разными СУБД.
3. Производители создают диалекты (например, T-SQL), добавляя собственные расширения к стандартному набору команд.
4. Тип CHAR следует применять для строк с фиксированной, заранее известной длиной.
5. Тип VARCHAR эффективен для строк переменной длины, так как экономит память на хранении коротких значений.
6. FLOAT хранит числа в двоичном приближении, что может вести к накоплению погрешности при вычислениях.
7. DECIMAL хранит числа в точном десятичном виде, исключая ошибки перевода в двоичную систему.
8. Параметры DECIMAL(p,n) задают общее количество цифр (p) и число знаков после запятой (n).
9. Жёсткие рамки точности DECIMAL делают его неудобным для операций, результат которых требует увеличения разрядности.
10. DOUBLE PRECISION обеспечивает повышенную точность хранения по сравнению с FLOAT за счёт двойного объёма памяти.
11. Прямое хранение изображений и файлов в BLOB-полях реляционных БД часто нерационально, предпочтительнее хранить ссылки на внешнее файловое хранилище.
12. Пользовательские типы данных дают возможность адаптировать схему базы данных под специфическую логику предметной области.

Вопросы для самопроверки

1. Для каких задач служит язык SQL?
2. Из каких двух основных подмножеств состоит SQL и в чём их принципиальное различие?
3. Какова роль стандартов в развитии SQL и почему при этом существуют диалекты?
4. Чем принципиально отличается хранение строки в поле типа CHAR(10) от хранения в поле VARCHAR(10)?
5. В каком случае для хранения строки предпочтительнее использовать CHAR, а в каком — VARCHAR? Приведите примеры.
6. Почему тип FLOAT может выдавать неточный результат при арифметических операциях?
7. За счет какого механизма тип DECIMAL обеспечивает точное хранение десятичного числа?
8. Что означают параметры p и n в определении типа DECIMAL(p, n)?
9. Какая проблема может возникнуть при делении числа, хранящегося в DECIMAL(3,1)?
10. Для чего нужен тип DOUBLE PRECISION и в чём его отличие от FLOAT?
11. Почему не рекомендуется хранить фотографии и аудиозаписи напрямую в реляционной базе данных с помощью типа BLOB?
12. Можно ли в SQL определить собственный тип данных, если стандартные не подходят?
Вернуться к учебному плану