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

SQL как язык описания данных. Часть 1

Рассматривается компонент SQL — язык определения данных (DDL), управляющий созданием, изменением и удалением структур базы данных. Излагаются три базовых оператора: CREATE, ALTER, DROP и их применение к доменам, таблицам, представлениям, процедурам, триггерам, индексам. На примерах показано создание базы данных с настройкой размера страницы и кодировки, создание таблицы с полями, ограничениями NOT NULL, DEFAULT и вычисляемыми столбцами, а также изменение таблиц. Систематизируются четыре типа ограничений целостности: PRIMARY KEY, UNIQUE, FOREIGN KEY и CHECK, с пояснением их смысла и отличий, включая разницу между первичным ключом и сочетанием уникальности с запретом NULL.

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

В результате изучения лекции слушатель будет способен:
1. Определять назначение DDL и перечислять его ключевые операторы.
2. Объяснять разницу между доменом и базовым типом данных, приводить примеры доменов.
3. Создавать базу данных с указанием пути, владельца, размера страницы и набора символов.
4. Описывать синтаксис команды CREATE TABLE с определением столбцов, типов, NOT NULL, DEFAULT и вычисляемых полей.
5. Формировать вычисляемые столбцы, используя конструкцию COMPUTED BY.
6. Применять ALTER TABLE для добавления и удаления столбцов в существующей таблице.
7. Удалять объекты базы данных с помощью оператора DROP.
8. Классифицировать ограничения целостности: PRIMARY KEY, UNIQUE, FOREIGN KEY, CHECK и понимать их назначение.
9. Различать ограничения PRIMARY KEY и UNIQUE в сочетании с NOT NULL, осознавая их внутренние отличия при работе с индексами.
10. Задавать внешний ключ, ссылающийся на родительскую таблицу, и ограничение CHECK для проверки вводимых значений.
Показывать лекцию целиком
Краткое изложение

Введение в DDL
Компонент SQL, называемый DDL (Data Definition Language — язык определения данных), отвечает за создание и изменение структур внутри базы данных: самих баз, таблиц и прочих объектов. Основных операторов три — CREATE, ALTER и DROP, на них приходится порядка 95% всех действий в DDL. CREATE создаёт структуру, ALTER вносит в неё изменения, DROP удаляет. Эти три оператора применимы к доменам, таблицам, представлениям (views), процедурам, триггерам, генераторам, индексам и другим объектам.

Домен как уточнение типа данных
Домен — это подмножество значений типа, соответствующее конкретному полю. Например, ИНН как тип данных — целое число (INTEGER), однако домен сужает его до 12-значных целых с дополнительными правилами (не начинается с нуля и т.п.). Таким образом, домен задаёт ограничения на тип для конкретного столбца.

Создание базы данных
Базовый синтаксис:
sql
CREATE DATABASE <путь> USER <владелец> PASSWORD <пароль>;

Пример:
sql
CREATE DATABASE '//192.168.0.1/DB/' USER 'SDB' PASSWORD 'MasterKey';


Дополнительно можно указать специфические параметры. Например, размер страницы хранения данных — PAGE_SIZE. Таблица физически хранится в виде множества файлов-страниц, и их размер по умолчанию можно переопределить. Также задаётся кодировка по умолчанию (character set) — в примере на слайде это кириллическая кодировка. Если для отдельной таблицы кодировка не указана, она наследуется от базы данных.

Конкретная СУБД может расширять набор параметров. Так, в T-SQL (язык SQL Server) оператор CREATE DATABASE поддерживает множество опций (файловые группы, COLLATE и др.). В стандартном SQL кодировка может называться CHARACTER SET, а в SQL Server параметр сортировки задаётся через COLLATE (collation name). Названия параметров варьируются, но базовая логика остаётся общей.

Создание таблицы
Таблица создаётся оператором CREATE TABLE:

sql

CREATE TABLE Students (

    ID INTEGER NOT NULL,

    FirstName VARCHAR(30),

    LastName VARCHAR(30),

    YearOfBirth INTEGER DEFAULT 1985,

    Age COMPUTED BY (2008 - YearOfBirth)

);

Поле ID имеет тип INTEGER и ограничение NOT NULL — значение обязательно. Первичный ключ пока не задан, поэтому ID может повторяться. FirstName и LastName — строки переменной длины до 30 символов. YearOfBirth — целое, со значением DEFAULT 1985: если при вставке год не указан, подставляется 1985. Поле Age вычисляемое (COMPUTED BY): его не вводят вручную, оно автоматически рассчитывается по формуле 2008 - YearOfBirth.

Изменение таблицы
Для внесения изменений в существующую таблицу используется ALTER TABLE:
sql
ALTER TABLE Students ADD Hobby VARCHAR(20) NOT NULL;
ALTER TABLE Students DROP GroupID;

