UPDATE в Oracle SQL — как безопасно изменить данные

Оператор UPDATE в Oracle SQL используется для изменения существующих данных в таблице. Он позволяет обновлять отдельные столбцы, вычислять новые значения, использовать условия и даже подзапросы. В этой статье ты найдёшь 50 примеров правильного и безопасного применения UPDATE.


🖋️ Синтаксис оператора UPDATE

UPDATE имя_таблицы
SET столбец1 = выражение1,
    столбец2 = выражение2
[WHERE условие];

Можно использовать:

  • подзапросы в SET
  • фильтрацию по WHERE
  • RETURNING INTO для получения значений
  • объединения с MERGE или JOIN

🔄 Где применяется UPDATE

  • Обновление одного или нескольких значений
  • Восстановление, пересчёт, округление данных
  • Массовое обновление после миграций или пересмотра логики
  • Работа с транзакциями и логами

📊 Примеры использования UPDATE в Oracle SQL (1–5 из 50)

  1. Обновление одного поля:
UPDATE employees SET salary = 6000 WHERE employee_id = 100;
  1. Обновление нескольких полей:
UPDATE employees SET salary = 5000, commission_pct = 0.1 WHERE department_id = 50;
  1. Условие с IN:
UPDATE employees SET status = 'INACTIVE' WHERE department_id IN (10, 20);
  1. Обновление с подзапросом:
UPDATE employees SET department_id = (
  SELECT department_id FROM departments WHERE department_name = 'HR'
) WHERE employee_id = 101;
  1. Обновление без WHERE (все строки):
UPDATE employees SET updated_at = SYSDATE;
  1. UPDATE с условием BETWEEN:
UPDATE employees SET bonus = 1000 WHERE salary BETWEEN 3000 AND 5000;
  1. UPDATE с LIKE:
UPDATE employees SET department_name = 'Sales'
WHERE department_name LIKE 'S%';
  1. UPDATE с IS NULL:
UPDATE employees SET commission_pct = 0 WHERE commission_pct IS NULL;
  1. UPDATE с IS NOT NULL:
UPDATE employees SET status = 'HAS_MANAGER' WHERE manager_id IS NOT NULL;
  1. UPDATE с математическим выражением:
UPDATE employees SET salary = salary * 1.05;
  1. UPDATE с функцией NVL:
UPDATE employees SET commission_pct = NVL(commission_pct, 0);
  1. UPDATE с CASE:
UPDATE employees SET salary = 
  CASE
    WHEN department_id = 10 THEN salary * 1.10
    WHEN department_id = 20 THEN salary * 1.20
    ELSE salary
  END;
  1. UPDATE с подзапросом EXISTS:
UPDATE employees SET status = 'ACTIVE'
WHERE EXISTS (
  SELECT 1 FROM departments d WHERE d.department_id = employees.department_id
);
  1. UPDATE с подзапросом IN:
UPDATE employees SET bonus = 500
WHERE department_id IN (SELECT department_id FROM departments WHERE location_id = 1700);
  1. UPDATE с JOIN через MERGE:
MERGE INTO employees e
USING departments d
ON (e.department_id = d.department_id)
WHEN MATCHED THEN UPDATE SET e.location_id = d.location_id;
  1. UPDATE с аналитикой:
UPDATE employees SET rating = (
  SELECT RANK() OVER (ORDER BY salary DESC)
  FROM dual
) WHERE department_id = 10;
  1. UPDATE с использованием RETURNING:
UPDATE employees SET salary = salary + 1000
WHERE employee_id = 101
RETURNING salary INTO :new_salary;
  1. UPDATE только одной строки (ROWNUM):
UPDATE (SELECT * FROM employees WHERE department_id = 50 AND ROWNUM = 1)
SET salary = salary + 500;
  1. UPDATE с TRUNC:
UPDATE employees SET salary = TRUNC(salary, -2);
  1. UPDATE с ROUND:
UPDATE employees SET commission_pct = ROUND(commission_pct, 2);
  1. UPDATE с выражением CONCAT:
UPDATE employees SET email = LOWER(first_name || '.' || last_name || '@company.com');
  1. UPDATE с CURRENT_DATE:
UPDATE employees SET last_update = CURRENT_DATE;
  1. UPDATE с SYSDATE:
UPDATE employees SET audit_time = SYSDATE WHERE department_id = 90;
  1. UPDATE с вложенным SELECT:
UPDATE employees SET department_id = (
  SELECT department_id FROM departments WHERE department_name = 'Marketing'
) WHERE employee_id = 104;
  1. UPDATE по результатам аналитики:
