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

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

В материале разбираются четыре типа ограничений целостности данных в SQL: первичный ключ (PRIMARY KEY), уникальность (UNIQUE), проверка (CHECK) и внешний ключ (FOREIGN KEY). Показано, как задавать их при создании таблицы и как добавлять к уже существующей через ALTER TABLE. Затем демонстрируется, что операции определения структуры (DDL) можно выполнять не только вручную, но и с помощью графического интерфейса клиента (Management Studio), который сам генерирует нужный SQL-код. Обсуждается зависимость конкретной реализации языка от используемой СУБД и объясняется, почему для практической работы важнее понимать общие концепции SQL, а не заучивать все диалекты. Завершается обзор переходом от DDL к языку манипулирования данными (DML).

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

В результате изучения лекции слушатель будет способен:
1. Описать назначение и синтаксис ограничений PRIMARY KEY, UNIQUE, CHECK и FOREIGN KEY.
2. Создать таблицу с заданными ограничениями, используя оператор CREATE TABLE.
3. Добавить ограничение любого типа к существующей таблице с помощью ALTER TABLE … ADD CONSTRAINT.
4. Объяснить различия между ограничениями PRIMARY KEY и UNIQUE.
5. Составить условие CHECK, включающее подзапросы к другим таблицам.
6. Связать две таблицы через внешний ключ, корректно указав родительскую таблицу и её поле.
7. Сгенерировать готовый DDL-скрипт, используя графический интерфейс клиентского приложения (Management Studio).
8. Пояснить, почему знание стандарта SQL и общих принципов важнее заучивания специфики каждого диалекта.
9. Проанализировать нетипичный параметр конкретной СУБД, обратившись к документации по её диалекту.
10. Разграничить задачи, решаемые компонентами DDL и DML.
Показывать лекцию целиком
Краткое изложение

Ограничения целостности в SQL

Первичный ключ (PRIMARY KEY)

Ограничение первичный ключ (PRIMARY KEY) задаётся при создании таблицы. Пример:

sql
CREATE TABLE Students (
ID INTEGER NOT NULL PRIMARY KEY,
GroupID INTEGER,
FirstName VARCHAR(50),
LastName VARCHAR(50),
Age INTEGER
);

Поле ID объявлено как NOT NULL PRIMARY KEY — это сочетание гарантирует уникальность и невозможность пустых значений.

Если таблица уже существует, первичный ключ можно добавить с помощью ALTER TABLE:

sql

ALTER TABLE Students
ADD CONSTRAINT PK_1 PRIMARY KEY (ID);

Каждое ограничение должно иметь уникальное имя (например, PK_1). Имя выбирается произвольно и служит для идентификации ограничения.

Уникальность (UNIQUE)

Ограничение уникальность (UNIQUE) близко к первичному ключу, но допускает наличие NULL (если не задано NOT NULL). Добавляется аналогично:

sql
ALTER TABLE Students
ADD CONSTRAINT UNIQ_1 UNIQUE (ID);

Здесь ограничению присвоено имя UNIQ_1, и оно гарантирует, что все значения в столбце ID будут различаться.

Проверка (CHECK)

Ограничение проверка (CHECK) задаёт условие для значений поля. Например, возраст должен быть больше 18:

sql

CREATE TABLE Students (
ID INTEGER NOT NULL,
Age INTEGER CHECK (Age > 18)
);

Условие внутри CHECK не ограничивается простым сравнением — оно может содержать полноценный подзапрос. Скажем, значение Age должно быть больше среднего возраста из другой таблицы:

sql

Age INTEGER CHECK (Age > (SELECT AVG(Age) FROM OtherTable))

Для добавления CHECK к существующей таблице:

sql

ALTER TABLE Students
ADD CONSTRAINT CHK_1 CHECK (Age > 18);

Внешний ключ (FOREIGN KEY)

Ограничение внешний ключ (FOREIGN KEY) связывает две таблицы. Дочерняя таблица содержит столбец, ссылающийся на родительский ключ. Пример: в таблице Students поле GroupID ссылается на ID таблицы Groups:

sql

CREATE TABLE Students (
ID INTEGER NOT NULL PRIMARY KEY,
GroupID INTEGER,
...
CONSTRAINT FK_Group FOREIGN KEY (GroupID) REFERENCES Groups(ID)
);

Имя ограничения — FK_Group. Если таблица уже создана, внешний ключ добавляется командой:

sql

ALTER TABLE Students
ADD CONSTRAINT FK_Group FOREIGN KEY (GroupID) REFERENCES Groups(ID);

DDL через графический интерфейс

Создание таблиц, баз данных и других объектов можно выполнять не только написанием кода, но и с помощью графического интерфейса клиента, например Microsoft SQL Server Management Studio. Пользователь задаёт параметры щелчками мыши, а затем нажимает кнопку Script. Клиент генерирует готовый SQL-код, полностью соответствующий выполненным в интерфейсе настройкам.

