- Добавлять одну или несколько строк с помощью
INSERT - Изменять строки по условию с помощью
UPDATE - Удалять строки с помощью
DELETEи понимать опасность команд безWHERE
До сих пор мы только читали данные. Но настоящие приложения меняют данные каждый день: в школу приходит новый ученик, в магазине растут цены, отменённые заказы удаляются. Для этого в SQL есть три команды: INSERT, UPDATE и DELETE. Не волнуйся: каждый пример здесь выполняется на свежей копии учебной базы, так что ничего не сломается навсегда.
INSERT: добавление строк
INSERT INTO таблица (столбцы) VALUES (значения) — значения пишутся в том же порядке, что и столбцы. Столбец id мы не указываем: в SQLite столбец INTEGER PRIMARY KEY автоматически получает следующий номер. В одном блоке можно написать несколько команд — показывается результат последнего SELECT.
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ı
Чтобы добавить несколько строк одной командой, перечисли группы значений через запятую:
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 пропустить нельзя — СУБД отклонит команду.
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
-- 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.
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 %.
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.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
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.
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
-- no WHERE: every row is deleted
DELETE FROM enrollments;
SELECT COUNT(*) AS rows_left
FROM enrollments;▸ Ожидаемый результат
rows_left 0
- 1Сначала SELECT
Напиши
SELECT *с тем жеWHEREи посмотри, какие строки будут затронуты. - 2Посчитай строки
Проверь с помощью
COUNT(*), что число совпадает с ожидаемым. - 3Затем изменяй
Замени
SELECT *наDELETEилиUPDATE ... SET, не трогаяWHERE. - 4Важные изменения — в транзакции
В настоящей базе делай крупные изменения внутри транзакции, чтобы при ошибке их можно было отменить. Этому посвящён последний урок.
| Задача | SQLite | MySQL | PostgreSQL | SQL Server |
|---|---|---|---|---|
| Быстро удалить все строки | DELETE FROM t | TRUNCATE TABLE t | TRUNCATE TABLE t | TRUNCATE TABLE t |
| id новой строки | LAST_INSERT_ROWID() | LAST_INSERT_ID() | RETURNING id | SCOPE_IDENTITY() |
| Обновить, если есть, иначе вставить | ON CONFLICT … DO UPDATE | ON DUPLICATE KEY UPDATE | ON CONFLICT … DO UPDATE | MERGE |
В магазин поступил новый товар: Tablet, категория Electronics, цена 520, на складе 10 штук. Добавь его в products, затем выведи название, цену и остаток всех товаров Electronics по убыванию цены.
-- 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 знаков после запятой. Затем выведи название и новую цену этих товаров, отсортировав по названию.
-- 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.