DDL, DML, DCL и TCL: группы команд SQL с примерами

Четыре группы SQL-команд: DDL строит структуру базы, DML меняет строки, DCL раздаёт права, TCL управляет транзакциями.

Показываем каждую на примерах PostgreSQL с реальным выводом и объясняем, почему в MySQL ROLLBACK не отменит CREATE TABLE.

Статью написал:
Ваня Буявец, продюсер, основатель Checkroi
Ваня Буявец
Основатель Checkroi, продюсер, эксперт в выборе онлайн-курсов
Все 3161 статья автора Подписаться на Телеграм-канал
Одобрено экспертом:
Наташа Буявец, основатель Checkroi, эксперт по онлайн-курсам
Наташа Буявец
Основательница Checkroi, продюсер Youtube-каналов, эксперт по онлайн-курсам
Все 3815 экспертных мнений Подписаться на Телеграм-канал
Обложка: DDL, DML, DCL и TCL: группы команд SQL с примерами

Команды SQL делят на четыре группы по тому, что они меняют. DDL (Data Definition Language) создаёт и перестраивает структуру базы: CREATE, ALTER, DROP, TRUNCATE. DML (Data Manipulation Language) работает со строками: INSERT, UPDATE, DELETE, а во многих классификациях и SELECT. DCL раздаёт и отбирает права через GRANT и REVOKE, а TCL управляет транзакциями: BEGIN, COMMIT, ROLLBACK, SAVEPOINT.

Если вы только начинаете, сначала прочитайте, что такое язык SQL и где он используется. Ниже разберём каждую группу на примерах с реальным выводом и покажем, где PostgreSQL и MySQL ведут себя по-разному.

Группа Расшифровка Что меняет Основные команды
DDL Data Definition Language, язык определения данных Таблицы, схемы, индексы, представления CREATE, ALTER, DROP, TRUNCATE, RENAME
DML Data Manipulation Language, язык манипулирования данными Строки внутри таблиц INSERT, UPDATE, DELETE, MERGE, SELECT
DCL Data Control Language, язык управления доступом (встречается перевод «язык управления данными») Права пользователей и ролей GRANT, REVOKE
TCL Transaction Control Language, язык управления транзакциями Границы транзакции BEGIN, COMMIT, ROLLBACK, SAVEPOINT

Иногда SELECT выносят в отдельную пятую группу DQL (Data Query Language). Почему источники расходятся, разберём в отдельном разделе.

CheckroiCheckroiПодборка курсов по SQL422 курса • 40 школСравните цены, школы, программу и найдите выгодные предложения по обучениюСравнить→

DDL: команды для структуры базы

Рой собирает схему базы данных из блоков-таблиц

DDL отвечает за каркас: какие таблицы есть, из каких столбцов они состоят, какие у столбцов типы и ограничения. Сами данные эти команды не трогают, за исключением DROP и TRUNCATE, которые уничтожают их вместе с таблицей или целиком очищают её.

  • CREATE создаёт объект: базу, схему, таблицу, индекс, представление;
  • ALTER меняет существующий объект, например добавляет столбец;
  • DROP удаляет объект целиком;
  • TRUNCATE оставляет таблицу, но удаляет все строки разом;
  • RENAME переименовывает объект (в PostgreSQL это делается через ALTER ... RENAME TO).

Пример для PostgreSQL 17: создаём таблицу студентов и добавляем в неё столбец.

CREATE TABLE students (
    id     serial PRIMARY KEY,
    name   text NOT NULL,
    course text
);
ALTER TABLE students ADD COLUMN email text;
CREATE TABLE
ALTER TABLE

Как сделать то же самое мышкой и где взять пустую базу под эксперименты, есть в инструкциях как создать базу данных в SQL и как создать таблицу в pgAdmin 4.

DML: команды для строк в таблицах

DML работает с содержимым: добавляет строки, меняет значения, удаляет записи и читает их. Это команды, которые аналитик и разработчик пишут каждый день.

Продолжаем пример. Добавим трёх студентов, переведём одну на другой курс, одного удалим и посмотрим, что осталось:

INSERT INTO students (name, course) VALUES
    ('Анна', 'SQL'),
    ('Борис', 'Python'),
    ('Вера', 'SQL');
UPDATE students SET course = 'PostgreSQL' WHERE name = 'Вера';
DELETE FROM students WHERE name = 'Борис';
SELECT id, name, course FROM students ORDER BY id;
INSERT 0 3
UPDATE 1
DELETE 1
 id | name |   course
----+------+------------
  1 | Анна | SQL
  3 | Вера | PostgreSQL
(2 rows)

Обратите внимание на строку UPDATE 1. PostgreSQL сообщает, сколько строк задела команда. Если там ноль или неожиданно большое число, условие WHERE написано не так, как вы думали.

Подробнее о чтении данных: синтаксис SELECT с примерами и виды JOIN для соединения таблиц.

Канал основателя Checkroi Вани Буявца3 800 человек читают мой Телеграм-канал про нейросетиСобрал промпты для Claude Code и ChatGPT, разборы ИИ-инструментов и лайфхаки по продвижению бизнеса в одном местеПрисоединиться

DCL: права пользователей

DCL решает, кто и что может делать с данными. В рабочей базе у аналитика обычно есть право читать таблицы, но нет права их менять. Это и настраивают командами GRANT (выдать) и REVOKE (отозвать).

Создадим роль analyst, дадим ей только чтение и попробуем от её имени вставить строку:

CREATE ROLE analyst LOGIN;
GRANT SELECT ON students TO analyst;
SET ROLE analyst;
SELECT count(*) FROM students;
INSERT INTO students (name) VALUES ('Глеб');
CREATE ROLE
GRANT
SET
 count
-------
     2
(1 row)

ERROR:  permission denied for table students

После REVOKE SELECT ON students FROM analyst; та же роль получает permission denied уже на чтении.

В MySQL права выдают не роли, а пользователю с указанием хоста, и проверить их можно командой SHOW GRANTS:

CREATE USER 'analyst'@'localhost' IDENTIFIED BY 'Test-pass-123';
GRANT SELECT ON school.students TO 'analyst'@'localhost';
SHOW GRANTS FOR 'analyst'@'localhost';
+--------------------------------------------------------------+
| Grants for analyst@localhost                                 |
+--------------------------------------------------------------+
| GRANT USAGE ON *.* TO `analyst`@`localhost`                  |
| GRANT SELECT ON `school`.`students` TO `analyst`@`localhost` |
+--------------------------------------------------------------+

Кто в команде отвечает за роли и права, рассказываем в статье о профессии администратора баз данных.

TCL: управление транзакциями

Рой нажимает кнопку сохранения транзакции

Транзакция объединяет несколько команд в одну операцию, которая выполняется целиком или не выполняется вовсе. В документации PostgreSQL это называют операцией «всё или ничего» (all-or-nothing).

  1. BEGIN (в MySQL ещё START TRANSACTION) открывает транзакцию.
  2. COMMIT сохраняет все изменения.
  3. ROLLBACK отменяет всё, что сделано с начала транзакции.
  4. SAVEPOINT имя ставит точку, к которой можно откатиться частично через ROLLBACK TO SAVEPOINT имя.

Пример: меняем курс Анне, ставим точку сохранения, по ошибке удаляем всю таблицу и откатываемся только до точки:

BEGIN;
UPDATE students SET course = 'Excel' WHERE name = 'Анна';
SAVEPOINT before_delete;
DELETE FROM students;
ROLLBACK TO SAVEPOINT before_delete;
COMMIT;
SELECT name, course FROM students ORDER BY id;
BEGIN
UPDATE 1
SAVEPOINT
DELETE 2
ROLLBACK
COMMIT
 name |   course
------+------------
 Анна | Excel
 Вера | PostgreSQL
(2 rows)

Удаление отменилось, а изменение до точки сохранения осталось. Без BEGIN такой страховки нет: по документации PostgreSQL каждая отдельная команда выполняется в своей транзакции и фиксируется сразу после успешного выполнения.