Пример сгенерированного скрипта для создания базы данных:

sql

CREATE DATABASE Test
ON PRIMARY
( NAME = N'Test', FILENAME = N'...\Test.mdf' , SIZE = 100MB , ... )
LOG ON
( NAME = N'Test_log', FILENAME = N'...\Test_log.ldf' , SIZE = 100MB , ... )
...
ALTER DATABASE Test SET COMPATIBILITY_LEVEL = 100;
ALTER DATABASE Test SET ANSI_PADDING OFF;
...

В коде видны специфические для Transact-SQL (T-SQL) параметры: COMPATIBILITY_LEVEL, ANSI_PADDING и многие другие. Все они принадлежат конкретной СУБД — Microsoft SQL Server — и отсутствуют в стандарте SQL.

Диалекты SQL и практическое изучение

Современные СУБД обладают собственными диалектами: PL/SQL (Oracle), T-SQL (SQL Server), MySQL, PostgreSQL и др. Изучить все реализации досконально невозможно из-за огромного объёма функциональности и частых обновлений.

Продуктивный подход:
• освоить общие концепции языка и стандарт;
• получить практический опыт в одном-двух диалектах;
• встречая незнакомый параметр (например, ANSI_PADDING), обратиться к документации конкретной СУБД и понять его смысл. Так, ANSI_PADDING ON определяет, будут ли значения типа CHAR или VARCHAR дополняться пробелами до указанной длины.

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

Управление другими объектами

Те же операции CREATE, ALTER, DROP применяются ко всем структурам базы данных: доменам, представлениям (VIEW), хранимым процедурам, триггерам, генераторам, индексам. Достаточно заменить в синтаксисе TABLE на имя соответствующего типа объекта. DDL-компонента языка универсальна: выбор действия (создать, изменить, удалить) определяет ключевое слово, а дальнейший синтаксис зависит от типа объекта.

Переход к языку манипулирования данными (DML)

Всё рассмотренное выше относится к языку определения данных (Data Definition Language, DDL). Центральную же роль в SQL играет язык манипулирования данными (Data Manipulation Language, DML). Именно с его помощью выполняются основные действия над содержимым таблиц: извлечение данных (SELECT), вставка (INSERT), удаление (DELETE) и обновление (UPDATE). Именно DML решает главную задачу любой базы данных — работу с данными.

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

Освоение синтаксиса ограничений даёт фундамент для проектирования надёжных схем данных. Логика изложения построена от простого к сложному: сначала вводятся четыре базовых типа ограничений, объясняется их роль, затем демонстрируются два способа внедрения – декларативно при создании таблицы и императивно через изменение существующей структуры. Попутно подчёркивается важность именования ограничений, позволяющего в дальнейшем управлять ими.

После разбора каждого типа автор показывает, что чистый SQL-код не является единственным инструментом разработчика. Графические оболочки, такие как Management Studio, избавляют от рутины и генерируют корректные DDL-скрипты. Этот навык особенно ценен в промышленной среде, где скорость и минимизация ошибок важны. Демонстрируется конкретный пример: создание базы данных через интерфейс и получение полного кода со всеми специфическими для T-SQL параметрами.

Далее раскрывается фундаментальная проблема переносимости: стандарт SQL дополняется вендорскими расширениями, количество которых настолько велико, что полное знание всех диалектов недостижимо. Выходом служит концептуальный подход: понимание общей модели языка и принципов работы реляционных СУБД. Такое понимание превращает любой незнакомый параметр в легко исследуемый объект – достаточно обратиться к документации конкретного диалекта. Приводится пример с параметром ANSI_PADDING, который регулирует хранение коротких строк и имеет разное поведение в разных СУБД.

Практическая ценность материала в том, что он формирует не механическое запоминание команд, а метанавык: умение различать универсальное ядро SQL и диалектные надстройки, использовать графический инструментарий для ускорения разработки и обращаться к документации для точечного решения задач. Этот подход одинаково применим при работе с любой реляционной платформой – будь то SQL Server, Oracle, PostgreSQL или MySQL. Наконец, чёткое разделение на DDL и DML закладывает правильную ментальную модель: сначала создаётся и изменяется структура хранения, а затем в этих рамках ведутся операции над данными.
Ограничения целостности: синтаксис и применение

В SQL существует четыре основных типа ограничений: первичный ключ (PRIMARY KEY), уникальность (UNIQUE), проверка (CHECK) и внешний ключ (FOREIGN KEY). Они задаются при создании таблицы либо добавляются позже.

Первичный ключ гарантирует уникальность и недопустимость NULL:

sql

CREATE TABLE Students (
ID INTEGER NOT NULL PRIMARY KEY,
...
);

Если таблица уже существует:

sql

ALTER TABLE Students ADD CONSTRAINT PK_1 PRIMARY KEY (ID);

Каждое ограничение имеет произвольное, но уникальное имя (PK_1).

