SQL онлайн: редактор запросов в браузере

Напишите запрос и запустите его — без установки и регистрации. База уже подключена: учебная авиакомпания, 8 таблиц и 2,3 млн строк. Синтаксис как в PostgreSQL.

query.sqlбаза «Авиаперевозки» · 8 таблиц · 2,3 млн строк
Готовые запросы

Результат появится здесь. Запрос выполняется на той же учебной базе, что и в курсе.

  • запуск — кнопкой или ⌘⏎ / Ctrl+Enter
  • только чтение: SELECT и WITH
  • до 200 строк в ответе

Примеры SQL-запросов, которые можно запустить

11 запросов на этой же базе — от первого SELECT до оконной функции. У каждого написано, что он вернёт; кнопка подставит запрос в редактор наверху, дальше его можно менять.

  1. 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;
  2. 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;
  3. GROUP BY: сколько рейсов в каждом статусе

    Свернуть таблицу рейсов до одной строки на статус. В результате шесть строк: от 16 707 прилетевших до 41 задержанного.

    SELECT status, COUNT(*) AS flights_count
    FROM flights
    GROUP BY status
    ORDER BY flights_count DESC;
  4. 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;
  5. 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;
  6. 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;
  7. Подзапрос: модели с дальностью выше средней

    Среднюю дальность считает вложенный запрос — 5 344 км по девяти моделям, — а внешний сравнивает с ней каждую строку. Выше средней летают пять моделей.

    SELECT model, range
    FROM aircrafts
    WHERE range > (SELECT AVG(range) FROM aircrafts)
    ORDER BY range DESC;
  8. 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;
  9. 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;
  10. Оконная функция: место модели по дальности

    RANK() нумерует строки, не сворачивая их: все девять моделей остаются в результате, у каждой — своё место.

    SELECT model, range,
           RANK() OVER (ORDER BY range DESC) AS place
    FROM aircrafts
    ORDER BY place, model;
  11. Даты: бронирования и выручка по дням

    Период задан полуинтервалом — с начала 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— Трёхбуквенный код аэропорта, например SVO
  • airport_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:00
  • total_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 или Business
  • amountdecimal(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.

Сохраняются ли мои запросы?

Нет. Запрос живёт, пока открыта страница. В курсах и в симуляторе черновики сохраняются автоматически.