2017-09-11 91 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中执行此位置声明。这是不好的,因此要在教程中显示。