MERGE INTO employees e
USING (
  SELECT employee_id, RANK() OVER (ORDER BY salary DESC) AS rnk FROM employees
) r ON (e.employee_id = r.employee_id)
WHEN MATCHED THEN UPDATE SET e.rank = r.rnk;
  1. UPDATE с INTERVAL:
UPDATE employees SET hire_date = hire_date + INTERVAL '1' YEAR WHERE department_id = 30;
  1. UPDATE с JSON_VALUE:
UPDATE employees_json SET status = 'ok'
WHERE JSON_VALUE(data, '$.active') = 'true';
  1. UPDATE с JSON_TABLE:
MERGE INTO employees e
USING (
  SELECT * FROM JSON_TABLE(:json_doc, '$.items[*]'
    COLUMNS (id NUMBER PATH '$.id', new_bonus NUMBER PATH '$.bonus'))
) j ON (e.employee_id = j.id)
WHEN MATCHED THEN UPDATE SET e.bonus = j.new_bonus;
  1. UPDATE с TO_CHAR и датой:
UPDATE employees SET hire_year = TO_CHAR(hire_date, 'YYYY');
  1. UPDATE с TO_DATE:
UPDATE employees SET review_date = TO_DATE('2024-06-01', 'YYYY-MM-DD');
  1. UPDATE с аналитикой DENSE_RANK:
MERGE INTO employees e
USING (
  SELECT employee_id, DENSE_RANK() OVER (ORDER BY salary DESC) AS rnk FROM employees
) r ON (e.employee_id = r.employee_id)
WHEN MATCHED THEN UPDATE SET e.rank = r.rnk;
  1. UPDATE только если значение отличается:
UPDATE employees SET status = 'updated'
WHERE NVL(status, 'none') != 'updated';
  1. UPDATE и COALESCE:
UPDATE employees SET region = COALESCE(region, 'NA');
  1. UPDATE с NULLIF:
UPDATE employees SET bonus = NULLIF(salary, 5000);
  1. UPDATE с PERCENT_RANK:
MERGE INTO employees e
USING (
  SELECT employee_id, PERCENT_RANK() OVER (ORDER BY salary) AS pr FROM employees
) r ON (e.employee_id = r.employee_id)
WHEN MATCHED THEN UPDATE SET e.percentile = r.pr;
  1. UPDATE с JSON_MERGEPATCH:
UPDATE employees_json
SET data = JSON_MERGEPATCH(data, '{"active":false}');
  1. UPDATE на основе другого пользователя:
UPDATE employees SET manager_id = (
  SELECT employee_id FROM employees WHERE last_name = 'King'
) WHERE department_id = 60;
  1. UPDATE с проверкой EXTRACT:
UPDATE employees SET status = 'senior'
WHERE EXTRACT(YEAR FROM hire_date) < 2015;
  1. UPDATE только последних N записей:
UPDATE (
  SELECT * FROM employees ORDER BY hire_date DESC FETCH FIRST 5 ROWS ONLY
) SET bonus = 1000;
  1. UPDATE с выражением SIGN:
UPDATE employees SET flag = SIGN(salary - 5000);
  1. UPDATE со вложенным CASE:
UPDATE employees SET score =
  CASE
    WHEN salary > 10000 THEN 5
    WHEN salary > 5000 THEN 3
    ELSE 1
  END;
  1. UPDATE с фильтром JOIN:
MERGE INTO employees e
USING approved_employees a
ON (e.employee_id = a.employee_id)
WHEN MATCHED THEN UPDATE SET e.status = 'approved';
  1. UPDATE с подзапросом в SET:
UPDATE employees SET location_id = (
  SELECT location_id FROM departments WHERE department_id = employees.department_id
);
  1. UPDATE с транзакцией:
BEGIN
  UPDATE employees SET salary = salary + 500 WHERE department_id = 70;
  COMMIT;
END;
  1. UPDATE с записью в лог:
BEGIN
  UPDATE employees SET audit = 'done' WHERE status = 'pending';
  INSERT INTO audit_log (event, time) VALUES ('Обновление', SYSDATE);
  COMMIT;
END;

📆 Заключение: как правильно использовать UPDATE в Oracle SQL

UPDATE — один из самых мощных операторов SQL. Он позволяет гибко изменять данные, но требует осторожности. Используй WHERE, тестируй запросы на подмножестве, проверяй логику SET. В сочетании с RETURNING, транзакциями и подзапросами UPDATE превращается в мощный инструмент управления данными.


🕸️ Следующая статья:

USER в Oracle SQL — как получить имя текущего пользователя

Понравилась статья? Поделиться с друзьями:
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest
0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии