Группировка и сортировка по нескольким полям
Вы уже научились объединять данные в группы и выводить отсортированный результат. SQL позволяет группировать и сортировать данные не только по одному полю, но и по нескольким сразу.
Группировка по нескольким полям
В прошлых уроках вы объединяли данные в группы в зависимости от города. Но сформировать группы можно и по двум полям.
Покажем на примере: нужно сравнить количество заказов по дням, а также учесть, в какой стране был сделан заказ. В этом случае можно сгруппировать данные по двум полям сразу:
invoice_date и billing_country. Напомним, что поле
invoice_date хранит данные типа varchar. Поэтому тип данных лучше сразу преобразовать в тип date. Таблица будет отсортирована по убыванию значений в поле invoice_date.SQL
Понять, что с чем группируется, может быть сложно. Сначала сравните прошлую таблицу с результатом запроса с ключевым словом
DISTINCT:SQL
С помощью ключевого слова
DISTINCT можно получить похожую выдачу, но без поля с результатом агрегирующей функции COUNT. Применить COUNT и DISTINCT к разным полям в одном запросе не получится. Напомним, что DISTINCT — ключевое слово, которое применяется ко всем полям, указанным после него.В остальном две таблицы похожи, потому что оператор
GROUP BY собрал группы из всех уникальных комбинаций в полях invoice_date и billing_country.Сортировка по нескольким полям
Сортировка по нескольким полям устроена сложнее, чем группировка. При сортировке важен порядок полей, которые указывают после оператора
ORDER BY. В случае с группировкой порядок полей влияет только на их расположение в таблице. Пока звучит сложно, поэтому приведём пример. Такой запрос выгрузит несколько полей: страну заказа, идентификатор пользователя и сумму заказа. В таблицу попадут заказы только из двух стран: Индии и Португалии.
SQL
Сортировать можно не только числа, но и строки: страна заказа будет отсортирована в лексикографическом порядке. Идентификатор пользователя будет отсортирован по возрастанию, а сумма заказа — по убыванию.
SQL
Взгляните внимательно на выдачу: сортировка разных полей не конфликтует между собой. Записи первого поля упорядочены в лексикографическом порядке, записи второго — по возрастанию, а записи третьего — по убыванию. Ни одно правило сортировки не нарушает предыдущего.
Порядок полей действительно важен, ведь первым отсортировано поле со страной заказа. Посмотрите, что получится, если немного изменить запрос.
SQL
Порядок, в котором указывают поля после
ORDER BY, влияет на выдачу. Сначала отсортирована сумма заказа по убыванию. Затем для каждого значения суммы отсортированы страны заказа в лексикографическом порядке. Для каждой страны отсортированы значения идентификаторов покупателей от меньшего к большему. Обратите внимание, что порядок полей после оператора
SELECT влияет только на расположение полей в таблице. Если после SELECT указать поля в другой последовательности, а порядок сортировки оставить прежним, то поля поменяются местами в таблице, но иерархия сортировки не изменится.Попробуйте поменять различные параметры в мини-тренажёре ниже. Обратите внимание, как параметры влияют на результат.