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