Что такое DML (Data Manipulation Language) в SQL?

Ответ

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. Это обеспечивает целостность данных.

Ответ 18+ 🔞

А, слушай, вот эта ваша DML, блядь! Это ж не просто буквы, это, сука, язык, на котором база данных с тобой разговаривает, когда ты её просишь что-то сделать с данными. Не таблицы строить, а именно с содержимым ковыряться. Прям как в холодильнике: DDL — это полки новые прибить, а DML — это достать, переложить или, что чаще бывает, сожрать колбасу.

Короче, команды главные, их всего четыре, ну или пять, если считать одну хитрожопую.

  1. SELECT — это святое, блядь. Ты ему: «Дай-ка посмотреть». Он тебе: «На, смотри, только не обляпайся». Без него нихуя, это 90% всех запросов. Фильтруй, сортируй, объединяй — делай что хочешь.
  2. INSERT — это когда ты приносишь в дом новую вещь. «Вот, база, держи новую запись, втисни её куда-нибудь». Можно одну, можно пачкой, как из магазина.
  3. UPDATE — а это когда ты взял и перекрасил стену. Или, что точнее, когда колбасу надкусил и положил обратно. ВНИМАНИЕ, ЕБАНАРОТ! Тут ОБЯЗАТЕЛЬНО надо говорить WHERE, а то ты все строки в таблице обновишь, а потом будешь охуевать, почему у всех пользователей пароль «qwerty123».
  4. DELETE — ну тут всё ясно. Вынос мусора. И опять — WHERE, мать его! Иначе вынесешь не мусор, а весь холодильник в окно, вместе с морозилкой. Таблица-то пустая останется, но структура — да, цела.
  5. MERGE (или UPSERT) — это уже высший пилотаж, ёпта. Типа: «Слушай, база, если такая запись уже есть — обнови её, а если нет — так вставь новую, не дергай меня по мелочам». В каждой СУБД своя реализация, споры из-за этого — пиздец на форумах.

Вот, смотри, как это в коде выглядит, не трогай его, он и так хорош:

-- 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);

-- 3. UPDATE (поменять пароль юзеру с id=42)
UPDATE users SET password_hash = 'new_hash', updated_at = NOW() 
WHERE id = 42; -- Видишь WHERE? Вот и я вижу. Молодец.

-- 4. DELETE (почистить старые логи)
DELETE FROM session_logs WHERE created_at < NOW() - INTERVAL '30 days';

-- 5. MERGE (хитрая жопа для настроек)
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);

И главное, запомни, ебать мои старые костыли: все эти штуки — INSERT, UPDATE, DELETE — обычно в транзакциях живут. Пока не скажешь COMMIT — всё можно откатить назад, как будто ничего и не было. Сделал хуйню — ROLLBACK, и волнение ебать уходит. Красота, да?