Команды 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). Почему источники расходятся, разберём в отдельном разделе.
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).
BEGIN(в MySQL ещёSTART TRANSACTION) открывает транзакцию.COMMITсохраняет все изменения.ROLLBACKотменяет всё, что сделано с начала транзакции.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.
Почему в разных источниках группы не совпадают

Деление на 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. Она запрещает разрешение и не даёт унаследовать его через членство в группе или роли.
На собеседовании безопасно отвечать по классической схеме из четырёх групп и упомянуть, что у конкретной СУБД она может отличаться. Такие вопросы встречаются и в нашем разборе собеседования на аналитика данных.
Частые ошибки
- Выдали
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 |
|---|---|---|---|---|---|
| Нейросети для рабочих задач Перейти на сайт курса | 31 290 ₽ | - | 1 месяц | Обзор курса | |
| SQL для анализа данных Перейти на сайт курса | 50 865 ₽ | 6203 ₽/мес. | 2 месяца | Обзор курса | |
| SQL-разработчик: тариф PRO Перейти на сайт курса | 89 900 ₽ | 7491 ₽/мес. | 2 месяца | Обзор курса | |
| SQL-разработчик: тариф Базовый Перейти на сайт курса | 79 900 ₽ | 3329 ₽/мес. | 3 месяца | Обзор курса | |
| Data-Driven подход в разработке продукта: SQL и Yandex DataLens Перейти на сайт курса | 29 990 ₽ | 2999 ₽/мес. | 1 месяц | Обзор курса |
Больше программ — в полном каталоге курсов по SQL




