Примеры запросов для курса: 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) дополняет картину практической рекомендацией — избегать прямого хранения тяжеловесных файлов в реляционной БД, отдавая предпочтение внешним хранилищам со ссылками из таблиц. Такой подход оптимизирует производительность и управляемость системы. В итоге закладывается основа для грамотного моделирования данных, где выбор каждого типа — не техническая формальность, а продуманное проектное решение.
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 определить собственный тип данных, если стандартные не подходят?