INSERT, UPDATE, DELETE

Учимся добавлять, изменять и удалять строки таблицы.

INSERT, UPDATE, DELETE — три команды изменения данных: добавить строки, поменять значения в существующих, удалить ненужные.

INSERT — варианты вставки

Базовый INSERT мы уже видели. Полезно знать его варианты. Можно указать столбцы явно (рекомендуется) или вставить значения для всех столбцов по порядку. Можно добавить несколько строк за раз.

CREATE TABLE products (id INTEGER PRIMARY KEY, name TEXT, price INTEGER);

-- 1) явное перечисление столбцов
INSERT INTO products (name, price) VALUES ('Клавиатура', 2500);

-- 2) сразу несколько строк
INSERT INTO products (name, price) VALUES ('Мышь', 1200), ('Коврик', 600);

SELECT * FROM products;

Вывод:

1|Клавиатура|2500
2|Мышь|1200
3|Коврик|600

Ещё бывает INSERT INTO ... SELECT ... — вставка результатов запроса (например, копирование строк из другой таблицы) и INSERT OR IGNORE / INSERT OR REPLACE для разрешения конфликтов с ограничениями.

UPDATE — обновление строк

UPDATE меняет значения в существующих строках. Указываем таблицу, через SET — какие столбцы и на что меняем, через WHERE — какие строки трогаем. Поднимем цену недорогих товаров на 10%:

CREATE TABLE products (id INTEGER PRIMARY KEY, name TEXT, price INTEGER);

INSERT INTO products (name, price) VALUES
    ('Клавиатура', 2500), ('Мышь', 1200), ('Монитор', 18000);

UPDATE products
SET price = price * 110 / 100
WHERE price < 3000;

SELECT name, price FROM products;

Вывод:

Клавиатура|2750
Мышь|1320
Монитор|18000

Монитор не изменился — его цена не прошла условие WHERE. Новое значение столбца считается из старого: price = price * 110 / 100.

Главное правило: не забывайте WHERE

Если в UPDATE или DELETE забыть WHERE, операция применится ко всем строкам. UPDATE products SET price = 0; обнулит цену у всех товаров, а DELETE FROM products; очистит таблицу целиком. Перед опасной операцией полезно сначала выполнить SELECT с тем же WHERE и убедиться, что выбираются именно нужные строки.

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

DELETE удаляет строки, подходящие под условие. Удалим слишком дешёвые товары:

CREATE TABLE products (id INTEGER PRIMARY KEY, name TEXT, price INTEGER);

INSERT INTO products (name, price) VALUES
    ('Клавиатура', 2500), ('Мышь', 1200), ('Коврик', 600);

DELETE FROM products WHERE price < 1000;

SELECT name, price FROM products;

Вывод:

Клавиатура|2500
Мышь|1200

«Коврик» исчез, потому что его цена меньше 1000. Остальные строки остались на месте.

Итог

  • INSERT добавляет строки; можно перечислять столбцы, вставлять пачкой и из результата SELECT.
  • UPDATE ... SET ... WHERE ... меняет значения; новое значение можно вычислять из старого.
  • DELETE FROM ... WHERE ... удаляет строки; без WHERE и UPDATE, и DELETE затрагивают всю таблицу.
Проверьте себя
1. Что случится, если выполнить UPDATE products SET price = 0 без WHERE?
AОшибка — WHERE обязателен
BЦена обнулится у всех строк таблицы
CОбновится только первая строка
DНичего не произойдёт
2. Что делает SET price = price * 110 / 100 в UPDATE?
AСтавит фиксированную цену 110
BУвеличивает текущую цену примерно на 10%
CДелит цену на 100
DСбрасывает цену в NULL
3. Какой командой безопаснее всего проверить, что именно затронет опасный DELETE?
AСначала EXPLAIN
BСначала SELECT с тем же WHERE
CСначала DROP TABLE
DНикак не проверить
Поддержать проект