Перейти к содержанию
Educora
Продвинутый16 мин10 / 22

INSERT, UPDATE, DELETE: изменение данных

Добавляй в таблицу новые строки, изменяй существующие и удаляй ненужные — и научись делать это безопасно.

Проверь себя
В этом уроке ты узнаешь
  • Добавлять одну или несколько строк с помощью INSERT
  • Изменять строки по условию с помощью UPDATE
  • Удалять строки с помощью DELETE и понимать опасность команд без WHERE

До сих пор мы только читали данные. Но настоящие приложения меняют данные каждый день: в школу приходит новый ученик, в магазине растут цены, отменённые заказы удаляются. Для этого в SQL есть три команды: INSERT, UPDATE и DELETE. Не волнуйся: каждый пример здесь выполняется на свежей копии учебной базы, так что ничего не сломается навсегда.

INSERT: добавление строк

INSERT INTO таблица (столбцы) VALUES (значения) — значения пишутся в том же порядке, что и столбцы. Столбец id мы не указываем: в SQLite столбец INTEGER PRIMARY KEY автоматически получает следующий номер. В одном блоке можно написать несколько команд — показывается результат последнего SELECT.

SQL
INSERT INTO students (first_name, last_name, age, grade, city, email)
VALUES ('Nərmin', 'Səlimova', 15, 9, 'Bakı', 'narmin@example.com');

SELECT id, first_name, last_name, city
FROM students
WHERE id > 10
ORDER BY id;
▸ Ожидаемый результат
id | first_name | last_name | city
11 | Fidan | Cəfərova | Naxçıvan
12 | Orxan | Babayev | Sumqayıt
13 | Nərmin | Səlimova | Bakı
Новая ученица автоматически получила номер 13.

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

SQL
INSERT INTO products (name, category, price, stock)
VALUES ('Calculator', 'Stationery', 18.5, 70),
       ('Board game', 'Games',      29.9, 12);

SELECT id, name, category, price, stock
FROM products
WHERE category IN ('Stationery', 'Games')
ORDER BY id;
▸ Ожидаемый результат
id | name | category | price | stock
4 | Notebook | Stationery | 3.2 | 500
5 | Pen set | Stationery | 7.9 | 300
10 | Chess set | Games | 42 | 18
11 | Calculator | Stationery | 18.5 | 70
12 | Board game | Games | 29.9 | 12

Столбцы, которых нет в списке, получают NULL (или значение DEFAULT, заданное в таблице). У покупателя ниже не указана дата регистрации, поэтому joined_on равен NULL. А вот столбец с ограничением NOT NULL пропустить нельзя — СУБД отклонит команду.

SQL
INSERT INTO customers (name, city, country)
VALUES ('Aygün Qasımova', 'Quba', 'Azerbaijan');

SELECT id, name, city, joined_on
FROM customers
WHERE id >= 6
ORDER BY id;
▸ Ожидаемый результат
id | name | city | joined_on
6 | Zəhra Hüseynli | Bakı | 2025-02-14
7 | Mehmet Kaya | Ankara | 2025-04-01
8 | Aygün Qasımova | Quba | NULL
SQL
-- last_name is NOT NULL, so this fails
INSERT INTO students (first_name, age)
VALUES ('Test', 10);
▸ Ожидаемый результат
Error: NOT NULL constraint failed: students.last_name

INSERT можно объединить и с SELECT: тогда новые строки берутся из результата другого запроса. Например, запишем всех одиннадцатиклассников на курс 7 (English B1). Балла пока нет, поэтому пишем NULL.

SQL
INSERT INTO enrollments (student_id, course_id, score, enrolled_on)
SELECT id, 7, NULL, '2025-10-01'
FROM students
WHERE grade = 11
ORDER BY id;

SELECT e.student_id, s.first_name, e.score, e.enrolled_on
FROM enrollments AS e
JOIN students AS s ON s.id = e.student_id
WHERE e.course_id = 7
ORDER BY e.id;
▸ Ожидаемый результат
student_id | first_name | score | enrolled_on
3 | Leyla | 90 | 2025-09-17
7 | Günay | 64 | 2025-09-20
4 | Elvin | NULL | 2025-10-01
8 | Tural | NULL | 2025-10-01
11 | Fidan | NULL | 2025-10-01

UPDATE: изменение строк

UPDATE таблица SET столбец = значение WHERE условие меняет значение столбца в строках, подходящих под условие. Новое значение можно вычислить из старого. Ниже мы повышаем цены на канцтовары на 10 %.

SQL
UPDATE products
SET price = ROUND(price * 1.10, 2)
WHERE category = 'Stationery';

