Кратко о SQL
База данных и таблицы
Почти любой сайт хранит данные: пользователей, посты, комментарии. Для этого используют реляционные базы данных — SQLite, PostgreSQL, MySQL. Данные в них лежат в таблицах:
Таблица posts:
| id | title | status | author_id | created |
|---|---|---|---|---|
| 1 | Привет, Django | published | 1 | 2026-01-10 |
| 2 | Модели и ORM | draft | 1 | 2026-01-12 |
| 3 | Шаблоны | published | 2 | 2026-01-15 |
- Столбец (поле) — одно свойство: заголовок, статус.
- Строка (запись) — один объект: конкретный пост.
- У каждого столбца есть тип: число, строка, дата, логическое значение.
SQL (Structured Query Language) — язык, на котором с базой «разговаривают».
Ключи
- Первичный ключ (
PRIMARY KEY) — уникальный идентификатор строки, обычноid. - Внешний ключ (
FOREIGN KEY) — столбец, который ссылается наidв другой таблице. Здесьauthor_idуказывает на строку в таблицеusers.
Так таблицы связываются между собой — отсюда слово «реляционные» (relation — связь).
Создание таблицы
CREATE TABLE posts (
id INTEGER PRIMARY KEY,
title VARCHAR(200) NOT NULL,
status VARCHAR(10) DEFAULT 'draft',
author_id INTEGER REFERENCES users(id),
created TIMESTAMP
);
В Django вы почти никогда не пишете CREATE TABLE руками: вы описываете модель на Python, а Django генерирует SQL через миграции.
CRUD: четыре базовые операции
CRUD — Create, Read, Update, Delete.
Create — INSERT
INSERT INTO posts (title, status, author_id)
VALUES ('Новый пост', 'draft', 1);
Read — SELECT
SELECT * FROM posts; -- все столбцы, все строки
SELECT title, created FROM posts WHERE status = 'published';
SELECT * FROM posts ORDER BY created DESC LIMIT 10; -- 10 самых свежих
SELECT COUNT(*) FROM posts WHERE author_id = 1; -- сколько постов у автора
Порядок частей запроса: SELECT … FROM … WHERE … ORDER BY … LIMIT ….
Полезные операторы в WHERE: =, <>, >, <, AND, OR, IN (...), LIKE '%django%', IS NULL.
Update — UPDATE
UPDATE posts SET status = 'published' WHERE id = 2;
Delete — DELETE
DELETE FROM posts WHERE id = 3;
Осторожно
UPDATE и DELETE без WHERE затронут все строки таблицы.
JOIN — данные из нескольких таблиц
Чтобы получить посты вместе с именами авторов:
SELECT posts.title, users.username
FROM posts
JOIN users ON posts.author_id = users.id
WHERE posts.status = 'published';
В Django это выглядит так: Post.objects.select_related("author") — ORM сам построит JOIN.
Агрегатные функции
SELECT author_id, COUNT(*) AS total
FROM posts
GROUP BY author_id;
COUNT, SUM, AVG, MIN, MAX — в Django им соответствуют Count, Sum, Avg, Min, Max из django.db.models.
Зачем это знать, если есть ORM?
Django ORM переводит Python-код в SQL:
Post.objects.filter(status="published").order_by("-created")[:10]
SELECT ... FROM blog_post WHERE status = 'published' ORDER BY created DESC LIMIT 10;
Понимая SQL, вы будете писать эффективные запросы и сможете разобраться, почему страница грузится медленно (об этом — урок про Debug Toolbar).
Итог
- Данные хранятся в таблицах; строки — объекты, столбцы — свойства.
- Первичный ключ идентифицирует строку, внешний — связывает таблицы.
- CRUD =
INSERT,SELECT,UPDATE,DELETE. JOINобъединяет таблицы,GROUP BY+ агрегаты считают статистику.
Практика решено 0 из 6
Что такое первичный ключ (PRIMARY KEY)?
Есть таблица posts со столбцами id, title, status, created.
Напишите запрос, который выбирает заголовки всех постов со статусом 'published'.
SELECT title FROM posts WHERE status = 'published';Расставьте части SQL-запроса в правильном порядке.
-
LIMIT 10 -
ORDER BY created DESC -
WHERE status = 'published' -
SELECT title, created -
FROM posts
Какой SQL-командой изменяют уже существующие строки?
Как называется столбец, который ссылается на первичный ключ другой таблицы? (два слова, по-английски)
Удалите из таблицы comments все комментарии, у которых active равно 0.
DELETE FROM comments WHERE active = 0;Войдите, чтобы отмечать пройденные уроки.