2011-09-12 27 views
117

有人給我發送了一個SQL查詢,其中GROUP BY子句由以下語句組成:GROUP BY 1SQL子句「GROUP BY 1」是什麼意思?

這必須是一個錯字嗎?沒有列給別名1.這意味着什麼?我是否有權假定這肯定是一個錯字?

+2

它不是一個錯字,這是你的結果的第一列設置 – Lamak

+5

注意,這個語法是不可移植。它在MySQL以外的數據庫上的表現會有所不同。例如,在Oracle中,它被視爲一個常量。 –

+2

@RussellReed是的。不幸的是(因爲使用別名有時非常有用),ansi sql不允許按列序號進行分組。原因在於該組是在投影之前發生的。但是,接下來......當我們用幾十行來分組表達式時,我們最終得到了.. *多行數據*。 – javadba

回答

128

它通過無論它叫什麼第一列是指組。您也可以使用ORDER BY

8

它將由第一場中的選擇子句

32
SELECT account_id, open_emp_id 
     ^^^^  ^^^^ 
      1   2 

FROM account 
GROUP BY 1; 

在上述查詢GROUP BY 1組指first column in select statement這是 account_id

您還可以在ORDER BY指定。

Note : The number in ORDER BY and GROUP BY always start with 1 not with 0. 
17

除了按字段名稱分組外,還可以按序號進行分組,也可以按字段進行分組。

這通常是輕率,如果你上進行分組一些具體的事情,因爲表/視圖結構可能發生變化;此外,閱讀起來更難(信用:Yuck)。但是,如果你要返回一組獨特的東西,那麼它就沒關係。

+5

+1爲「不要這樣做」,我會補充說,避免它的最好理由是它不可讀。 – Yuck

1

它會被你的組後就把by子句中的列位置組。

例如,如果您運行'SELECT SALESMAN_NAME, SUM(SALES) FROM SALES GROUP BY 1' 它將按SALESMAN_NAME分組。

這樣做的一個風險是如果您運行'Select *',並且出於某種原因您使用不同順序的列重新創建表格,它會給出與您預期不同的結果。

0

,通過在你的SELECT子句中第一列是指SQL組,我們總是與ORDER BY 1使用GROUP BY 1在一起,除了你也可以使用這樣GROUP BY 1,2,3..,當然是方便了我們,但需要注意的是條件結果可能不是你想要什麼,如果有人修改了你的選擇列,它不是可視化