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

«Какие SQL-операторы используются для изменения данных (DML)?» — вопрос из категории Базы данных и SQL, который задают на 10% собеседований QA Тестировщик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Для модификации данных в реляционных базах данных используются операторы языка манипулирования данными (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).