раздел 05 · подстраница 2
Первые SQL-запросы
SQL (Structured Query Language) - язык, на котором вы разговариваете с базой. Звучит пугающе, но 80% повседневных задач закрываются четырьмя командами: достать, добавить, изменить, удалить. Разберём их на таблице задач.
Таблица для примеров
Представим таблицу tasks со столбцами id, text, done, priority:
| id | text | done | priority | | --- | --- | --- | --- | | 1 | купить молоко | 0 | 2 | | 2 | сдать отчёт | 0 | 1 | | 3 | позвонить маме | 1 | 3 |
SELECT - достать данные
Самая частая команда. «Дай мне данные».
SELECT * FROM tasks; -- все столбцы, все строки
SELECT text, priority FROM tasks; -- только нужные столбцы
WHERE - фильтр, «только те, что подходят под условие»:
SELECT * FROM tasks WHERE done = 0; -- только невыполненные
SELECT * FROM tasks WHERE priority <= 2; -- важные
SELECT * FROM tasks WHERE text LIKE '%молоко%'; -- содержит слово
ORDER BY - сортировка:
SELECT * FROM tasks ORDER BY priority ASC; -- по возрастанию приоритета
SELECT * FROM tasks ORDER BY id DESC; -- сначала новые
LIMIT - ограничить количество:
SELECT * FROM tasks WHERE done = 0 ORDER BY priority LIMIT 5; -- топ-5 дел
INSERT - добавить запись
INSERT INTO tasks (text, priority) VALUES ('помыть машину', 2);
id указывать не нужно - база присвоит сама (если столбец задан как автоинкремент).
UPDATE - изменить запись
UPDATE tasks SET done = 1 WHERE id = 1; -- отметили задачу 1 выполненной
DELETE - удалить запись
DELETE FROM tasks WHERE id = 3; -- удалили одну задачу
DELETE FROM tasks WHERE done = 1; -- удалили все выполненные
Как это выглядит в коде
В Python с SQLite (помним про параметры ?):
# достать невыполненные, по приоритету
cur.execute(
"SELECT id, text FROM tasks WHERE done = 0 ORDER BY priority"
)
for row in cur.fetchall():
print(row)
# отметить выполненной
cur.execute("UPDATE tasks SET done = 1 WHERE id = ?", (task_id,))
conn.commit()
Связи между таблицами (на будущее)
Когда таблиц несколько и они связаны (users и orders), их соединяют через JOIN:
-- все заказы с именем клиента
SELECT orders.id, users.name, orders.total
FROM orders
JOIN users ON orders.user_id = users.id;
JOIN - тема посложнее, но знать, что он есть и зачем, полезно: именно ради таких связей и заводят реляционную базу вместо файла.
Про работу с AI
AI-ассистенты пишут SQL очень хорошо - можно просить «достань топ-10 клиентов по сумме заказов за месяц» и получать готовый запрос. Но проверяйте две вещи: что в UPDATE/DELETE есть WHERE и что данные подставляются параметрами, а не склейкой строк. Это две самые частые причины испорченных данных.
Антипаттерны
- UPDATE/DELETE без WHERE - перезапись или удаление всей таблицы одним движением.
- SELECT * там, где нужны два поля - тащить всё подряд расточительно, особенно на больших таблицах.
- Склейка строк вместо параметров - SQL-инъекция (см. страницу про SQLite).