Можно ли откатить DDL

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

PostgreSQL откатывает почти весь DDL

BEGIN;
CREATE TABLE draft_table (id int);
INSERT INTO draft_table VALUES (1);
ROLLBACK;
SELECT to_regclass('draft_table');
BEGIN
CREATE TABLE
INSERT 0 1
ROLLBACK
 to_regclass
-------------

(1 row)

Запрос вернул пустое значение: таблицы нет, как будто её и не создавали. Так же откатывается TRUNCATE, и это одно из его отличий от поведения в MySQL, которое мы разбирали в статье про TRUNCATE и DELETE. В описании TRUNCATE прямо сказано, что очистка будет отменена, если окружающая транзакция не зафиксирована. Исключения перечисляет вики проекта: нельзя откатить создание и удаление базы данных и табличного пространства.

MySQL и Oracle фиксируют транзакцию сами

В MySQL команда DDL посреди транзакции сначала сохраняет всё, что было до неё. Вот что получилось на MySQL 26.10:

START TRANSACTION;
UPDATE students SET course = 'Excel' WHERE name = 'Анна';
CREATE TABLE logs (id INT);
ROLLBACK;
SELECT name, course FROM students ORDER BY id;
+----------+--------+
| name     | course |
+----------+--------+
| Анна     | Excel  |
| Вера     | SQL    |
+----------+--------+

ROLLBACK не отменил ни новую таблицу logs, ни изменение у Анны. Причина в разделе документации Statements That Cause an Implicit Commit: команды DDL неявно завершают текущую транзакцию, как будто перед ними выполнили COMMIT. В тот же список входят GRANT, REVOKE и CREATE USER.

В Oracle Database правило то же: база неявно фиксирует текущую транзакцию до и после каждой команды DDL.

Практический вывод: в MySQL и Oracle миграцию структуры не стоит смешивать с правкой данных в одной транзакции. Если вторая половина упадёт, первая уже сохранена.

Как читать такой табличный вывод консольного клиента mysql, показано в разборе команды SELECT в MySQL.

Почему в разных источниках группы не совпадают

Четыре лотка с карточками команд SQL

Деление на DDL, DML, DCL и TCL придумано для удобства, и каждая СУБД раскладывает команды по-своему. Три спорных места встречаются чаще всего.

Команда Oracle Microsoft SQL Server Учебная схема из пяти групп
SELECT DML DML DQL
TRUNCATE DDL DDL DDL
GRANT, REVOKE DDL инструкции разрешений DCL
MERGE DML DML DML

SELECT: DML или DQL

В справочнике Oracle по типам команд SQL SELECT стоит в списке DML с оговоркой: это ограниченная форма DML, потому что она только читает данные. Документация Microsoft по Transact-SQL тоже относит его к DML. Отдельную группу DQL выделяют в учебных материалах, чтобы подчеркнуть, что чтение ничего не меняет.

TRUNCATE: почему не DML

По смыслу TRUNCATE похож на DELETE без условия, но и Oracle, и Microsoft относят его к DDL. Он не перебирает строки по одной, а очищает таблицу целиком. Чем это оборачивается на практике, разобрано в статье про разницу TRUNCATE и DELETE.

GRANT: DCL или DDL

Oracle не выделяет DCL: выдача и отзыв привилегий у него входят в список задач DDL. В SQL Server для них свой раздел «Инструкции разрешений», а кроме GRANT и REVOKE есть команда DENY. Она запрещает разрешение и не даёт унаследовать его через членство в группе или роли.

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

Ваня БуявецКанал основателя Checkroi Вани БуявцаЗабирайте промпты и обучение по нейросетям в моём Телеграм-каналеБольше 3 800 человек уже применяют Claude Code, ChatGPT и другие нейросети в работе, учёбе, бизнесе и жизниПерейти в канал

