Учебник SQL
От простого к сложному — на реальных базах данных тренажёров. Каждая глава — одна идея, подкреплённая задачами в живом редакторе.
SQL — это Excel на стероидах. У вас есть таблицы (как листы), в них строки и столбцы. Вы говорите SQL-серверу, что хотите видеть, а он сам решает, как это взять. Не надо указывать «листай по строкам» — просто спросите.
Три базы — три сценария
В этом курсе мы будем работать с реальными учебными базами тренажёров:
petstore_db— интернет-магазин питомцев:pet,category,tag,user,orderlibrary_v1— библиотека книг и отзывов:book,reviewtaskmanager— менеджер задач:task,user,feedback
Как проходить урок
- Прочитайте аналогию и шпаргалку — не запоминайте, просто поймите идею.
- Откройте задачу через кнопку «Открыть в редакторе» — БД и SQL подставятся автоматически.
- Попробуйте сами. Если не получилось — «Подсказка», затем «Показать ответ».
- Дальше — следующая задача, задачи в главе идут от простого к сложному.
⚠️ Это read-only редактор. Только SELECT. Никаких DELETE, DROP, UPDATE — сервер откажется, даже если очень хочется. Данные сбрасываются каждую ночь, так что «сломать» их можно только на несколько часов.
SELECT — основы
Самая базовая команда. «Покажи мне данные из таблицы». Больше ничего — только «дай посмотреть».
Представьте меню в ресторане. SELECT — это сказать официанту: «Принесите мне вот эти блюда». Вы не готовите — просто выбираете из того, что есть.
Шпаргалка
SELECT * FROM pet; -- все колонки SELECT name FROM pet; -- только колонка name SELECT name, status FROM pet; -- две колонки
Все питомцы
Выведи все колонки и все строки из таблицы pet.
* означает «все колонки».SELECT * FROM pet;
Только имена
Выведи только колонку name из таблицы pet.
* перечислите нужные колонки через запятую. Здесь одна.SELECT name FROM pet;
Имя и статус
Выведи две колонки: name и status из pet.
SELECT name, status FROM pet;
WHERE — фильтрация
Покажет только те строки, которые подходят под условие. Всё остальное отбросит.
Фильтр в интернет-магазине. Вы ставите галочку «только со скидкой» — и видите только их. WHERE — та же галочка, только текстом.
Шпаргалка
SELECT * FROM pet WHERE status = 'available'; SELECT * FROM pet WHERE category_id = 1; SELECT * FROM pet WHERE name = 'Рекс';
Доступные питомцы
Покажи питомцев, у которых status = 'available'.
'available', не "available".SELECT * FROM pet WHERE status = 'available';
Только собаки
В таблице category есть категория «Собаки» с id = 1. Покажи всех питомцев из этой категории.
category_id, а не id.SELECT * FROM pet WHERE category_id = 1;
Найти Рекса
Найди питомца с именем Рекс.
SELECT * FROM pet WHERE name = 'Рекс';
ORDER BY + LIMIT
Сортировка и обрезание. «Топ-5», «последние 10», «сначала новые» — это они.
ORDER BY — это «разложи карточки по алфавиту». LIMIT — «покажи мне только первые 3». Вместе — топ-чарт.
Шпаргалка
SELECT * FROM book ORDER BY title; -- по возрастанию SELECT * FROM book ORDER BY title DESC; -- по убыванию SELECT * FROM book LIMIT 3; -- первые 3 SELECT * FROM book ORDER BY id DESC LIMIT 3; -- последние 3
Книги по алфавиту
Выведи все книги, отсортированные по названию (title) по возрастанию.
ASC можно не писать. По убыванию — DESC.SELECT * FROM book ORDER BY title;
Первые 5 книг
Выведи только первые 5 книг (без сортировки — просто «как лежат»).
SELECT * FROM book LIMIT 5;
Последние 3 книги
Выведи 3 книги с самыми большими id (сначала самая большая).
ORDER BY id DESC, потом LIMIT 3. Порядок важен!SELECT * FROM book ORDER BY id DESC LIMIT 3;
AND / OR / NOT
Комбинируем условия. Как в жизни: «хочу и то, и другое» или «или то, или это».
Анкета: «Возраст от 18, И есть водительские права» — AND. «Оплата картой ИЛИ наличными» — OR. «НЕ курю» — NOT.
Шпаргалка
-- И то, и другое (строже) WHERE status = 'done' AND user_id = 1 -- Или то, или это (шире) WHERE status = 'todo' OR status = 'in_progress' -- Отрицание WHERE NOT status = 'done'
Задачи Анны, выполненные
У Анны (user_id = 1) найди все задачи в статусе done.
AND. Оба должны быть истинны одновременно.SELECT * FROM task WHERE user_id = 1 AND status = 'done';
В работе или в планах
Покажи все задачи, у которых статус — todo или in_progress.
SELECT * FROM task WHERE status = 'todo' OR status = 'in_progress';
Всё, кроме done
Покажи все задачи, у которых статус не done.
NOT status = 'done' или status != 'done' или status <> 'done'. Все три работают одинаково.SELECT * FROM task WHERE status != 'done';
IN / BETWEEN / LIKE
Три оператора для «списка», «диапазона» и «похожести». Часто удобнее, чем длинные AND/OR.
IN — «я выбираю из меню: пицца, паста или суши» (список).
BETWEEN — «бюджет от 1000 до 3000» (диапазон).
LIKE — «найди контакт, где имя начинается на "А"» (шаблон).
Шпаргалка
WHERE id IN (1, 3, 5) -- id — одно из перечисленных WHERE rating BETWEEN 4 AND 5 -- от 4 до 5 включительно WHERE title LIKE 'В%' -- начинается на «В» WHERE title LIKE '%мир%' -- содержит «мир» WHERE title LIKE '_ойна и мир' -- ровно 1 символ вместо _
Отзывы 4 и 5 звёзд
Покажи все отзывы с рейтингом 4 или 5.
rating IN (4, 5) или rating BETWEEN 4 AND 5 или rating >= 4. Любой вариант — ок.SELECT * FROM review WHERE rating IN (4, 5);
Книги на «В»
Найди все книги, название которых начинается на «В».
% заменяет любое количество символов. «Начинается на В» = 'В%'.SELECT * FROM book WHERE title LIKE 'В%';
Содержит «мир»
Найди книги, в названии которых встречается слово «мир» (в любом месте названия).
% с обеих сторон: '%мир%'.SELECT * FROM book WHERE title LIKE '%мир%';
NULL, агрегаты, GROUP BY, HAVING, JOIN, подзапросы, CTE, оконные функции.