在SQL查询中,我们确实使用Group by子句来应用聚合函数。


但是使用数字值代替带有分组条件子句的列
的目的是什么?例如:按1分组。


评论

仅当坐在mysql>提示符下时才使用order by 1。在代码中,使用ORDER BY id ASC。请注意大小写,明确的字段名称和明确的排序方向。

#1 楼

实际上,做恕我直言是一件坏事,大多数其他数据库平台都不支持。

人们这样做的原因:



他们很懒-我不知道为什么人们认为通过编写简洁的代码而不是键入额外的40毫秒来获取更多的文字代码来提高生产力。

不好的原因:


它不是自记录文档-有人将不得不解析SELECT列表以找出分组。实际上,在SQL Server中会更加清晰,它不像牛仔一样支持牛仔谁知道什么会发生分组。
它很脆弱-有人进来并更改SELECT列表,因为业务用户想要不同的报告输出,现在您的输出变得一团糟。如果您在GROUP BY中使用了列名,则SELECT列表中的顺序将是无关紧要的。

SQL Server支持ORDER BY [ordinal]。以下是一些反对使用它的平行论点:


https://sqlblog.org/2009/10/06/bad-habits-to-kick-order-by-ordinal


#2 楼

MySQL允许您使用别名(列别名问题)执行GROUP BY。这样做比用数字做GROUP BY好得多。


有些人仍然教它

有些人在SQL图表中有column number。一行表示:按给定的列号或表达式对结果进行排序。如果表达式是单个参数,则该值将解释为列号。负的列号会颠倒排序顺序。
由于SQL Server已禁用Apache,因此已弃用它。

Google有许多使用它的示例,以及为什么许多人停止使用它。

老实说,自1996年以来我就没有使用ORDER BYGROUP BY的列号(当时我在进行Oracle PL / SQL开发)。实际上,使用列号是为了让旧时使用,并且向后兼容性使此类开发人员可以使用MySQL和其他仍允许它的RDBMS。

#3 楼

请考虑以下情况:

+------------+--------------+-----------+
| date       | services     | downloads |
+------------+--------------+-----------+
| 2016-05-31 | Apps         |         1 |
| 2016-05-31 | Applications |         1 |
| 2016-05-31 | Applications |         1 |
| 2016-05-31 | Apps         |         1 |
| 2016-05-31 | Videos       |         1 |
| 2016-05-31 | Videos       |         1 |
| 2016-06-01 | Apps         |         3 |
| 2016-06-01 | Applications |         4 |
| 2016-06-01 | Videos       |         2 |
| 2016-06-01 | Apps         |         2 |
+------------+--------------+-----------+


您必须将“应用程序”和“应用程序”视为同一服务,才能找出每项服务每天的下载量。按date, services分组将导致AppsApplications被视为单独的服务。

在这种情况下,查询将是:

 select date, services, sum(downloads) as downloads
 from test.zvijay_test
 group by date,services


和输出:

+------------+--------------+-----------+
| date       | services     | downloads |
+------------+--------------+-----------+
| 2016-05-31 | Applications |         2 |
| 2016-05-31 | Apps         |         2 |
| 2016-05-31 | Videos       |         2 |
| 2016-06-01 | Applications |         4 |
| 2016-06-01 | Apps         |         5 |
| 2016-06-01 | Videos       |         2 |
+------------+--------------+-----------+


但这不是您想要的,因为需要对应用程序和应用程序进行分组。那么,我们该怎么办呢? >
但这仍然将AppsApplications视为不同的服务并将服务分组,并提供与以前相同的输出:将数据分组到一个别名列上。

select 
  date,
  if(services='Apps','Applications',services) as services,
  sum(downloads) as downloads
from test.zvijay_test 
group by date,services


,从而为您提供所需的输出,如下所示:

+------------+--------------+-----------+
| date       | services     | downloads |
+------------+--------------+-----------+
| 2016-05-31 | Applications |         2 |
| 2016-05-31 | Applications |         2 |
| 2016-05-31 | Videos       |         2 |
| 2016-06-01 | Applications |         4 |
| 2016-06-01 | Applications |         5 |
| 2016-06-01 | Videos       |         2 |
+------------+--------------+-----------+


我已经读过很多遍了,这是一种编写查询或对别名列进行分组的懒惰方法,在MySQL中不起作用,但这是对别名列进行分组的方法。

这不是编写查询的首选方式,仅当您确实需要对别名列进行分组时才使用它。

评论


“但是,这仍然将服务视为应用程序和应用程序,将服务分组为不同的服务,并提供与以前相同的输出”。如果您为别名选择了其他名称(不冲突),这是否可以解决?

– Daddy32
18年1月9日在13:30



@ Daddy32正是我的想法。甚至再嵌套一次(选择后分组)

–托马斯·雅各布
20年8月23日在11:47

#4 楼

没有正当理由使用它。它只是一个懒惰的快捷方式,专门设计用于使某些工作压力大的开发人员以后很难弄清您的分组或排序,或者在有人更改列顺序时使代码失败很困难。
请体谅您的其他开发人员,请不要这样做。

#5 楼

这对我有用。该代码将行最多分为5组。

SELECT
USR.UID,
USR.PROFILENAME,
(
    CASE 
    WHEN MOD(@curRow, 5) = 0 AND @curRow > 0 THEN
        @curRow := 0
    ELSE
        @curRow := @curRow + 1 
        /*@curRow := 1*/ /*AND @curCode := USR.UID*/
    END
) AS sort_by_total  
FROM
    SS_USR_USERS USR,
    (
        SELECT
            @curRow := 0,
            @curCode := ''
    ) rt
ORDER BY
    USR.PROFILENAME,
    USR.UID


结果将如下所示



#6 楼

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

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


考虑以上查询:
按1分组意味着按第一列分组并按1,2分组意味着按第一和第二列分组并按1,2,3分组表示按第一,第二和第三列分组。例如:



此图显示了按1,2分组的前两列,即,未考虑dep_date的不同值来查找count(计算第一两列的所有不同组合),而第二个查询会得出此


图像。这里要考虑所有前三列,并找到不同的值来找到计数,即按所有前三列进行分组(计算计数时要考虑到前三列的所有不同组合)。