Nuevo mes, nuevos objetivos. Su ayuda ayuda al proyecto a avanzar. 🖥️ Apoye sqltest →
Código SQL copiado al portapapeles

Base de datos Bookings: esquema de aerolínea, tablas y ejercicios de SQL

Bookings es la base de demostración de PostgreSQL de una aerolínea: vuelos entre 104 aeropuertos, reservas, billetes y tarjetas de embarque. En SQLtest.online puedes consultarla directamente en el navegador: resolver ejercicios con corrección automática y ejecutar tus propias consultas en el playground, sin instalar nada.

  • 8 tablas y 4 vistas
  • 33 121 vuelos
  • 1 045 726 tramos de billetes
  • 52 ejercicios de SQL

Qué es Bookings

Bookings es la base de demostración que Postgres Professional publica para aprender PostgreSQL. Modela los vuelos de una aerolínea rusa: rutas, aviones y sus mapas de asientos, reservas, billetes y tarjetas de embarque.

Esta copia contiene vuelos de julio a septiembre de 2017. Los nombres de aeropuertos y aviones se guardan en JSONB en inglés y ruso, y las coordenadas de los aeropuertos usan el tipo point. Por eso la base sirve para practicar tanto las particularidades de PostgreSQL como JOIN y análisis sobre tablas grandes.

Diagrama ER

El diagrama muestra las tablas de Bookings y las claves foráneas que las unen. Haz clic para abrirlo a tamaño completo.

Diagrama ER de la base de datos Bookings

Qué contiene la base

Las tablas se dividen en dos grupos.

Datos de referencia

airports_data, aircrafts_data y seats: el mapa de asientos de cada modelo de avión.

Ventas y vuelos

bookings → tickets → ticket_flights ← flights, además de boarding_passes, que se emiten en el check-in.

Lo principal: una reserva puede incluir varios pasajeros, y un billete puede cubrir varios vuelos. La relación entre billetes y vuelos es ticket_flights, la tabla más grande. Las vistas aircrafts, airports, flights_v y routes muestran los mismos datos de forma más cómoda.

Cuántos datos hay en las tablas:

TablaFilasContenido
bookings262 788reservas
tickets366 733billetes, uno por pasajero
ticket_flights1 045 726tramos de vuelo de los billetes
boarding_passes579 686tarjetas de embarque
flights33 121vuelos programados y realizados
airports_data104aeropuertos
aircrafts_data9modelos de avión
seats1339asientos por modelo de avión

Estructura de las tablas

Haz clic en una tabla para ver sus columnas, una fila de ejemplo y sus claves.

La lista de tablas

aircrafts_data - tabla de aeronaves.
  • aircraft_codeCódigo único para cada aeronave
  • modelNombre del modelo de aeronave en inglés y ruso en formato JSON
  • rangeRango de vuelo de la aeronave en kilómetros
  • CLAVE PRIMARIA, btree (aircraft_code)
aircraft_codemodelrange
1773{"en": "Boeing 777-300", "ru": "Боинг 777-300"}11100
airports_data - tabla de aeropuertos.
  • airport_codeCódigo único para cada aeropuerto
  • airport_nameNombre del aeropuerto en inglés y ruso en formato JSON
  • cityCiudad del aeropuerto en inglés y ruso en formato JSON
  • coordinatesCoordenadas del aeropuerto como PUNTO(longitud, latitud)
  • timezoneNombre de la zona horaria del aeropuerto
  • CLAVE PRIMARIA, btree (airport_code)
airport_codeairport_namecitycoordinatestimezone
1YKS{"en": "Yakutsk Airport", "ru": "Якутск"}{"en": "Yakutsk", "ru": "Якутск"}(129.77099609375,62.0932998657227)Asia/Yakutsk
boarding_passes - tabla de tarjetas de embarque.
  • ticket_noNúmero de ticket
  • flight_idIdentificador de vuelo
  • boarding_noNúmero de tarjeta de embarque
  • seat_noNúmero de asiento
  • CLAVE PRIMARIA, btree (ticket_no, flight_id)
  • RESTRICCIÓN ÚNICA, btree (flight_id, boarding_no)
  • RESTRICCIÓN ÚNICA, btree (flight_id, seat_no)
  • CLAVE FORÁNEA (ticket_no, flight_id) REFERENCIAS ticket_flights(ticket_no, flight_id)
ticket_noflight_idboarding_noseat_no
100054352123513062512D
bookings - tabla de reservas.
  • book_refNúmero de reserva
  • book_dateFecha de reserva
  • total_amountCosto total de la reserva
  • CLAVE PRIMARIA, btree (book_ref)
book_refbook_datetotal_amount
100000F2017-07-05 00:12:00+00265700.00
flights - tabla de vuelos.
  • flight_idID de vuelo
  • flight_noNúmero de vuelo
  • scheduled_departureHora de salida programada
  • scheduled_arrivalHora de llegada programada
  • departure_airportAeropuerto de salida
  • arrival_airportAeropuerto de llegada
  • statusEstado del vuelo
  • aircraft_codeCódigo de aeronave, IATA
  • actual_departureHora de salida real
  • actual_arrivalHora de llegada real
  • CLAVE PRIMARIA, btree (flight_id)
  • RESTRICCIÓN ÚNICA, btree (flight_no, scheduled_departure)
