' GROUP BY'有什么区别? ' ORDER BY'在SQL?

时间:2015-04-05 16:04:54

标签: sql group-by sql-order-by relational-database

QUERY:

select name, count(*) as num from animals
group by name
order by num desc
limit 5;

当我用order替换group时,它会给我一个语法错误。

请回答详细示例以获得更多帮助。

1 个答案:

答案 0 :(得分:0)

不,你不能改变SQL子句的顺序,它应该是以下形式:

SELECT <attribute and function list>
FROM <table list>
[ WHERE <condition> ]
[ GROUP BY <grouping attribute(s)> ]
[ HAVING <group condition> ]
[ ORDER BY <attribute list> ];

SQL中的检索查询包含这些(最多)六个子句,但只有前两个 - SELECTFROM - 是必需的。

GROUP BY指定分组属性(不保证结果显示的顺序),而ORDER BY指定显示查询结果的顺序。

comment

  

QUERY =“从物种='猩猩'的动物中选择*按名称排序;”在这里当我用组替换订单时我没有看到任何差异

标准SQL不保证结果应该出现的顺序,并且包含GROUP BY子句的查询不能引用选择列表中未在GROUP BY子句中命名的非聚合列。

这样:

select * 
from animals 
where species = 'orangutan' 
group by name;

标准SQL 中的查询非法,因为它包含表格的每个字段。检查这个MySQL文档MySQL Handling of GROUP BY

而,

select * 
from animals 
where species = 'orangutan' 
order by name;

完全有效。

无论如何,像MySQL这样的SQL的一些实现也会对输出结果进行排序,请检查:

  

12.17.3 MySQL Handling of GROUP BY

     

MySQL扩展了GROUP BY的使用,因此选择列表可以引用GROUP BY子句中未命名的非聚合列。这意味着前面的查询在MySQL中是合法的。您可以通过避免不必要的列排序和分组来使用此功能来获得更好的性能。然而.....

GROUP BY如何订购?

  

Other Considerations When using ROLLUP

     

MySQL中的GROUP BY对结果进行排序,您可以将明确的ASC和DESC关键字与GROUP BY列表中指定的列一起使用,以指定各列的排序顺序。

类似的,您的DBMS中也会发现行为。

如果您可以标记DBMS的名称,那么我或其他人可以通过一些示例来模拟差异。下面我将在MySQL中给出一个例子:

  

12.17.3 MySQL Handling of GROUP BY

     

....但是,当GROUP BY中未命名的每个非聚合列中的所有值对于每个组都相同时,这非常有用。服务器可以自由选择每个组中的任何值,因此除非它们相同,否则所选的值是不确定的。此外,添加ORDER BY子句不会影响每个组中值的选择。

我有一个Employee表,如下所示:

mysql> select * FROM Employee;
+-----+------+-------------+------+
| SSN | Name | Designation | MSSN |
+-----+------+-------------+------+
| 1   | A    | OWNER       | 1    |
| 10  | G    | WORKER      | 5    |
| 11  | D    | WORKER      | 4    |
| 12  | E    | WORKER      | 4    |
| 2   | B    | BOSS        | 1    |
| 3   | F    | BOSS        | 1    |
| 4   | C    | BOSS        | 2    |
| 5   | H    | BOSS        | 2    |
| 6   | L    | WORKER      | 2    |
| 7   | I    | BOSS        | 2    |
| 8   | K    | WORKER      | 3    |
| 9   | J    | WORKER      | 7    |
+-----+------+-------------+------+
12 rows in set (0.00 sec)

如果我按'指定'申请分组,则会制作分组和订单结果

mysql> select * from Employee group by Designation;
+-----+------+-------------+------+
| SSN | Name | Designation | MSSN |
+-----+------+-------------+------+
| 2   | B    | BOSS        | 1    |
| 1   | A    | OWNER       | 1    |
| 10  | G    | WORKER      | 5    |
+-----+------+-------------+------+
3 rows in set (0.00 sec)

表格中存在三种“指定”值的三行,根据MySQL doc,其中一种选择是不确定的。

按查询排序的结果完全不同:

mysql> select * from Employee order by Designation;
+-----+------+-------------+------+
| SSN | Name | Designation | MSSN |
+-----+------+-------------+------+
| 4   | C    | BOSS        | 2    |
| 7   | I    | BOSS        | 2    |
| 5   | H    | BOSS        | 2    |
| 2   | B    | BOSS        | 1    |
| 3   | F    | BOSS        | 1    |
| 1   | A    | OWNER       | 1    |
| 12  | E    | WORKER      | 4    |
| 11  | D    | WORKER      | 4    |
| 6   | L    | WORKER      | 2    |
| 10  | G    | WORKER      | 5    |
| 8   | K    | WORKER      | 3    |
| 9   | J    | WORKER      | 7    |
+-----+------+-------------+------+
12 rows in set (0.00 sec)