Ответ
DML (Data Manipulation Language — Язык Манипулирования Данными) — это подмножество команд SQL, предназначенное для работы с данными внутри существующих таблиц базы данных. В отличие от DDL (Data Definition Language), который определяет структуру БД (создание таблиц, индексов), DML оперирует содержимым этих таблиц.
Основные команды DML:
| Команда | Назначение | Ключевые особенности |
|---|---|---|
SELECT |
Извлечение данных из одной или нескольких таблиц. | Самая часто используемая команда. Может включать фильтрацию (WHERE), сортировку (ORDER BY), группировку (GROUP BY), объединения (JOIN). |
INSERT |
Добавление новых строк (записей) в таблицу. | Можно вставлять одну строку, несколько строк или результат подзапроса. |
UPDATE |
Изменение существующих данных в строках таблицы. | Всегда используйте WHERE, иначе будут обновлены все строки в таблице. |
DELETE |
Удаление строк из таблицы. | Всегда используйте WHERE, иначе будут удалены все строки. Не удаляет структуру таблицы. |
MERGE (UPSERT) |
Комбинированная операция: вставка, если строки нет, или обновление, если есть. | Доступна не во всех СУБД (в PostgreSQL — INSERT ... ON CONFLICT, в MySQL — INSERT ... ON DUPLICATE KEY UPDATE). |
Примеры команд DML:
-- 1. SELECT (выборка данных)
SELECT id, name, email FROM users WHERE active = TRUE ORDER BY name;
-- 2. INSERT (добавление данных)
-- Вставка одной строки
INSERT INTO products (name, price, category_id)
VALUES ('Монитор', 25000, 3);
-- Вставка нескольких строк
INSERT INTO products (name, price)
VALUES ('Клавиатура', 4000), ('Мышь', 2000);
-- 3. UPDATE (обновление данных)
-- Обновление конкретной строки
UPDATE users SET password_hash = 'new_hash', updated_at = NOW()
WHERE id = 42;
-- 4. DELETE (удаление данных)
-- Удаление устаревших записей
DELETE FROM session_logs WHERE created_at < NOW() - INTERVAL '30 days';
-- 5. MERGE (пример для SQL Server / Oracle)
MERGE INTO user_settings AS target
USING (VALUES ('user123', 'dark')) AS source (user_id, theme)
ON target.user_id = source.user_id
WHEN MATCHED THEN
UPDATE SET target.theme = source.theme
WHEN NOT MATCHED THEN
INSERT (user_id, theme) VALUES (source.user_id, source.theme);
Важное замечание: Команды DML (INSERT, UPDATE, DELETE) внутри транзакции могут быть отменены командой ROLLBACK до выполнения COMMIT. Это обеспечивает целостность данных.