Группы операторов SQL
Классификация помогает читать документацию и понимать границы транзакций, но конкретная СУБД может относить один оператор к другой группе и по-разному выполнять неявный commit.
| Группа | Назначение | Примеры |
|---|---|---|
| DDL | структура схемы | CREATE, ALTER, DROP, TRUNCATE |
| DML | чтение и изменение строк | SELECT, INSERT, UPDATE, DELETE, MERGE |
| TCL | управление транзакцией | COMMIT, ROLLBACK, SAVEPOINT |
| DCL | права доступа | GRANT, REVOKE |
DDL
CREATE INDEX idx_orders_user_created
ON orders (user_id, created_at);DDL меняет метаданные. Нельзя переносить поведение транзакций DDL между PostgreSQL, MySQL, Oracle и другими СУБД без проверки: где-то операция транзакционна, где-то приводит к неявному commit или имеет отдельные ограничения.
DML
UPDATE orders
SET state = 'CANCELLED'
WHERE id = 42
AND state = 'NEW';Условие по текущему состоянию делает переход проверяемым: по количеству обновленных строк можно понять, состоялся ли он.
TCL
BEGIN;
UPDATE orders SET state = 'PAID' WHERE id = 42;
SAVEPOINT after_order;
INSERT INTO items (id, order_id, sku, quantity, price)
VALUES (100, 42, 'A-1', 1, 500.00);
COMMIT;SAVEPOINT позволяет откатить часть работы, но не заменяет проектирование одной атомарной бизнес-операции.
DCL
GRANT SELECT ON orders TO reporting_role;
REVOKE UPDATE ON orders FROM reporting_role;Права лучше выдавать ролям и по принципу минимально необходимых полномочий.
Ловушки
TRUNCATEнельзя считать просто «быстрым DELETE»: блокировки, триггеры, внешние ключи и транзакционность зависят от СУБД.SELECTне всегда только чтение: существуютSELECT ... FOR UPDATE, функции с побочными эффектами и чтение последовательностей.- права на таблицу не обязательно дают права на последовательность, функцию или схему.
Связано: Сравнение TRUNCATE и DELETE, Транзакции принцип ACID, Ограничения, constraints.
Вопросы
К какой группе относится SELECT? Обычно к DML; иногда отдельно выделяют DQL.
Всегда ли DDL делает commit? Нет, это зависит от СУБД и конкретной операции.
Зачем нужны роли? Чтобы управлять наборами прав, а не повторять выдачу прав каждому пользователю.