раздел 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).