🚀 Начался ноябрь! SQLtest.online остаётся бесплатным благодаря донатам таких людей, как вы. Помогите собрать сумму этого месяца пораньше, чтобы сайт работал без перебоев. Поддержать сейчас →
SQL код скопирован в буфер обмена

SQL UPDATE: изменение существующих строк

Урок 8.2 · Время чтения: ~7 мин · Задачи для практики ↓

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

INSERT добавляет новые строки; UPDATE исправляет и поддерживает существующие: клиент сменил email, цены выросли, статус сменился с «активен» на «неактивен». Один UPDATE может изменить и одну строку, и миллионы, поэтому он требует такой же осторожности, как DELETE.

Учебные базы данных на SQLtest доступны только для чтения, поэтому там эти операторы вернут ошибку доступа. Примеры используют схему Sakila.

SQL UPDATE: SET задаёт новые значения, WHERE выбирает изменяемые строки, а UPDATE без WHERE меняет все строки таблицы

Синтаксис UPDATE

UPDATE table_name
SET column1 = value1,
    column2 = value2
WHERE condition;
  • UPDATE указывает таблицу.
  • SET перечисляет столбцы и их новые значения.
  • WHERE выбирает строки для изменения. Без WHERE обновляется каждая строка таблицы.

Обновление одной строки

UPDATE customer
SET email = 'mary.smith@example.com'
WHERE customer_id = 1;

Результат: изменена одна строка; условие по первичному ключу соответствует ровно одному клиенту.

Фильтр по первичному ключу - самый безопасный способ изменить конкретную строку: имена могут повторяться, ключи - нет.


Обновление нескольких столбцов

Перечислите присваивания в SET через запятую:

UPDATE customer
SET first_name = 'ALICE',
    last_name = 'COOPER',
    email = 'alice.cooper@example.com'
WHERE customer_id = 42;

Результат: три столбца клиента 42 изменены одним оператором.


Расчёт от текущего значения

Правая часть SET может использовать текущее значение столбца:

UPDATE film
SET rental_rate = rental_rate + 1.00
WHERE rating = 'NC-17';

Результат: ставка аренды всех 210 фильмов NC-17 увеличена на $1.

Все выражения в SET используют значения до обновления, поэтому в стандартном SQL SET a = b, b = a меняет два столбца местами. MySQL - исключение: он применяет присваивания слева направо, и последующие видят уже новые значения.


Обновление строк по данным другой таблицы

Чтобы изменить строки по условию из другой таблицы, используйте подзапрос в WHERE. Повысим ставку аренды всех комедий на 10%:

UPDATE film
SET rental_rate = rental_rate * 1.10
WHERE film_id IN (
    SELECT fc.film_id
    FROM film_category AS fc
    INNER JOIN category AS c ON c.category_id = fc.category_id
    WHERE c.name = 'Comedy'
);

Результат: ставка 58 комедий увеличена на 10%.

MySQL и MariaDB не позволяют подзапросу читать обновляемую таблицу: WHERE film_id IN (SELECT f.film_id FROM film f ...) завершится ошибкой «You can't specify target table 'film' for update in FROM clause». Пишите подзапрос по другим таблицам, как выше.

MySQL и MariaDB поддерживают также многотабличный UPDATE с JOIN:

UPDATE film AS f
INNER JOIN film_category AS fc ON fc.film_id = f.film_id
INNER JOIN category AS c ON c.category_id = fc.category_id
SET f.rental_rate = f.rental_rate * 1.10
WHERE c.name = 'Comedy';

В PostgreSQL вместо этого используется UPDATE film SET ... FROM film_category, category WHERE ..., а в SQL Server - UPDATE f SET ... FROM film f JOIN ....


Присвоение NULL

UPDATE film
SET original_language_id = NULL
WHERE film_id = 10;

Обратите внимание на разницу: SET column = NULL присваивает «нет значения», а WHERE column = NULL ничему не соответствует; в условиях используйте IS NULL.


Проверка перед обновлением

  1. Выполните SELECT с тем же WHERE и проверьте строки и их количество.
  2. Затем выполните UPDATE и сравните число «затронутых строк» с результатом SELECT.
-- 1. Какие строки изменятся?
SELECT film_id, title, rental_rate
FROM film
WHERE rating = 'NC-17';
-- 2. Изменить ровно эти строки
UPDATE film
SET rental_rate = rental_rate + 1.00
WHERE rating = 'NC-17';

В рабочей среде выполняйте важные обновления внутри транзакции, чтобы ошибку можно было откатить. В MySQL Workbench и клиенте MySQL есть также режим «safe updates», который отклоняет UPDATE и DELETE без условия по ключу.


Ключевые выводы:

  • UPDATE table SET column = value WHERE condition изменяет существующие строки.
  • Без WHERE меняется каждая строка таблицы.
  • SET может присвоить значения нескольким столбцам и использовать их текущие значения.
  • Чтобы обновить строки по другой таблице, используйте подзапрос в WHERE или многотабличный UPDATE; в MySQL подзапрос не может читать обновляемую таблицу.
  • Сначала проверьте строки с помощью SELECT и сравните число затронутых строк.

Часто задаваемые вопросы

Что произойдёт, если выполнить UPDATE без WHERE?

Будет обновлена каждая строка таблицы. Защитой может быть только незафиксированная транзакция, режим safe updates или резервная копия. Всегда проверяйте предложение WHERE перед запуском UPDATE.

Как обновить несколько столбцов в SQL?

Перечислите их в SET через запятую: UPDATE customer SET first_name = 'ALICE', last_name = 'COOPER' WHERE customer_id = 42;.

Как обновить таблицу значениями из другой таблицы?

Используйте подзапрос в WHERE или SET либо многотабличное обновление. В MySQL: UPDATE t1 JOIN t2 ON ... SET t1.col = t2.col WHERE ...; в PostgreSQL: UPDATE t1 SET col = t2.col FROM t2 WHERE t1.id = t2.id.

Попробуйте решить следующие задачи, чтобы закрепить материал этого урока.

  1. Обновите почтовый индекс
  2. Выполнить обновление цен
  3. Обновить стоимость замены
  4. Обновить информацию о проекте
  5. Изменить вилку окладов