我在做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
我在做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
的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
,他冒着打破你的查詢的風險。
它基本上是從您的選擇查詢中逐列1,列2和列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
中執行此位置聲明。這是不好的,因此要在教程中顯示。
在旁註:在一個精心打造的數據庫中,你不會有'dep_month'和'dep_day_of_week',因爲它們都可以從'dep_date'明顯得到。在數據庫中,我們力求不會冗餘地存儲信息,因爲這可能會導致不一致(例如,與月份不匹配的月份)。 –
另一個注意事項:在現實生活中,大多數查詢都有一個「ORDER BY」子句。您通常不會按日期進行分組,然後顯示未按日期排序的結果。但是,如果你將結果讀入一些GUI數據庫中,你當然可以用一個無序的數據集來填充它。所以我並不是說沒有'ORDER BY'的查詢不存在。它們並不常見。 –