Частые ошибки

  • Выдали GRANT SELECT, а пользователь всё равно получает отказ. В PostgreSQL для таблицы не в схеме public нужно ещё право USAGE на саму схему. Без него ошибка звучит как permission denied for schema reports. Решение: GRANT USAGE ON SCHEMA reports TO analyst;. Что именно даёт USAGE, описано в разделе о привилегиях.
  • ROLLBACK не вернул данные в MySQL. Между START TRANSACTION и откатом выполнилась команда DDL или GRANT, и транзакция зафиксировалась раньше. Решение: выносить изменения структуры в отдельный шаг.
  • UPDATE или DELETE без WHERE. Команда заденет все строки. Решение: сначала выполнить SELECT с тем же условием, а саму правку запускать внутри BEGIN, чтобы успеть сделать ROLLBACK.
  • Перепутали DROP и TRUNCATE. DROP TABLE удаляет таблицу вместе со структурой и индексами, а TRUNCATE оставляет пустую таблицу.
  • Ищут в SQLite команды GRANT. SQLite читает и пишет обычный файл на диске, поэтому GRANT и REVOKE в нём не реализованы. Доступ регулируют правами на файл в операционной системе.

Где освоить SQL системно

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

КурсШколаСтоимость со скидкойВ рассрочкуДлитель­ностьОбзор курса от Checkroi
Нейросети для рабочих задач
Перейти на сайт курса
SkillboxSkillbox31 290 ₽ - 1 месяцОбзор курса
SQL для анализа данных
Перейти на сайт курса
SkillboxSkillbox50 865 ₽6203 ₽/мес.2 месяцаОбзор курса
SQL-разработчик: тариф PRO
Перейти на сайт курса
Академия ЭдюсонЭдюсон89 900 ₽7491 ₽/мес.2 месяцаОбзор курса
SQL-разработчик: тариф Базовый
Перейти на сайт курса
Академия ЭдюсонЭдюсон79 900 ₽3329 ₽/мес.3 месяцаОбзор курса
Data-Driven подход в разработке продукта: SQL и Yandex DataLens
Перейти на сайт курса
ProductStarProductStar29 990 ₽2999 ₽/мес.1 месяцОбзор курса

Больше программ — в полном каталоге курсов по SQL

Часто задаваемые вопросы

Что такое DDL в SQL простыми словами?

DDL (Data Definition Language, по-русски иногда пишут «ДДЛ») это группа команд, которые создают и меняют структуру базы: таблицы, столбцы, индексы, схемы. Это CREATE, ALTER, DROP, TRUNCATE и RENAME.

Чем DDL отличается от DML?

DDL работает со структурой: создаёт таблицу или добавляет столбец. DML работает с данными внутри неё: INSERT добавляет строки, UPDATE их меняет, DELETE удаляет.

К какой группе относится SELECT?

В справочнике Oracle и документации Microsoft SELECT входит в DML. В учебных схемах из пяти групп его выносят отдельно, в DQL (Data Query Language), потому что он только читает данные.

Какие команды входят в DCL и TCL?

DCL управляет правами: GRANT выдаёт привилегию, REVOKE отзывает. TCL управляет транзакциями: BEGIN или START TRANSACTION открывает транзакцию, COMMIT сохраняет изменения, ROLLBACK отменяет, SAVEPOINT ставит точку для частичного отката.

Можно ли отменить CREATE TABLE или TRUNCATE через ROLLBACK?

В PostgreSQL можно, если команда выполнялась внутри BEGIN: таблица исчезнет, очищенные строки вернутся. В MySQL и Oracle команды DDL неявно фиксируют транзакцию, поэтому ROLLBACK их не отменит.

TRUNCATE относится к DDL или DML?

В справочниках Oracle и Microsoft SQL Server TRUNCATE отнесён к DDL. По результату он похож на DELETE без условия, но очищает таблицу целиком и не перебирает строки по одной.

Читайте Checkroi первым в Google
Добавьте Checkroi в избранные источники — и наши разборы курсов и обзоры школ будут показываться выше в вашей выдаче Google.
Оставить комментарий
0 комментариев
Форма комментария

Оставьте комментарий

Напишите, что думаете. Нам важно ваше мнение!