Условие
Какие команды относятся к DML и DDL? Какие ещё подъязыки SQL существуют?
Решение
| Подъязык | Расшифровка | Команды | Что делает |
|---|---|---|---|
| DDL | Data Definition Language | CREATE, ALTER, DROP, TRUNCATE, RENAME |
Изменяет структуру (схему) |
| DML | Data Manipulation Language | INSERT, UPDATE, DELETE (часто SELECT) |
Изменяет данные |
| DQL | Data Query Language | SELECT |
Запрашивает данные |
| DCL | Data Control Language | GRANT, REVOKE |
Управление правами |
| TCL | Transaction Control Language | COMMIT, ROLLBACK, SAVEPOINT |
Управление транзакциями |
TRUNCATE vs DELETE
Вопрос-ловушка: куда отнести TRUNCATE?
| DELETE | TRUNCATE | |
|---|---|---|
| Подъязык | DML | DDL (в большинстве СУБД) |
| Откатывается ли | Да (внутри транзакции) | В PostgreSQL — да, в MySQL — нет |
| Скорость | Медленнее (по строкам, журнал) | Быстро (метаданные) |
| Триггеры | Срабатывают | Обычно не срабатывают |
WHERE |
Да | Нет |
| Сбрасывает auto_increment | Нет | Да |
Что относится куда
-- DDL
CREATE TABLE t (id INT);
ALTER TABLE t ADD COLUMN name TEXT;
DROP TABLE t;
TRUNCATE TABLE t;
-- DML
INSERT INTO t VALUES (1);
UPDATE t SET name = 'a';
DELETE FROM t WHERE id = 1;
-- DQL
SELECT * FROM t;
-- DCL
GRANT SELECT ON t TO analyst;
REVOKE INSERT ON t FROM bot;
-- TCL
BEGIN;
UPDATE t SET name = 'b';
SAVEPOINT s1;
ROLLBACK TO s1;
COMMIT;Атомарность DDL
В PostgreSQL DDL транзакционен: CREATE TABLE внутри транзакции откатывается при ROLLBACK. В MySQL — нет: DDL автоматически коммитит транзакцию.
Подводные камни
SELECTиногда относят к DML, иногда к DQL — на собеседовании уточните, что имеется в виду.TRUNCATEчасто называют DML, но это DDL: меняет метаданные/файлы напрямую.MERGE(UPSERT) — относится к DML.- Привилегии в DCL — нужны DBA-роли. Аналитику обычно не дают
GRANT.
Эталонный ответ
DML: INSERT, UPDATE, DELETE (иногда SELECT). DDL: CREATE, ALTER, DROP, TRUNCATE. Также: DQL (SELECT), DCL (GRANT/REVOKE), TCL (COMMIT/ROLLBACK).