我在做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'的查询不存在。它们并不常见。 –