Учебник

Оглавление

Группировка

Мы получили перечень рейсов, в которые летает наша модель самолёта:

SELECT
  aircrafts.model,
  flights.flight_no,
  flights.scheduled_departure
FROM
  bookings.flights
  JOIN bookings.aircrafts
  ON aircrafts.aircraft_code = flights.aircraft_code
WHERE
  aircrafts.model = 'Airbus A321-200'

В разные дни отправляются рейсы с одним номером. Выберем только уникальные номера рейсов. Для этого после SELECT напишем DISTINCT:

SELECT DISTINCT
  aircrafts.model,
  flights.flight_no
FROM
  bookings.flights
  JOIN bookings.aircrafts
    ON aircrafts.aircraft_code = flights.aircraft_code
WHERE
  aircrafts.model = 'Airbus A321-200'

Те же данные можно получить, сгруппировав выборку по полям model и flight_no:

SELECT
  aircrafts.model,
  flights.flight_no
FROM
  bookings.flights
  JOIN bookings.aircrafts
    ON aircrafts.aircraft_code = flights.aircraft_code
WHERE
  aircrafts.model = 'Airbus A321-200'
GROUP BY
  aircrafts.model,
  flights.flight_no

Выглядит более многословно, но группировка даёт дополнительные возможности. Например, можем посчитать сколько раз вообще летал самолёт по рейсу. Используем агрегатную функцию COUNT:

SELECT
  aircrafts.model,
  flights.flight_no,
  COUNT(*)
FROM
  bookings.flights
  JOIN bookings.aircrafts
    ON aircrafts.aircraft_code = flights.aircraft_code
WHERE
  aircrafts.model = 'Airbus A321-200'
GROUP BY
  aircrafts.model,
  flights.flight_no

И вывести дату и время отправления первого и последнего рейсов, занесённых в нашу базу. Давайте ещё вспомним про псевдонимы:

SELECT
  aircrafts.model "Модель",
  flights.flight_no "Рейс",
  COUNT(*) "Рейсов",
  MIN(flights.scheduled_departure) "Первый",
  MAX(flights.scheduled_departure) "Последний"
FROM
  bookings.flights
  JOIN bookings.aircrafts
    ON aircrafts.aircraft_code = flights.aircraft_code
WHERE
  aircrafts.model = 'Airbus A321-200'
GROUP BY
  aircrafts.model,
  flights.flight_no

Помните, мы выводили все места в самолёте:

SELECT
	aircrafts.model,
	seats.seat_no
FROM
	bookings.aircrafts
	JOIN bookings.seats
		ON seats.aircraft_code = aircrafts.aircraft_code
WHERE
	aircrafts.model = 'Airbus A321-200'

Давайте их посчитаем:

SELECT
	aircrafts.model,
	COUNT(seats.seat_no) seats_count
FROM
	bookings.aircrafts
	JOIN bookings.seats
		ON seats.aircraft_code = aircrafts.aircraft_code
WHERE
	aircrafts.model = 'Airbus A321-200'
GROUP BY
	aircrafts.model

А для всех моделёй самолётов?

SELECT
	aircrafts.model,
	COUNT(seats.seat_no) "Мест"
FROM
	bookings.aircrafts
	JOIN bookings.seats
		ON seats.aircraft_code = aircrafts.aircraft_code
GROUP BY
	aircrafts.model