数字在SQL ORDER / GROUP BY语句中的含义是什么?

时间:2017-09-12 08:54:53

标签: sql

我完全不理解这个SQL子查询,并对此有些怀疑:

  1. " Group By"之后的数字的目的是什么?和" Order By"关键字,即 GROUP BY 1,2,3 ORDER BY 1,2
  2. 子查询:

    SELECT a.dep_month,
             a.dep_day_of_week,
       AVG(a.flight_distance) AS average_distance
    FROM (
    SELECT dep_month,
                 dep_day_of_week,
                 dep_date,
                 SUM(distance) AS flight_distance
        FROM flights
        GROUP BY 1,2,3
    ) a
    
     GROUP BY 1,2
     ORDER BY 1,2;
    

    提前致谢:)

3 个答案:

答案 0 :(得分:2)

嗯,ORDER BY 1, 2表示在选择中按第一和第二个字段排序,所以

    SELECT a.dep_month,
           a.dep_day_of_week,
      ...
  ORDER BY 1,2;

等于

    SELECT a.dep_month,
           a.dep_day_of_week,
       ...
  ORDER BY a.dep_month, a.dep_day_of_week;

如果我们在字段中有长而复杂的表达式,语法会很方便:

    SELECT bla-bla-bla-...-bla-bla,
           ...
  ORDER BY 1 -- No Copy + Paste of "bla-bla-bla-...-bla-bla"
然而, 更好的方法是将别名
    SELECT bla-bla-bla-...-bla-bla AS MyExpression,
           ...
  ORDER BY MyExpression -- More readable than 1

答案 1 :(得分:1)

SQL标准提供引用.fa-balance-scale { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); } order by中的列(基于1的)位置,而不是表达式

从您的示例中提取,这两个查询是相同的:

group by

顺便说一句,应该注意整个SELECT dep_month, dep_day_of_week, dep_date, SUM(distance) AS flight_distance FROM flights GROUP BY 1, 2, 3 SELECT dep_month, dep_day_of_week, dep_date, SUM(distance) AS flight_distance FROM flights GROUP BY dep_month, dep_day_of_week, dep_date 子句是多余的,因为它是确定性的;给定select列,group by子句只列出所有非聚合列,因此不会添加任何编程值。

答案 2 :(得分:0)

GROUP BYORDER BY之后的数字是列。

在以下查询中:

  

SELECT dep_month,                dep_day_of_week,                dep_date,                SUM(距离)AS flight_distance       从航班起飞       GROUP BY 1,2,

1是dep_month 2是dep_day_of_week 3是dep_date

但是如果你从表中给出SELECT *;那么1,2,3 ......等将是表顺序中的列名。

3