Первая команда добавляет столбец Hobby (строка до 20 символов, обязательный). Вторая удаляет столбец GroupID. ALTER также позволяет задавать первичные ключи, менять опцию NOT NULL на NULL, добавлять вычисляемые поля и многое другое.

Удаление объектов
Удаление выполняется оператором DROP с указанием типа объекта и его имени:

sql
DROP TABLE Students;
DROP DATABASE <путь>;
DROP VIEW <имя>;
DROP PROCEDURE <имя>;

Синтаксис един: DROP + тип_объекта + имя.

Ограничения целостности
Для полей таблицы можно задать четыре типа ограничений.
1. PRIMARY KEY (первичный ключ) — поле не может быть NULL и не может повторяться. Однозначно идентифицирует строку.
2. UNIQUE (уникальность) — значения не должны повторяться, но при отсутствии NOT NULL в поле разрешены NULL-значения. UNIQUE + NOT NULL почти эквивалентны первичному ключу, однако разница проявляется на уровне индексов: наличие PRIMARY KEY вызывает дополнительные внутренние действия СУБД, особенно важные при связывании таблиц через внешние ключи.
3. FOREIGN KEY (внешний ключ) — поле наследует значения из родительской таблицы. После ключевого слова REFERENCES указывается имя родительской таблицы, откуда берутся допустимые значения.
4. CHECK (проверка) — задаёт условие для значений поля. Например, чтобы возраст был строго больше 12: CHECK (Age > 12).

Эти четыре механизма — PRIMARY KEY, UNIQUE, FOREIGN KEY и CHECK — составляют основу декларативной целостности данных в SQL.

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

Освоение языка определения данных закладывает фундамент грамотного проектирования баз данных. Три универсальных оператора — CREATE, ALTER и DROP — формируют замкнутый цикл управления структурами, от создания до полного удаления, применимый не только к таблицам, но и к доменам, представлениям, процедурам, индексам и другим объектам. Концепция домена позволяет выйти за пределы простого указания типа, накладывая бизнес-правила на уровне определения столбца, что делает схему самодокументированной и устойчивой к некорректному вводу уже на этапе проектирования.

При создании базы данных разработчик получает возможность настраивать физические параметры хранения (размер страницы) и логические правила обработки текста (набор символов). Это влияет на производительность и корректность сортировок, особенно в многоязычных средах. Вариативность синтаксиса разных СУБД (стандартный CHARACTER SET против COLLATE в T-SQL) не меняет сути: все платформы предоставляют механизмы, управляющие хранением и поведением данных.

Описание таблиц демонстрирует эволюцию от простого перечня столбцов к насыщенной модели: NOT NULL гарантирует обязательность, DEFAULT — предсказуемое заполнение, а вычисляемые поля (COMPUTED BY) исключают дублирование и ошибки ручного ввода производных данных. Это не просто удобство, а шаг к нормализации и снижению аномалий обновления.

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

Кульминацией лекции становится система ограничений целостности. Первичный ключ создаёт уникальный идентификатор строки, вокруг которого строится вся реляционная модель. Уникальность без обязательности оставляет пространство для неполных данных, что полезно, когда не все атрибуты известны на момент вставки. Принципиальное различие между PRIMARY KEY и UNIQUE + NOT NULL раскрывается не на уровне логики, а на уровне физической реализации — первичный ключ автоматически порождает кластерный индекс и служит предпочтительной точкой соединения для внешних ключей. Внешний ключ материализует связи между сущностями, запрещая «висячие» ссылки, а CHECK переносит проверки предметной области непосредственно в схему, снимая нагрузку с прикладного кода.

Практическое применение этих знаний даёт возможность проектировать схемы, которые не только хранят данные, но и активно защищают их качество, снижая затраты на тестирование и исправление ошибок на уровне приложений.
DDL и его операторы
Язык определения данных (Data Definition Language, DDL) управляет структурами БД. Три ключевых оператора: CREATE (создать), ALTER (изменить), DROP (удалить). Они применяются к доменам, таблицам, представлениям, процедурам, триггерам, генераторам, индексам.

Домен
Домен — подмножество значений типа данных с дополнительными правилами для конкретного поля. Например, тип INTEGER, а домен «ИНН» — 12-значное целое, которое не начинается с нуля. Домен накладывает ограничения прямо на этапе определения столбца.

Создание базы данных
Базовый синтаксис: CREATE DATABASE <путь> USER <владелец> PASSWORD <пароль>. Дополнительно настраиваются PAGE_SIZE (размер страницы хранения) и кодировка по умолчанию (character set). Разные СУБД могут использовать свои названия параметров: например, в T-SQL кодировка задаётся через COLLATE. Эти настройки влияют на физическое хранение и поведение сортировок.

