2017-09-11 67 views
0

我在做Codecademy here的SQL轉換課。我不確定他們爲什麼在GROUP BY子句之後使用這些數字以及這些數字在做什麼。任何人都可以通過這門課程讓我知道嗎?SQL GROUP BY用法

SELECT dep_month, 
      dep_day_of_week, 
      dep_date, 
      COUNT(*) AS flight_count 
     FROM flights 
    GROUP BY 1,2,3 
+0

在旁註:在一個精心打造的數據庫中,你不會有'dep_month'和'dep_day_of_week',因爲它們都可以從'dep_date'明顯得到。在數據庫中,我們力求不會冗餘地存儲信息,因爲這可能會導致不一致(例如,與月份不匹配的月份)。 –

+0

另一個注意事項:在現實生活中,大多數查詢都有一個「ORDER BY」子句。您通常不會按日期進行分組,然後顯示未按日期排序的結果。但是,如果你將結果讀入一些GUI數據庫中,你當然可以用一個無序的數據集來填充它。所以我並不是說沒有'ORDER BY'的查詢不存在。它們並不常見。 –

回答

6

GROUP BY子句中的數字只是指的是列在名單SELECT,由左到右。因此,您的查詢是相同的以下內容:

SELECT 
    dep_month, 
    dep_day_of_week, 
    dep_date, 
    COUNT(*) AS flight_count 
FROM flights 
GROUP BY 
    dep_month, 
    dep_day_of_week, 
    dep_date 

上面的查詢,我寫的是我會在實踐中使用。原因是GROUP BY 1,2,3指的是職位而不是列。如果稍後有人重構SELECT,他冒着打破你的查詢的風險。

0

它基本上是從您的選擇查詢中逐列1,列2和列3。

3

顯然這些是職位號碼。所以這是第一個三列的GROUP BY

GROUP BY 1,2,3 

意味着

GROUP BY dep_month, dep_day_of_week, dep_date 

這裏。

這是不符合SQL標準,因爲GROUP BY條款應該被執行之前SELECT條款,這樣的位置可以是未知的。它們僅在ORDER BY子句中已知,因爲這發生在SELECT子句之後。只有少數DBMS發生異常並允許在GROUP BY中執行此位置聲明。這是不好的,因此要在教程中顯示。