Sql order by group by order: GROUP BY And ORDER BY in SQL — SQL Tutorial
Содержание
PostgreSQL : Документация: 9.6: 7.5. Сортировка строк : Компания Postgres Professional
RU
EN
RU EN
После того как запрос выдал таблицу результатов (после обработки списка выборки), её можно отсортировать. Если сортировка не задана, строки возвращаются в неопределённом порядке. Фактический порядок строк в этом случае будет зависеть от плана соединения и сканирования, а также от порядка данных на диске, поэтому полагаться на него нельзя. Определённый порядок выводимых строк гарантируется, только если этап сортировки задан явно.
Порядок сортировки определяет предложение ORDER BY
:
SELECTсписок_выборки
FROMтабличное_выражение
ORDER BYвыражение_сортировки1
[ASC | DESC] [NULLS { FIRST | LAST }] [,выражение_сортировки2
[ASC | DESC] [NULLS { FIRST | LAST }] ...]
Выражениями сортировки могут быть любые выражения, допустимые в списке выборки запроса. Например:
SELECT a, b FROM table1 ORDER BY a + b, c;
Когда указывается несколько выражений, последующие значения позволяют отсортировать строки, в которых совпали все предыдущие значения. Каждое выражение можно дополнить ключевыми словами ASC
или DESC
, которые выбирают сортировку соответственно по возрастанию или убыванию. По умолчанию принят порядок по возрастанию (ASC
). При сортировке по возрастанию сначала идут меньшие значения, где понятие «меньше» определяется оператором <
. Подобным образом, сортировка по возрастанию определяется оператором >
. [5]
Для определения места значений NULL можно использовать указания NULLS FIRST
и NULLS LAST
, которые помещают значения NULL соответственно до или после значений не NULL. По умолчанию значения NULL считаются больше любых других, то есть подразумевается NULLS FIRST
для порядка DESC
и NULLS LAST
в противном случае.
Заметьте, что порядки сортировки определяются независимо для каждого столбца. Например, ORDER BY x, y DESC
означает ORDER BY x ASC, y DESC
, и это не то же самое, что ORDER BY x DESC, y DESC
.
Здесь выражение_сортировки
может быть меткой столбца или номером выводимого столбца, как в данном примере:
SELECT a + b AS sum, c FROM table1 ORDER BY sum; SELECT a, max(b) FROM table1 GROUP BY a ORDER BY 1;
Оба эти запроса сортируют результат по первому столбцу. Заметьте, что имя выводимого столбца должно оставаться само по себе, его нельзя использовать в выражении. Например, это ошибка:
SELECT a + b AS sum, c FROM table1 ORDER BY sum + c; -- неправильно
Это ограничение позволяет уменьшить неоднозначность. Тем не менее неоднозначность возможна, когда в ORDER BY
указано простое имя, но оно соответствует и имени выходного столбца, и столбцу из табличного выражения. В этом случае используется выходной столбец. Эта ситуация может возникнуть, только когда с помощью AS
выходному столбцу назначается то же имя, что имеет столбец в другой таблице.
ORDER BY
можно применить к результату комбинации UNION
, INTERSECT
и EXCEPT
, но в этом случае возможна сортировка только по номерам или именам столбцов, но не по выражениям.
[5] На деле PostgreSQL определяет порядок сортировки для ASC
и DESC
по классу оператора B-дерева по умолчанию для типа данных выражения. Обычно типы данных создаются так, что этому порядку соответствуют операторы <
и >
, но возможно разработать собственный тип данных, который будет вести себя по-другому.
Урок 4. Сортировка в SQL (ORDER BY)
В SQL часто кроме фильтрации данных, также часто требуется отсортировать их по одному из столцов.
В первом уроке мы написали SQL-запрос для получения данных о совершенолетних пользователях. Посмотрим на него еще раз:
SELECT last_name, first_name, birthday FROM users WHERE age >= 18
id | last_name | first_name | birthday |
---|---|---|---|
1 | Иванов | Дмитрий | 1996-12-11 |
3 | Шевченко | Тимур | 1998-04-27 |
4 | Иванова | Светлана | 1993-08-06 |
6 | Иванов | Алексей | 1993-08-05 |
7 | Процук | Алена | 1997-02-28 |
Обратите внимание, что сейчас данные никак не упорядочены. Ни по фамилии, ни по имени, ни по дате рождения. Но давайте добавим после конструции WHERE: ORDER BY last_name:.
SELECT last_name, first_name, birthday FROM users WHERE age >= 18 ORDER BY last_name
После выполнение данного SQL запроса мы получим таблицу отсортированную по столбцу last_name (фамилия). Так как last_name хранит строки, то сортировка происходит в алфавитном порядке:
id | last_name | first_name | birthday |
---|---|---|---|
1 | Иванов | Дмитрий | 1996-12-11 |
6 | Иванов | Алексей | 1993-08-05 |
4 | Иванова | Светлана | 1993-08-06 |
7 | Процук | Алена | 1997-02-28 |
3 | Шевченко | Тимур | 1998-04-27 |
Обратите внимание, что данные отсортированы только по фамилии, но не по другим полям. Однако давайте добавим через запятую еще один столбец, например, first_name:
SELECT last_name, first_name, birthday FROM users WHERE age >= 18 ORDER BY last_name, first_name
Теперь таблица отсортирована сразу по двум поля, сперва по фамилии, а уже затем по имени:
id | last_name | first_name | birthday |
---|---|---|---|
6 | Иванов | Алексей | 1993-08-05 |
1 | Иванов | Дмитрий | 1996-12-11 |
4 | Иванова | Светлана | 1993-08-06 |
7 | Процук | Алена | 1997-02-28 |
3 | Шевченко | Тимур | 1998-04-27 |
Разумеется, сортировать можно не только по текстовым полям. Например, можно написать ORDER BY birthday:
SELECT last_name, first_name, birthday FROM users WHERE age >= 18 ORDER BY birthday
И получить данные упорядоченные по дате рождения в хронологическом порядке:
id | last_name | first_name | birthday |
---|---|---|---|
6 | Иванов | Алексей | 1993-08-05 |
4 | Иванова | Светлана | 1993-08-06 |
1 | Иванов | Дмитрий | 1996-12-11 |
7 | Процук | Алена | 1997-02-28 |
3 | Шевченко | Тимур | 1998-04-27 |
А если в конструкции ORDER BY после имени столца написать DESC, то данные будут отсортированы в обратном порядке — свежие даты выше:
id | last_name | first_name | birthday |
---|---|---|---|
3 | Шевченко | Тимур | 1998-04-27 |
7 | Процук | Алена | 1997-02-28 |
1 | Иванов | Дмитрий | 1996-12-11 |
4 | Иванова | Светлана | 1993-08-06 |
6 | Иванов | Алексей | 1993-08-05 |
Более того при сортировке данных по нескольким столцам, мы можем для разных столцов указывать разные направления сортировки. Например ORDER BY last_name, birthday DESC:
SELECT last_name, first_name, birthday FROM users WHERE age >= 18 ORDER BY last_name, birthday DESC
Тогда данные будут сперва отсортированы в алфавитном порядке по фамилии, а уже внутри каждой фамилии по дате рождения в обратном порядке:
id | last_name | first_name | birthday |
---|---|---|---|
6 | Иванов | Алексей | 1993-08-05 |
1 | Иванов | Дмитрий | 1996-12-11 |
4 | Иванова | Светлана | 1993-08-06 |
7 | Процук | Алена | 1997-02-28 |
3 | Шевченко | Тимур | 1998-04-27 |
Следующий урок
Урок 5. Ограничение выборки
В этом уроке вы научитесь ограничивать итоговые результаты с помощью конструкции LIMIT.
Посмотреть
Тарифы
56 видео-уроков
Более 7 часов видео
Дополнительные материалы
Схемы, методички, исходные коды
Возможность скачать видео
Смотреть уроки можно даже без интернета
Доступ к курсу навсегда
Можете освежить знания через год или два
261 практическое задание
Практические занятия на тренажере
Поддержка преподавателя
Помощь в решении заданий в течение 24 часов
Сертификат о прохождении курса
Подтверждение ваших навыков
Эталонные решения
Решения преподавателя
56 видео-уроков
Более 7 часов видео
Дополнительные материалы
Схемы, методички, исходные коды
Возможность скачать видео
Смотреть уроки можно даже без интернета
Доступ к курсу навсегда
Условия бесплатного тарифа могут измениться
261 практическое задание
Практические занятия на тренажере
Поддержка преподавателя
Помощь в решении заданий в течение 24 часов
Сертификат о прохождении курса
Подтверждение ваших навыков
Эталонные решения
Решения преподавателя
Без воды
Поддержка
Регистрация
Письмо со ссылкой для доступа отправлено.
Проверьте почту.
Письмо не пришло? Посмотрите в спаме.
Регистрируясь, вы соглашаетесь с
условиями предоставления услуг (пользовательское соглашение).
sql — Как получить данные в порядке убывания, используя группу в mysql
спросил
Изменено
10 лет, 1 месяц назад
Просмотрено
41к раз
Мне нужны следующие записи таблицы:
------------------------------------------------------ ------------------------------------ идентификатор | приемник_user_id | отправитель_user_id | сообщение_текст | вставить дату -------------------------------------------------- ------------------------- 6 | 33 | 42 | СТАРЫЙ | 2013-05-08 10:08:53 8 | 33 | 43 | ддддд | 2013-05-07 19:01:45 7 | 33 | 38 | Ипсум | 2013-04-25 10:27:35 -------------------------------------------------- -------------------------
Я использую этот запрос:
SELECT * ОТ (`player_messages`) ГДЕ `receiver_user_id` = '33' СГРУППИРОВАТЬ ПО sender_user_id ORDER BY `player_messages`. `insertdate` DESC
И получить записи таблицы, как показано ниже.
------------------------------------------------ --------------------------- идентификатор | приемник_user_id | отправитель_user_id | сообщение_текст | вставить дату -------------------------------------------------- ------------------------- 6 | 33 | 43 | ддддд | 2013-05-07 19:01:45 4 | 33 | 42 | НОВЫЙ | 2013-05-07 10:08:58 7 | 33 | 38 | Ипсум | 2013-04-25 10:27:35 -------------------------------------------------- -------------------------
Пожалуйста, помогите. Заранее спасибо.
- MySQL
- SQL
5
Вы выбираете все поля из таблицы SELECT *
, но группируете только по sender_user_id
, а значения неагрегированных столбцов не будут определены и не будут затронуты порядком по.
Вы должны написать свой запрос следующим образом:
SELECT player_messages.* ОТ player_messages ГДЕ (идентификатор_пользователя_получателя, идентификатор_пользователя_отправителя, дата_вставки) В ( ВЫБЕРИТЕ Receiver_user_id, sender_user_id, MAX (вставить дату) ОТ player_messages ГДЕ Receiver_user_id='33' СГРУППИРОВАТЬ ПО Receive_user_id, sender_user_id) ЗАКАЗАТЬ ПО player_messages. insertdate DESC
Это вернет все строки player_messages, которые имеют максимальную дату вставки для каждой комбинации получателя и отправителя.
Когда вы делаете запрос к базе данных MySQL, вы можете сортировать результаты по любому полю в порядке возрастания или убывания, просто добавляя «ORDER BY» в конце вашего запроса. Вы должны использовать ORDER BY field_name ASC для сортировки по возрастанию или ORDER BY field_name DESC для сортировки по убыванию.
например
"ВЫБЕРИТЕ * ОТ адреса ORDER BY name ASC"
0
Зарегистрируйтесь или войдите в систему
Зарегистрируйтесь с помощью Google
Зарегистрироваться через Facebook
Зарегистрируйтесь, используя электронную почту и пароль
Опубликовать как гость
Электронная почта
Требуется, но никогда не отображается
Опубликовать как гость
Электронная почта
Требуется, но не отображается
Нажимая «Опубликовать свой ответ», вы соглашаетесь с нашими условиями обслуживания и подтверждаете, что прочитали и поняли нашу политику конфиденциальности и кодекс поведения.
sql — Имеет ли значение порядок столбцов в предложении group by?
спросил
Изменено
5 лет, 11 месяцев назад
Просмотрено
50 тысяч раз
Если у меня есть два столбца, один с очень высокой кардинальностью и один с очень низкой кардинальностью (уникальное количество значений), имеет ли значение, в каком порядке я группирую?
Вот пример:
выбрать имя_размера, измерениеКатегория, сумма (какой-то факт) из SomeFact f присоединиться к SomeDim d на f.dimensionKey = d.dimensionKey группа по d.dimensionName, -- большое количество уникальных значений d.dimensionCategory -- небольшое количество уникальных значений
Есть ли ситуации, когда это имеет значение?
- sql
- sql-сервер
- группа-по
1
Нет, порядок не имеет значения для предложения GROUP BY.
MySQL и SQLite — единственные известные мне базы данных, которые позволяют вам выбирать столбцы, которые исключены из группы (нестандартные, не переносимые), но порядок здесь также не имеет значения.
1
SQL является декларативным.
В этом случае вы сказали оптимизатору, как вы хотите сгруппировать данные, и он решает, как это сделать.
Он не будет оценивать построчно (процедурно) и смотреть сначала на один столбец
Порядок столбцов в первую очередь важен для индексов. col1, col2
отличается от col2, col1
. Совсем.
1
Так как это здесь не упоминалось. Приведенные выше ответы верны, т. е. порядок столбцов после предложения «группировать по» не повлияет на правильность запроса (т. е. на сумму суммы).
Однако порядок извлекаемых строк зависит от порядка столбцов, указанных после предложения «группировать по». Например, рассмотрим Таблицу A
со следующими строками:
Col1 Col2 Col3 1 хиз 100 2 абв 200 3 хиз 300 3 хиз 400
SELECT *, SUM(Col3) FROM A GROUP BY Col2, Col1
извлечет строки, упорядоченные по Col2
в порядке возрастания.
Col1 Col2 Col3 sum(Col3) 2 абв 200 200 1 хиз 100 100 3 хиз 300 700
Теперь измените порядок столбцов в группе на Col1, Col2
. Извлеченные строки упорядочены по возрастанию Col1
.
, т.е. , выберите *, sum(Col3) из группы A по Col1, Col2
Col1 Col2 Col3 sum(Col3) 1 хиз 100 100 2 абв 200 200 3 хиз 300 700
Примечание. Сумма суммирования (т. е. правильность запроса) остается неизменной.
2
Существует устаревшая нестандартная функция Microsoft SQL Server под названием ROLLUP. ROLLUP является расширением синтаксиса GROUP BY, и когда он используется, порядок столбцов GROUP BY определяет, какие столбцы должны быть сгруппированы в результате. Однако ROLLUP устарел. Стандартной альтернативой SQL является использование группирующих наборов, которые поддерживаются SQL Server 2008 и более поздними версиями.
Если у меня есть два столбца, один с очень высокой кардинальностью и один с очень низкой кардинальностью (уникальное количество значений), имеет ли значение, в каком порядке я группирую?
Запрос-1
ВЫБЕРИТЕ spec_id, catid, spec_display_value, COUNT (*) AS cnt FROM tbl_product_spec СГРУППИРОВАТЬ ПО spec_id, catid, spec_display_value ;
Запрос-2
ВЫБЕРИТЕ spec_id, catid, spec_display_value, COUNT (*) AS cnt FROM tbl_product_spec FORCE INDEX (idx_comp_spec_cnt) СГРУППИРОВАТЬ ПО catid, spec_id, spec_display_value;
Оба равны, порядок не работает в группе по предложению.