SQL Group By测试和理解
程序员文章站
2022-07-12 11:56:25
...
Orders数据如下:
SQL GROUP BY的作用:
The SQL GROUP BY statement is used along with the SQL aggregate functions like SUM to provide means of grouping the result dataset by certain database table column(s). Seehttp://www.sql-tutorial.net/SQL-GROUP-BY.asp
GROUP BY用于和SQL聚合函数(类似SUM)一起按照给定的数据表列给查询结果集合分组的。
一个必须注意的地方是:SELECT 列表中指定的每一列也必须出现在 GROUP BY 子句中,除非这列是聚合函数列。
仔细想想应该是这样理解的(为方便测试,贴SQL语句)
SQL GROUP BY的作用:
The SQL GROUP BY statement is used along with the SQL aggregate functions like SUM to provide means of grouping the result dataset by certain database table column(s). Seehttp://www.sql-tutorial.net/SQL-GROUP-BY.asp
GROUP BY用于和SQL聚合函数(类似SUM)一起按照给定的数据表列给查询结果集合分组的。
一个必须注意的地方是:SELECT 列表中指定的每一列也必须出现在 GROUP BY 子句中,除非这列是聚合函数列。
仔细想想应该是这样理解的(为方便测试,贴SQL语句)
--SELECT * FROM "Orders"; --SELECT "Customer","OrderDate",SUM("OrderPrice") FROM "Orders" GROUP BY "OrderDate"; --SELECT "Customer","OrderDate",SUM("OrderPrice") FROM "Orders" GROUP BY "OrderDate"; --上面的语句报错: --ERROR: column "Orders.Customer" must appear in the GROUP BY clause or be used in an aggregate function --SELECT 列表中指定的每一列也必须出现在 GROUP BY 子句中,除非这列是用于聚合函数。 --原因:Group by会将结果集合并。上面的SELECT结果根据OrderDate合并集合。 --假设没有上面那个限制,会出现如下的冲突情况:记录3和记录7的OrderDate都是2008/07/21,将他们按照SUM(OrderPrice)求得值为1700,如果SELECT列中允许 --出现Customer列(一个不出现在Group By中的列),那么这条记录的Customer列的值应该显示什么呢?是Carter(7)还是Bush(3)呢? --所以:SELECT 列表中指定的每一列也必须出现在 GROUP BY 子句中,除非这列是用于聚合函数。 --使用聚合函数必须结合Group By子句来使用。 --SELECT "Customer",SUM("OrderPrice") from "Orders"; --上面的语句报错: --ERROR: column "Orders.Customer" must appear in the GROUP BY clause or be used in an aggregate function --错误的理解过上面的一致。在不给定Group BY条件的情况下,SUM("OrderPrice"),这个聚合函数默认使用所有记录。同样会出现CUSTOMER冲突的情况。 --SELECT "Customer","OrderDate",SUM("OrderPrice") FROM "Orders" GROUP BY "OrderDate","Customer"; --上面这句select查询时可以跑的。但是只Group by了OrderDate,至于Customer为什么给忽略掉了,不明白。也想不通“正确执行”下来会是什么结果。 SELECT "Customer","OrderDate",SUM("OrderPrice") FROM "Orders" GROUP BY "Customer","OrderDate" --Group by的条件换了一下顺序,Customer放在前面,查询的结构是一样的。奇怪了。Customer,OrderDate的优先级别是什么?
推荐阅读
-
关于sql和mysql对于别名不能调用的一些理解
-
理解SQL SERVER中的逻辑读,预读和物理读
-
浅谈sql语句中GROUP BY 和 HAVING的使用方法
-
关于sql和mysql对于别名不能调用的一些理解
-
浅谈sql语句中GROUP BY 和 HAVING的使用方法
-
sql server查询(SELECT ,where,distinct,like 查询,in,is null,group by 和having,order by,as)
-
理解Spark SQL(二)—— SQLContext和HiveContext
-
理解Spark SQL(一)—— CLI和ThriftServer
-
实例理解SQL中truncate和delete的区别
-
SQL Group By测试和理解