Кратко о SQL

⏱ 20 мин · 🧩 заданий: 6

База данных и таблицы

Почти любой сайт хранит данные: пользователей, посты, комментарии. Для этого используют реляционные базы данных — 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

Вы не вошли — ответы проверяются, но прогресс не сохранится. Войти или зарегистрироваться.
Задание 1 Один вариант ответа

Что такое первичный ключ (PRIMARY KEY)?

Задание 2 Написать код

Есть таблица posts со столбцами id, title, status, created. Напишите запрос, который выбирает заголовки всех постов со статусом 'published'.

Задание 3 Расставить по порядку

Расставьте части SQL-запроса в правильном порядке.

  1. LIMIT 10
  2. ORDER BY created DESC
  3. WHERE status = 'published'
  4. SELECT title, created
  5. FROM posts
Задание 4 Один вариант ответа

Какой SQL-командой изменяют уже существующие строки?

Задание 5 Ввод ответа

Как называется столбец, который ссылается на первичный ключ другой таблицы? (два слова, по-английски)

Задание 6 Написать код

Удалите из таблицы comments все комментарии, у которых active равно 0.

Войдите, чтобы отмечать пройденные уроки.