Ответ
Для модификации данных в реляционных базах данных используются операторы языка манипулирования данными (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, и всё как будто и не было. Волшебство, ёпта! Игнорируешь это правило — однажды проснёшься героем, который обнулил продажи за полгода.