Создание и изменение таблиц
Таблица создаётся командой CREATE TABLE с перечислением столбцов, их типов и ограничений. Пример:

sql
CREATE TABLE Students (
ID INTEGER NOT NULL,
FirstName VARCHAR(30),
LastName VARCHAR(30),
YearOfBirth INTEGER DEFAULT 1985,
Age COMPUTED BY (2008 - YearOfBirth)
);

• NOT NULL запрещает незаполненное значение.
• DEFAULT подставляет указанное значение, если поле не задано.
• COMPUTED BY задаёт вычисляемое поле, которое не хранится, а рассчитывается по формуле (здесь возраст на 2008 год).

Изменение структуры выполняется оператором ALTER TABLE: ALTER TABLE Students ADD Hobby VARCHAR(20) NOT NULL добавляет столбец, ALTER TABLE Students DROP GroupID удаляет столбец. ALTER также позволяет задавать первичные ключи и менять ограничения.

Удаление объектов
Любой объект удаляется единообразно: DROP <тип> <имя>. Например, DROP TABLE Students, DROP DATABASE <путь>, DROP VIEW <имя>.

Ограничения целостности
На поля таблицы можно наложить ограничения четырёх видов:
• PRIMARY KEY — уникальный идентификатор, не допускает NULL и повторений.
• UNIQUE — запрещает дубликаты, но разрешает NULL, если не задан NOT NULL. Сочетание UNIQUE + NOT NULL логически близко к первичному ключу, но физически PRIMARY KEY дополнительно создаёт кластерный индекс и оптимизирует связи между таблицами.
• FOREIGN KEY — внешний ключ, ссылающийся на родительскую таблицу (указывается после REFERENCES). Гарантирует, что значение берётся из существующего набора.
• CHECK — задаёт произвольное условие для значения поля, например CHECK (Age > 12).

Эти ограничения обеспечивают декларативную целостность и сокращают необходимость проверок в прикладном коде.

Выводы

1. DDL управляет структурами базы данных через три главных оператора: CREATE (создание), ALTER (изменение), DROP (удаление).
2. Домен сужает тип данных до конкретного подмножества значений, накладывая дополнительные ограничения на поле.
3. При создании базы данных можно задать путь к файлам, владельца, размер страницы (PAGE_SIZE) и кодировку по умолчанию.
4. Параметры СУБД различаются по названиям (например, CHARACTER SET или COLLATE), сохраняя общую логику настройки.
5. CREATE TABLE определяет столбцы с типами и опциями: NOT NULL, DEFAULT, а также вычисляемые поля (COMPUTED BY).
6. Вычисляемые поля не хранятся физически и автоматически пересчитываются при запросах по заданной формуле.
7. ALTER TABLE добавляет и удаляет столбцы, изменяет ограничения и позволяет задать первичный ключ после создания таблицы.
8. Удаление объектов производится командой DROP <тип> <имя>; она уничтожает структуру и содержащиеся в ней данные.
9. PRIMARY KEY гарантирует уникальность и отсутствие NULL; UNIQUE допускает NULL, если не добавлен NOT NULL.
10. Различие между PRIMARY KEY и UNIQUE + NOT NULL проявляется в автоматическом создании индексов и поведении при ссылках внешних ключей.
11. FOREIGN KEY связывает поле дочерней таблицы с родительской, указываемой после REFERENCES, обеспечивая ссылочную целостность.
12. CHECK накладывает произвольное условие на значения поля, отсеивая некорректные данные на уровне схемы.

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

1. Какие три оператора составляют основу DDL и какие действия они выполняют?
2. Что такое домен? Приведите пример домена на основе типа INTEGER.
3. Какие параметры, помимо пути и учётных данных, можно указать при создании базы данных?
4. Как в стандартном SQL задаётся набор символов базы данных и как эта возможность может называться в T-SQL?
5. Опишите синтаксис команды CREATE TABLE. Зачем используется опция NOT NULL?
6. Для чего служит ключевое слово DEFAULT? Продемонстрируйте на примере поля YearOfBirth.
7. Что такое вычисляемое поле и как оно задаётся в определении таблицы? Приведите пример расчёта возраста.
8. Какими возможностями обладает оператор ALTER TABLE? Приведите примеры добавления и удаления столбца.
9. Чем ограничение UNIQUE отличается от PRIMARY KEY? Может ли столбец с UNIQUE содержать значение NULL?
10. Объясните назначение FOREIGN KEY. Что должно быть указано после слова REFERENCES?
11. Какое ограничение следует применить, чтобы гарантировать, что значение поля попадает в заданный диапазон или удовлетворяет условию (например, возраст > 12)?
12. Почему PRIMARY KEY и сочетание UNIQUE + NOT NULL не полностью эквивалентны с точки зрения внутреннего устройства базы данных?
Вернуться к учебному плану