SELECT name, price
FROM products
WHERE category = 'Stationery'
ORDER BY id;
▸ Ожидаемый результат
name | price
Notebook | 3.52
Pen set | 8.69
Пример задачи

Наушники (Headphones) теперь стоят 99,90, и на склад пришло ещё 10 штук. Обнови таблицу.

Показать решение
В одном SET можно через запятую изменить несколько столбцов.
Цена — фиксированное число: price = 99.9, а остаток вычисляется из старого: stock = stock + 10.
WHERE name = 'Headphones' выбирает только одну строку. Итог: цена 99,9, остаток 40 + 10 = 50.
SQL
UPDATE products
SET price = 99.9,
    stock = stock + 10
WHERE name = 'Headphones';

SELECT name, price, stock
FROM products
WHERE name = 'Headphones';
▸ Ожидаемый результат
name | price | stock
Headphones | 99.9 | 50
SQL
UPDATE students
SET grade = grade + 1;

SELECT first_name, grade
FROM students
ORDER BY id
LIMIT 3;
▸ Ожидаемый результат
first_name | grade
Aysel | 10
Murad | 11
Leyla | 9

DELETE: удаление строк

DELETE FROM таблица WHERE условие удаляет строки, подходящие под условие. Ниже мы удаляем заказы, сделанные до марта: из 12 заказов удаляются 4, остаётся 8.

SQL
DELETE FROM orders
WHERE order_date < '2025-03-01';

SELECT COUNT(*) AS orders_left,
       MIN(order_date) AS first_order
FROM orders;
▸ Ожидаемый результат
orders_left | first_order
8 | 2025-03-05
SQL
-- no WHERE: every row is deleted
DELETE FROM enrollments;

SELECT COUNT(*) AS rows_left
FROM enrollments;
▸ Ожидаемый результат
rows_left
0
  1. 1
    Сначала SELECT

    Напиши SELECT * с тем же WHERE и посмотри, какие строки будут затронуты.

  2. 2
    Посчитай строки

    Проверь с помощью COUNT(*), что число совпадает с ожидаемым.

  3. 3
    Затем изменяй

    Замени SELECT * на DELETE или UPDATE ... SET, не трогая WHERE.

  4. 4
    Важные изменения — в транзакции

    В настоящей базе делай крупные изменения внутри транзакции, чтобы при ошибке их можно было отменить. Этому посвящён последний урок.

ЗадачаSQLiteMySQLPostgreSQLSQL Server
Быстро удалить все строкиDELETE FROM tTRUNCATE TABLE tTRUNCATE TABLE tTRUNCATE TABLE t
id новой строкиLAST_INSERT_ROWID()LAST_INSERT_ID()RETURNING idSCOPE_IDENTITY()
Обновить, если есть, иначе вставитьON CONFLICT … DO UPDATEON DUPLICATE KEY UPDATEON CONFLICT … DO UPDATEMERGE
Различия диалектов в командах изменения данных.
Задание

В магазин поступил новый товар: Tablet, категория Electronics, цена 520, на складе 10 штук. Добавь его в products, затем выведи название, цену и остаток всех товаров Electronics по убыванию цены.

Задание · SQL
-- 1) INSERT the new product

-- 2) check the result
SELECT name, price, stock
FROM products
WHERE category = 'Electronics'
ORDER BY price DESC;
▸ Ожидаемый результат
name | price | stock
Laptop | 1450 | 8
Smartphone | 899.99 | 15
Tablet | 520 | 10
Monitor | 310 | 0
Headphones | 120.5 | 40
Задание

Канцтовары подешевели на 20%: снизь цену товаров категории Stationery на 20% и округли её до 2 знаков после запятой. Затем выведи название и новую цену этих товаров, отсортировав по названию.

Задание · SQL
-- 1) UPDATE the prices (don't forget WHERE!)

-- 2) check the result
SELECT name, price
FROM products
WHERE category = 'Stationery'
ORDER BY name;
▸ Ожидаемый результат
name | price
Notebook | 2.56
Pen set | 6.32

Главное

  • INSERT INTO t (столбцы) VALUES (...) добавляет строку; всегда перечисляй столбцы.
  • Пропущенные столбцы получают NULL или DEFAULT; столбец NOT NULL пропустить нельзя.
  • UPDATE t SET столбец = значение WHERE ... меняет строки; новое значение можно вычислить из старого.
  • DELETE FROM t WHERE ... удаляет строки.
  • UPDATE и DELETE без WHERE затрагивают всю таблицу — сначала выполни SELECT с тем же условием.

Проверь себя

Вопросов: 10. Каждый правильный ответ приносит XP.

1 / 10
Какая команда добавляет в таблицу новую строку?