UNIQUE похож на первичный ключ, но разрешает NULL (если не указан NOT NULL):

sql

ALTER TABLE Students ADD CONSTRAINT UNIQ_1 UNIQUE (ID);

CHECK проверяет значение по заданному условию. Пример: возраст должен быть больше 18:

sql

ALTER TABLE Students ADD CONSTRAINT CHK_1 CHECK (Age > 18);

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

Внешний ключ связывает две таблицы. В примере GroupID таблицы Students ссылается на ID таблицы Groups:

sql

CREATE TABLE Students (
...,
CONSTRAINT FK_Group FOREIGN KEY (GroupID) REFERENCES Groups(ID)
);

Добавление к существующей таблице:

sql

ALTER TABLE Students ADD CONSTRAINT FK_Group FOREIGN KEY (GroupID) REFERENCES Groups(ID);

Те же операции CREATE, ALTER, DROP применимы ко всем объектам БД: представлениям (VIEW), хранимым процедурам, триггерам, индексам – меняется только имя типа объекта.

Графическая генерация DDL

Клиенты вроде Microsoft SQL Server Management Studio позволяют управлять структурой через интерфейс. При настройке базы данных (имя, размер файлов, параметры восстановления, шифрование и т.д.) можно нажать кнопку Script и получить готовый SQL-код:

sql

CREATE DATABASE Test
ON PRIMARY ( ... SIZE = 100MB ... )
LOG ON ( ... )
...
ALTER DATABASE Test SET COMPATIBILITY_LEVEL = 100;
ALTER DATABASE Test SET ANSI_PADDING OFF;
...

Такой код содержит параметры конкретного диалекта (T-SQL), отсутствующие в стандарте.

Диалекты и практический подход

Каждая СУБД реализует собственный диалект (PL/SQL, T-SQL, MySQL, PostgreSQL). Полное знание всех диалектов невозможно из-за их объёма и частых обновлений. Эффективная стратегия:
• понять концепции и стандарт языка;
• освоить один диалект на практике;
• встречая незнакомый параметр (например, ANSI_PADDING), обращаться к документации конкретной СУБД, чтобы быстро выяснить его назначение.

Такой подход позволяет в сжатые сроки адаптироваться к любому диалекту в условиях реального проекта.

DDL и DML

Всё рассмотренное относится к языку определения данных (Data Definition Language, DDL), управляющему структурой. Центральная же часть SQL – язык манипулирования данными (Data Manipulation Language, DML) – команды SELECT, INSERT, UPDATE, DELETE, которые работают с содержимым таблиц. Именно DML решает основные задачи любой базы данных.

Выводы

1. Ограничения целостности бывают четырёх типов: PRIMARY KEY, UNIQUE, CHECK, FOREIGN KEY.
2. PRIMARY KEY автоматически включает условия NOT NULL и UNIQUE.
3. Любое ограничение при создании должно получить уникальное имя.
4. Добавить ограничение к существующей таблице можно командой ALTER TABLE … ADD CONSTRAINT.
5. В условии CHECK допустимы подзапросы к другим таблицам, что позволяет строить сложную логику проверки.
6. FOREIGN KEY связывает дочернее поле с родительским ключом, обычно первичным ключом другой таблицы.
7. Все операции DDL (CREATE, ALTER, DROP) единообразно применяются к таблицам, представлениям, процедурам, триггерам и индексам.
8. Графический клиент (Management Studio) умеет генерировать готовый SQL-скрипт по действиям пользователя.
9. Параметры, сгенерированные GUI, часто специфичны для конкретного диалекта и не входят в стандарт SQL.
10. Полное знание всех диалектов SQL недостижимо из-за их объёма и постоянного обновления.
11. Эффективная стратегия – понимание общих концепций и умение находить в документации особенности нужного диалекта.
12. DML (SELECT, INSERT, UPDATE, DELETE) отвечает за манипулирование данными и является центральной частью языка.

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

1. Какие четыре типа ограничений поддерживаются в SQL?
2. Чем ограничение UNIQUE отличается от PRIMARY KEY?
3. Как добавить ограничение CHECK к столбцу таблицы, уже содержащей данные?
4. Можно ли в условии CHECK использовать подзапрос, обращающийся к другой таблице?
5. Какой синтаксис применяется для задания внешнего ключа при создании таблицы?
6. Что произойдёт, если попытаться вставить запись с нарушением ограничения FOREIGN KEY?
7. Какие ключевые слова относятся к DDL, а какие к DML?
8. Каким образом графический интерфейс клиента помогает при написании DDL-скриптов?
9. Почему нельзя выучить «весь SQL» одинаково хорошо для всех СУБД?
10. Что означает параметр ANSI_PADDING в контексте T-SQL?
11. Как быстро разобраться в назначении незнакомого параметра конкретной СУБД?
12. Для каких объектов помимо таблиц применимы операции CREATE, ALTER и DROP?
Вернуться к учебному плану