flight_id flight_no scheduled_departure scheduled_arrival departure_airport arrival_airport status aircraft_code actual_departure actual_arrival
11185PG01342017-09-10 06:50:00+002017-09-10 11:55:00+00DMEBTKProgramado319
seats - tabla de asientos de aeronaves.
  • aircraft_codeCódigo de aeronave, IATA
  • seat_noNúmero de asiento
  • fare_conditionsClase de viaje
  • CLAVE PRIMARIA, btree (aircraft_code, seat_no)
  • CLAVE FORÁNEA (aircraft_code) REFERENCIAS aircrafts(aircraft_code) ON DELETE CASCADE
aircraft_codeseat_nofare_conditions
13192ABusiness
ticket_flights - relaciones de tickets a vuelos.
  • ticket_noNúmero de ticket
  • flight_idID de vuelo
  • fare_conditionsClase de viaje
  • amountCosto del viaje
  • CLAVE PRIMARIA, btree (ticket_no, flight_id)
  • CLAVE FORÁNEA (flight_id) REFERENCIAS flights(flight_id)
  • CLAVE FORÁNEA (ticket_no) REFERENCIAS tickets(ticket_no)
ticket_no flight_id fare_conditions amount
1000543215977630625Business42100.00
tickets - tabla de tickets.
  • ticket_noNúmero de ticket
  • book_refNúmero de reserva
  • passenger_idID de pasajero
  • passenger_nameNombre del pasajero
  • contact_dataInformación de contacto del pasajero
ticket_no book_ref passenger_id passenger_name contact_data
1000543200098706B0468149 604011VALERIY TIKHONOV{"phone": "+70127117011"}
  • CLAVE PRIMARIA, btree (ticket_no)
  • CLAVE FORÁNEA (book_ref) REFERENCIAS bookings(book_ref)

Consultas de ejemplo

Estas consultas muestran cómo se relacionan los datos. Copia cualquiera y ejecútala en el playground.

Un billete y su reserva: el pasajero y el importe de la reserva.

SELECT t.ticket_no, t.passenger_name, b.book_date, b.total_amount
FROM tickets t
JOIN bookings b ON b.book_ref = t.book_ref
ORDER BY t.ticket_no
LIMIT 3;
ticket_nopassenger_namebook_datetotal_amount
0005432000987VALERIY TIKHONOV2017-07-05 17:19:00+0012400.00
0005432000988EVGENIYA ALEKSEEVA2017-07-05 17:19:00+0012400.00
0005432000989ARTUR GERASIMOV2017-06-28 22:55:00+0024700.00

Un vuelo y su avión: el nombre en inglés leído de una columna JSONB con ->>.

SELECT f.flight_no, f.departure_airport, f.arrival_airport,
       a.model ->> 'en' AS aircraft
FROM flights f
JOIN aircrafts_data a ON a.aircraft_code = f.aircraft_code
ORDER BY f.flight_id
LIMIT 3;
flight_nodeparture_airportarrival_airportaircraft
PG0405DMELEDAirbus A321-200
PG0404DMELEDAirbus A321-200
PG0405DMELEDAirbus A321-200

Tarifa y asiento: del tramo del billete al vuelo y la tarjeta de embarque. El LEFT JOIN conserva los tramos sin tarjeta.

SELECT tf.ticket_no, f.flight_no, tf.fare_conditions, tf.amount, bp.seat_no
FROM ticket_flights tf
JOIN flights f ON f.flight_id = tf.flight_id
LEFT JOIN boarding_passes bp
       ON bp.ticket_no = tf.ticket_no AND bp.flight_id = tf.flight_id
ORDER BY tf.ticket_no, f.flight_id
LIMIT 3;
ticket_noflight_nofare_conditionsamountseat_no
0005432000987PG0242Economy6200.007A
0005432000988PG0242Economy6200.0010E
0005432000989PG0242Economy6200.0018E

Ejercicios de SQL por tema

La base Bookings tiene 52 ejercicios, desde consultas sencillas hasta análisis sobre un millón de filas. Las soluciones se comprueban automáticamente en un PostgreSQL real. El número de la derecha es la cantidad de ejercicios del tema; los puntos de color muestran el rango de dificultad.

Por dónde empezar

Los primeros ejercicios de la base Bookings:

  1. Obtener datos de aeropuertos
  2. Lista de Aeropuertos
  3. Aeronaves de Largo Alcance
  4. Encontrar aeronaves Boeing
  5. Vuelos Salidos de Domodedovo
  6. Listar Aeronaves de Domodedovo
  7. Obtener Reservas por Fecha
  8. Análisis del uso de aeronaves
  9. Tipos de Condiciones de Tarifas
  10. Aeronaves Sin Asientos de Clase Ejecutiva

Todos los ejercicios de Bookings →

Preguntas frecuentes

¿Hay que instalar PostgreSQL para usar Bookings?

No. Los ejercicios y el playground de SQLtest.online ejecutan las consultas en nuestros servidores, así que basta con un navegador. En el playground, Bookings está disponible en PostgreSQL 18.

¿Dónde descargar la base de demostración Bookings?

Postgres Professional la publica en varios tamaños en su sitio web, junto con la descripción del esquema.

¿Por qué algunos nombres aparecen entre llaves?

Los nombres de aeropuertos, ciudades y aviones son objetos JSONB con valores en inglés y ruso. Usa ->> 'en' para obtener el texto en inglés o consulta las vistas, que eligen un idioma.