SQL онлайн: редактор запросов в браузере
Напишите запрос и запустите его — без установки и регистрации. База уже подключена: учебная авиакомпания, 8 таблиц и 2,3 млн строк. Синтаксис как в PostgreSQL.
- запуск — кнопкой или ⌘⏎ / Ctrl+Enter
- только чтение: SELECT и WITH
- до 200 строк в ответе
Примеры SQL-запросов, которые можно запустить
11 запросов на этой же базе — от первого SELECT до оконной функции. У каждого написано, что он вернёт; кнопка подставит запрос в редактор наверху, дальше его можно менять.
SELECT, ORDER BY и LIMIT: три самые дальние модели
Выбрать два столбца, отсортировать по убыванию и оставить первые три строки. Вернутся Боинг 777-300 (11 100 км), Боинг 767-300 (7 900) и Аэробус A319-100 (6 700).
SELECT model, range FROM aircrafts ORDER BY range DESC LIMIT 3;WHERE: отменённые рейсы из Шереметьево
Два условия через AND: аэропорт вылета и статус. Всего таких рейсов 26; запрос показывает первые пять по времени вылета.
SELECT flight_no, scheduled_departure, arrival_airport FROM flights WHERE departure_airport = 'SVO' AND status = 'Cancelled' ORDER BY scheduled_departure LIMIT 5;GROUP BY: сколько рейсов в каждом статусе
Свернуть таблицу рейсов до одной строки на статус. В результате шесть строк: от 16 707 прилетевших до 41 задержанного.
SELECT status, COUNT(*) AS flights_count FROM flights GROUP BY status ORDER BY flights_count DESC;HAVING: аэропорты, откуда больше 400 вылетов
Условие на результат группировки пишется в HAVING, а не в WHERE. Под него подходят 18 аэропортов, первый — Домодедово с 3 217 вылетами.
SELECT departure_airport, COUNT(*) AS flights_count FROM flights GROUP BY departure_airport HAVING COUNT(*) > 400 ORDER BY flights_count DESC;JOIN: города с наибольшим числом вылетов
Соединить рейсы со справочником аэропортов, чтобы вместо кода получить город. Впереди Москва — 7 917 вылетов из трёх аэропортов, за ней Санкт-Петербург с 1 900.
SELECT a.city, COUNT(*) AS departures FROM flights AS f JOIN airports AS a ON a.airport_code = f.departure_airport GROUP BY a.city ORDER BY departures DESC LIMIT 5;LEFT JOIN: модель самолёта без единого рейса
LEFT JOIN оставляет строки без пары, а проверка на NULL их находит. В парке одна такая модель — Аэробус A320-200.
SELECT ac.aircraft_code, ac.model FROM aircrafts AS ac LEFT JOIN flights AS f ON f.aircraft_code = ac.aircraft_code WHERE f.flight_id IS NULL ORDER BY ac.aircraft_code;Подзапрос: модели с дальностью выше средней
Среднюю дальность считает вложенный запрос — 5 344 км по девяти моделям, — а внешний сравнивает с ней каждую строку. Выше средней летают пять моделей.
SELECT model, range FROM aircrafts WHERE range > (SELECT AVG(range) FROM aircrafts) ORDER BY range DESC;WITH: сколько рейсов в день в среднем
Первый шаг считает рейсы по дням, второй — среднее по этим дням. В расписании 61 день, в среднем 543 рейса в день, максимум — 568.
WITH per_day AS ( SELECT CAST(scheduled_departure AS DATE) AS flight_date, COUNT(*) AS flights_count FROM flights GROUP BY CAST(scheduled_departure AS DATE) ) SELECT ROUND(AVG(flights_count)) AS avg_per_day, MAX(flights_count) AS max_per_day, COUNT(*) AS days FROM per_day;CASE WHEN: модели по классам дальности
Разложить строки по своим категориям и посчитать каждую. Получается четыре средние модели, три дальние и две ближние.
SELECT CASE WHEN range >= 6000 THEN 'дальние' WHEN range >= 3000 THEN 'средние' ELSE 'ближние' END AS class, COUNT(*) AS models FROM aircrafts GROUP BY 1 ORDER BY models DESC, class;Оконная функция: место модели по дальности
RANK() нумерует строки, не сворачивая их: все девять моделей остаются в результате, у каждой — своё место.
SELECT model, range, RANK() OVER (ORDER BY range DESC) AS place FROM aircrafts ORDER BY place, model;Даты: бронирования и выручка по дням
Период задан полуинтервалом — с начала 1 августа до начала 4-го, — чтобы не потерять последние минуты дня. За три дня 5 746, 5 761 и 5 665 бронирований.
SELECT CAST(book_date AS DATE) AS day, COUNT(*) AS bookings, ROUND(SUM(total_amount)) AS revenue FROM bookings WHERE book_date >= TIMESTAMP '2026-08-01 00:00:00' AND book_date < TIMESTAMP '2026-08-04 00:00:00' GROUP BY CAST(book_date AS DATE) ORDER BY day;
Хотите не смотреть на готовое, а решать сами — на странице задач по SQL запрос проверяет сервер: видно, совпал ли результат и что отличается.
Таблицы базы
Учебная база авиакомпании: 104 аэропорта России, 9 моделей самолётов, 33 тыс. рейсов с 12 июля по 10 сентября 2026 года, 263 тыс. бронирований (оформлены с 17 июня по 11 августа 18:00) и 367 тыс. билетов. Срез сделан 11 августа 2026 года в 18:00: рейсы до этого момента уже состоялись, дальше — только расписание. Всё время — московское. Основа — демонстрационная база Postgres Professional (лицензия MIT).
airportsАэропорты104
Одна строка = один аэропорт.
airport_codevarchar— Трёхбуквенный код аэропорта, например SVOairport_namevarchar— Название аэропортаcityvarchar— Город; в одном городе может быть несколько аэропортовlongitudedouble— Долготаlatitudedouble— Широтаtimezonevarchar— Часовой пояс аэропорта, например Asia/Yakutsk
aircraftsСамолёты9
Одна строка = одна модель самолёта.
aircraft_codevarchar— Код моделиmodelvarchar— Название моделиrangeinteger— Максимальная дальность полёта, км
seatsМеста1 339
Одна строка = одно место в салоне модели; ключ составной — пара (aircraft_code, seat_no).
aircraft_codevarchar— Модель самолёта; вместе с seat_no — ключ строкиseat_novarchar— Номер места, например 12A; повторяется в разных моделях, уникален внутри моделиfare_conditionsvarchar— Класс: Economy, Comfort или Business
flightsРейсы33 121
Одна строка = один вылет рейса в конкретный день.
flight_idinteger— Идентификатор вылетаflight_novarchar— Номер рейса; один номер летает много днейscheduled_departuretimestamp— Вылет по расписанию, МСКscheduled_arrivaltimestamp— Прилёт по расписанию, МСКdeparture_airportvarchar— Аэропорт вылетаarrival_airportvarchar— Аэропорт прилётаstatusvarchar— Scheduled — вылет позже чем через сутки после среза (с 12.08 18:05); On Time — вылет у среза или в ближайшие сутки (11.08 17:55 – 12.08 18:00), задержки нет; Delayed — вылет задержан, самолёт ещё не взлетел; Departed — вылетел и ещё в воздухе; Arrived — прилетел; Cancelled — отменён. 403 из 414 отмен — в сентябре, то есть в будущем расписанииaircraft_codevarchar— Модель самолётаactual_departuretimestamp— Фактический вылет; пусто, если рейс ещё не вылетел. Заполнен у Departed и Arrived, а также у 8 отменённых рейсов — это особенность данныхactual_arrivaltimestamp— Фактический прилёт; пусто, если рейс ещё не прилетел. Заполнен у Arrived и у тех же 8 отменённых рейсов
bookingsБронирования262 788
Одна строка = одно бронирование; в нём может быть несколько билетов.
book_refvarchar— Номер бронированияbook_datetimestamp— Когда оформлено, МСК; с 17 июня по 11 августа 2026 года 18:00total_amountdecimal(10,2)— Полная стоимость бронирования, ₽; равна сумме amount всех перелётов его билетов в ticket_flights
ticketsБилеты366 733
Одна строка = один билет одного пассажира.
ticket_novarchar— Номер билетаbook_refvarchar— Бронирование, в котором выписан билетpassenger_idvarchar— Номер документа пассажира (вымышленный)passenger_namevarchar— Имя и фамилия латиницей заглавными буквами, например IVAN PETROV (вымышленные)contact_datajson— Контакты: телефон и почта, если указаны
ticket_flightsПерелёты1 045 726
Одна строка = один перелёт по билету; в билете с пересадкой их несколько. Ключ составной — пара (ticket_no, flight_id). Продажи есть не у всех вылетов: у 5 269 из 16 707 прилетевших рейсов (около трети) и у всех отменённых строк здесь нет.
ticket_novarchar— Билет; вместе с flight_id — ключ строкиflight_idinteger— Вылет; вместе с ticket_no — ключ строкиfare_conditionsvarchar— Класс: Economy, Comfort или Businessamountdecimal(10,2)— Стоимость перелёта, ₽
boarding_passesПосадочные талоны579 686
Одна строка = один посадочный талон на перелёт. Ключ составной — пара (ticket_no, flight_id), она же ссылается на строку ticket_flights.
ticket_novarchar— Билет; вместе с flight_id — ключ строкиflight_idinteger— Вылет; вместе с ticket_no — ключ строкиboarding_nointeger— Порядковый номер посадки на рейсseat_novarchar— Место в салоне
Справа от названия — число строк. Нажмите на таблицу, чтобы увидеть столбцы.
Как связаны таблицы
flights.departure_airport→airports.airport_code— аэропорт вылетаflights.arrival_airport→airports.airport_code— аэропорт прилётаflights.aircraft_code→aircrafts.aircraft_code— модель самолёта рейсаseats.aircraft_code→aircrafts.aircraft_code— места в салоне моделиtickets.book_ref→bookings.book_ref— билеты одного бронированияticket_flights.ticket_no→tickets.ticket_no— перелёты по билетуticket_flights.flight_id→flights.flight_id— пассажиры вылетаboarding_passes.(ticket_no, flight_id)→ticket_flights.(ticket_no, flight_id)— талон на перелёт
Если одного редактора мало
Редактор отвечает на вопрос «что вернёт этот запрос». Научиться писать запросы помогают задачи с проверкой: курс «SQL с нуля» идёт на этой же базе — от первого SELECT до JOIN и подзапросов. Дальше — «Продвинутый SQL» с оконными функциями и продуктовыми метриками.
У симулятора SQL-аналитика своя песочница: другая база — продукт с регистрациями, событиями и платежами — и схема рядом с редактором. Она тоже открыта без регистрации.
Нужны CREATE TABLE, свои данные или другая СУБД? Сравнение db-fiddle, sqliteonline и других площадок — в обзоре SQL-тренажёров и песочниц. Готовые запросы на каждый случай — в примерах SQL-запросов.
Частые вопросы
Редактор бесплатный? Нужна ли регистрация?
Бесплатный, регистрация не нужна. Запрос выполняется на сервере, результат приходит в браузер.
Какая СУБД выполняет запросы?
DuckDB. Её синтаксис очень близок к PostgreSQL: SELECT, JOIN, GROUP BY, подзапросы, CTE и оконные функции пишутся так же. Расходятся детали — например, целочисленное деление и часть функций дат; о них рассказано в уроках курса.
Можно ли создавать таблицы и менять данные?
Нет. База открыта только на чтение: выполняются SELECT и запросы с WITH. На CREATE, INSERT, UPDATE и DELETE редактор ответит, что такая команда недоступна. Сами команды разобраны в статьях библиотеки.
Можно ли загрузить свои данные?
Нет, редактор работает на одной учебной базе. Если нужен запрос на своём файле, удобнее поставить DuckDB локально — он читает CSV и Parquet напрямую.
Сколько строк покажет результат?
Сервер возвращает не больше 200 строк, страница показывает первые 50. Чтобы увидеть нужное, добавьте в запрос условие или LIMIT.
Сохраняются ли мои запросы?
Нет. Запрос живёт, пока открыта страница. В курсах и в симуляторе черновики сохраняются автоматически.