SQL-песочница — это среда где можно писать и выполнять SQL-запросы прямо в браузере. Никакой установки PostgreSQL, никакой настройки подключения. Открыл страницу — пишешь запросы.
Зачем нужна песочница
Для изучения SQL. Прочитали про GROUP BY — сразу попробовали. Увидели пример с оконными функциями — воспроизвели. Немедленная практика в разы эффективнее чтения без проверки.
Для экспериментов. Не уверены как работает LEFT JOIN с NULL? Попробуйте в безопасной среде — не рискуете продакшн-базой.
Для собеседований. Перед техническим интервью стоит «размять руки» — порешать задачи в реальном SQL, а не в голове.
Для проверки идей. Придумали сложный запрос — проверьте логику на тестовых данных перед запуском на реальной базе.
Что должно быть в хорошей песочнице
Реальная СУБД. Не «симулятор SQL», а настоящий PostgreSQL. Ошибки должны быть настоящими, типы данных — правильными.
Готовые датасеты. Не нужно придумывать данные — книжный магазин, интернет-магазин, HR-данные. Можно сразу писать осмысленные запросы.
Подсветка синтаксиса. SQL в голом textarea — неудобно. Нужны подсветка ключевых слов и автодополнение.
История запросов. Чтобы не переписывать прошлый запрос если случайно закрыли вкладку.
Датасеты для практики
Книжный магазин (bookshop)
Таблицы: books, authors, orders, customers, order_items
Хорошо для практики: JOIN между книгами и авторами, агрегация продаж по жанрам, топ-авторы по выручке.
-- Топ-5 авторов по количеству проданных книг
SELECT a.name, SUM(oi.quantity) AS books_sold
FROM authors a
JOIN books b ON a.id = b.author_id
JOIN order_items oi ON b.id = oi.book_id
GROUP BY a.id, a.name
ORDER BY books_sold DESC
LIMIT 5;
Интернет-магазин (shop)
Таблицы: products, categories, orders, users, order_items
Хорошо для: воронки, retention, RFM-анализ, категории товаров.
-- Выручка по категориям за последние 30 дней
SELECT c.name, SUM(oi.price * oi.quantity) AS revenue
FROM categories c
JOIN products p ON c.id = p.category_id
JOIN order_items oi ON p.id = oi.product_id
JOIN orders o ON oi.order_id = o.id
WHERE o.created_at >= NOW() - INTERVAL '30 days'
GROUP BY c.name
ORDER BY revenue DESC;
Сотрудники (employees)
Таблицы: employees, departments, salaries, positions
Хорошо для: оконные функции (ранжирование внутри отдела), расчёт зарплат, иерархия менеджеров.
-- Рейтинг сотрудников по зарплате внутри отдела
SELECT
e.name,
d.name AS department,
e.salary,
RANK() OVER (PARTITION BY d.id ORDER BY e.salary DESC) AS rank_in_dept
FROM employees e
JOIN departments d ON e.department_id = d.id;
Типичный сеанс в песочнице
- Выбрать датасет
- Посмотреть схему таблиц (
\dили через интерфейс) - Написать простой SELECT чтобы понять данные
- Постепенно усложнять запрос
- Попробовать что-то новое — например впервые написать оконную функцию
Нет ограничений по времени, нет «правильного ответа», нет оценок. Только вы и SQL.
Попробуйте прямо сейчас
Откройте песочницу на sqllab.ru/sandbox и напишите первый запрос. Выберите датасет bookshop и выполните:
SELECT * FROM books LIMIT 10;
Дальше — ваше любопытство ведёт.