Ответ
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 — это достать, переложить или, что чаще бывает, сожрать колбасу.
Короче, команды главные, их всего четыре, ну или пять, если считать одну хитрожопую.
SELECT— это святое, блядь. Ты ему: «Дай-ка посмотреть». Он тебе: «На, смотри, только не обляпайся». Без него нихуя, это 90% всех запросов. Фильтруй, сортируй, объединяй — делай что хочешь.INSERT— это когда ты приносишь в дом новую вещь. «Вот, база, держи новую запись, втисни её куда-нибудь». Можно одну, можно пачкой, как из магазина.UPDATE— а это когда ты взял и перекрасил стену. Или, что точнее, когда колбасу надкусил и положил обратно. ВНИМАНИЕ, ЕБАНАРОТ! Тут ОБЯЗАТЕЛЬНО надо говоритьWHERE, а то ты все строки в таблице обновишь, а потом будешь охуевать, почему у всех пользователей пароль «qwerty123».DELETE— ну тут всё ясно. Вынос мусора. И опять —WHERE, мать его! Иначе вынесешь не мусор, а весь холодильник в окно, вместе с морозилкой. Таблица-то пустая останется, но структура — да, цела.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, и волнение ебать уходит. Красота, да?