Какие SQL-операторы используются для изменения данных (DML)?

Ответ

Для модификации данных в реляционных базах данных используются операторы языка манипулирования данными (DML - Data Manipulation Language). Основные из них:

1. INSERT — добавление новых строк.

-- Добавление одной строки с указанием столбцов
INSERT INTO employees (first_name, last_name, department_id)
VALUES ('Иван', 'Петров', 5);

-- Добавление нескольких строк
INSERT INTO employees (first_name, last_name)
VALUES ('Анна', 'Сидорова'),
       ('Петр', 'Иванов');

-- Добавление данных из результата SELECT
INSERT INTO archive_employees (id, name)
SELECT id, CONCAT(first_name, ' ', last_name)
FROM employees
WHERE termination_date IS NOT NULL;

2. UPDATE — обновление существующих строк. Важно: Всегда использовать WHERE, чтобы не обновить всю таблицу.

-- Обновление одной записи
UPDATE employees
SET salary = salary * 1.10,  -- Увеличить зарплату на 10%
    last_review_date = CURRENT_DATE
WHERE id = 42;

-- Обновление на основе подзапроса
UPDATE orders o
SET status = 'processed'
WHERE o.id IN (
    SELECT order_id FROM payments WHERE is_confirmed = TRUE
);

3. DELETE — удаление строк.

-- Удаление конкретной записи
DELETE FROM log_entries
WHERE created_at < DATE_SUB(NOW(), INTERVAL 90 DAY);

-- Каскадное удаление (зависит от внешних ключей)
DELETE FROM departments WHERE id = 10;

4. MERGE (UPSERT) — объединение вставки и обновления. Полезен для синхронизации данных.

MERGE INTO inventory AS target
USING (SELECT 101 AS product_id, 50 AS new_quantity) AS source
ON target.product_id = source.product_id
WHEN MATCHED THEN
    UPDATE SET target.quantity = target.quantity + source.new_quantity
WHEN NOT MATCHED THEN
    INSERT (product_id, quantity) VALUES (source.product_id, source.new_quantity);

5. TRUNCATE — быстрое удаление всех строк из таблицы.

  • Нельзя использовать с WHERE.
  • Сбрасывает автоинкрементные счетчики.
  • Обычно не пишется в журнал транзакций для каждой строки (нельзя откатить в некоторых СУБД).
  • Требует более высоких привилегий, чем DELETE.
    TRUNCATE TABLE temporary_session_data; -- Все данные удалены безвозвратно

Безопасность: Все операции UPDATE и DELETE должны выполняться в транзакциях при работе с продуктивными данными, чтобы была возможность отката (ROLLBACK).

Ответ 18+ 🔞

Да блядь, ну вот, опять эти ваши буквы: D-M-L. Как будто в детстве азбуку учим, а не базы данных грём. Слушай сюда, разберём по косточкам, как этими штуками пользоваться, чтобы себе же в жопу не выстрелить.

1. INSERT — это когда ты запихиваешь новую хуйню в таблицу. Представь, что таблица — это твой холодильник, а INSERT — это когда ты заносишь туда новую банку пива.

-- Кладёшь одну банку (строку) на полочку, точно указывая, куда
INSERT INTO employees (first_name, last_name, department_id)
VALUES ('Иван', 'Петров', 5);

-- А можно сразу пачку занести, чтоб два раза не бегать
INSERT INTO employees (first_name, last_name)
VALUES ('Анна', 'Сидорова'),
       ('Петр', 'Иванов');

-- А это когда ты перекладываешь просроченный йогурт (данные) из основного отсека в контейнер для мусора (архив)
INSERT INTO archive_employees (id, name)
SELECT id, CONCAT(first_name, ' ', last_name)
FROM employees
WHERE termination_date IS NOT NULL;

2. UPDATE — это когда ты меняешь то, что уже лежит внутри. Вот тут, блядь, внимание, ёпта! Это как взять маркер и подписать свою банку, чтобы сосед не спиздил. Если забудешь условие WHERE — подпишешь ВСЁ ПИВО В ХОЛОДИЛЬНИКЕ. Пиздец настанет.

-- Повысим Васеньке из отдела 5 зарплату, хороший же мужик
UPDATE employees
SET salary = salary * 1.10,  -- Добавим 10%, ебать его в сраку
    last_review_date = CURRENT_DATE
WHERE id = 42; -- Вот эта строчка, блядь, главная! Без неё повысятся ВСЕМ, включая уборщицу МарьИванну.

-- А тут мы обновляем заказы, которые уже оплатили. Хитро, через подзапрос.
UPDATE orders o
SET status = 'processed'
WHERE o.id IN (
    SELECT order_id FROM payments WHERE is_confirmed = TRUE
);

3. DELETE — это когда ты выкидываешь хуйню нахуй. Тот же принцип: если не указать WHERE, выкинешь ВСЁ СОДЕРЖИМОЕ ХОЛОДИЛЬНИКА В МУСОРКУ. Охуенно? Нет, пиздец.

-- Выкидываем старые логи, которым больше 90 дней. Ну нихуя себе хранилище не резиновое.
DELETE FROM log_entries
WHERE created_at < DATE_SUB(NOW(), INTERVAL 90 DAY);

-- Удаление отдела. Если настроены каскадные связи, то вслед за ним могут поехать и все сотрудники. Страшная хуйня.
DELETE FROM departments WHERE id = 10;

4. MERGE (или UPSERT) — хитрая жопа, которая решает: то ли обновить, то ли вставить. Представь, что у тебя список гостей на хате. Человек пришёл — смотришь, если он уже в списке (MATCHED), ставишь ему галочку "уже тут". Если новенький (NOT MATCHED) — вписываешь его имя с нуля.

MERGE INTO inventory AS target
USING (SELECT 101 AS product_id, 50 AS new_quantity) AS source
ON target.product_id = source.product_id
WHEN MATCHED THEN
    UPDATE SET target.quantity = target.quantity + source.new_quantity
WHEN NOT MATCHED THEN
    INSERT (product_id, quantity) VALUES (source.product_id, source.new_quantity);

5. TRUNCATE — это не удаление, это ебаный расстрел всей таблицы на месте. Это когда ты берёшь и просто выносишь весь холодильник нахуй, вместе с полками и морозилкой. Быстро, беспощадно, и обычно без права на реабилитацию (ROLLBACK). Автоинкрементные счётчики обнуляются, как и твои надежды восстановить данные.

TRUNCATE TABLE temporary_session_data; -- И нету данных. Вообще. Пизда.

И главный наказ, блядь, выбей себе на лбу: Любое UPDATE и DELETE на боевой базе — это только внутри ТРАНЗАКЦИИ! Сначала BEGIN, потом делаешь свои грязные делишки, смотришь — всё ли ок. Если всё пиздато — COMMIT. Если накосячил — ROLLBACK, и всё как будто и не было. Волшебство, ёпта! Игнорируешь это правило — однажды проснёшься героем, который обнулил продажи за полгода.