2015-01-26 3 views
6

Оговорка «group by» автоматически гарантирует, что результаты будут упорядочены по этому ключу? Другими словами, это достаточно, чтобы написать:«Группировать по» автоматически гарантирует «заказ»?

select * 
from table 
group by a, b, c 

или же нужно написать

select * 
from table 
group by a, b, c 
order by a, b, c 

Я знаю, например, в MySQL мне это не нужно, но я хотел бы знать, могу ли я полагаться на него в сравнении с реализациями SQL. Гарантировано ли это?

+1

Btw, я только что проверил: Мой PostgreSQL 9.3.4 * не * автоматически возвращать отсортированные данные при использовании 'group by'. – JimmyB

+0

Я пытался использовать AdventureWorks db Msdn. Он работает, группа по отсортированным данным, интересно, это зависит от типа данных? Поэтому я попробовал дату и только одну группу по заявлениям. –

ответ

15

group by не упорядочивает данные. БД предназначена для быстрого сбора данных и при необходимости сортирует их.

Так что добавьте order by, если вам нужен гарантированный заказ.

+4

Эффективная реализация 'group by' будет выполнять группировку путем сортировки данных внутри. Вот почему некоторые RDBMS возвращают отсортированный результат при группировке. Тем не менее спецификации SQL не предусматривают такого поведения, поэтому, если явным образом не документировал поставщик RDBMS, я бы не стал делать ставку на это (завтра). OTOH, * если * RDBMS неявно делает вид, он также может быть достаточно умным, чтобы затем оптимизировать (удалять) избыточный «порядок». – JimmyB

+0

благодарит @JimmyB. Ваши комментарии на этой странице, вероятно, будут отличным ответом, если собрать их :-) – TMS

0

Это определенно не означает. Я испытал это, когда один из моих запросов внезапно начал возвращать не упорядоченные результаты, так как данные в таблице растут.

-1

Это зависит от количества записей. Когда записи меньше, Группировка сортируется автоматически. Когда записи больше (более 15), требуется добавить порядок по статью

+0

можете ли вы привести ссылки на это? Это, вероятно, только для определенного двигателя? – TMS

0

Я попробовал. Adventureworks db of Msdn.

select HireDate, min(JobTitle) 
from AdventureWorks2016CTP3.HumanResources.Employee 
group by HireDate 

Resuts:

2009-01-10Production техник - WC40

2009-01-11Application специалист

2009-01-12Assistant в главный финансовый директор

2009-01-13Производственный техник - WC50 <

Он возвращает отсортированные данные наемного персонала, но при любых обстоятельствах вы не полагаетесь на GROUP BY в SORT.

например; индексы могут изменять эти отсортированные данные.

я добавил следующий индекс (HireDate, jobtitle)

CREATE NONCLUSTERED INDEX NonClusturedIndex_Jobtitle_hireddate ON [HumanResources].[Employee] 
(
    [JobTitle] ASC, 
    [HireDate] ASC 
) 

Результат будет меняться с таким же запросом на выборке;

2006-06-30 Техник - WC60

2007-01-26 Ассистент по маркетингу

2007-11-11 Технический менеджер

2007-12-05 Дизайнер Старший Инструмент

2007-12-11 Дизайнер инструмента

2007-12-20 Менеджер по маркетингу

2007-12-26 Руководитель производства - WC60

Вы можете скачать Adventureworks2016 по адресу

https://www.microsoft.com/en-us/download/details.aspx?id=49502