`
liusu
  • 浏览: 169983 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

SQL Group By测试和理解

    博客分类:
  • Java
阅读更多
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语句)
--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的优先级别是什么?




  • 大小: 33.9 KB
分享到:
评论
4 楼 飞天奔月 2014-07-03  
mysql没这个限制
3 楼 donghustone 2013-03-23  
[size=small]"SELECT 列表中指定的每一列也必须出现在 GROUP BY 子句中,除非这列是用于聚合函数。汗~"貌似在mysql中没有这个限制呢。。。。。。亲身验证过。。。。  [/size]
2 楼 liusu 2009-11-26  
select a.NEW_RO_SO_CASE,'' as testcol,count(*)
    from vedvr_master a,ve_issue_letter b,ve_letter_dvr c
    where a.dvr_id = c.dvr_id
    and c.letter_id = b.letter_id
    group by a.NEW_RO_SO_CASE,b.LETTER_TYPE_CODE

'' as testcol可能因为没有数据所以允许出现吧

另外测试的环境是postgresql,你是在postgresql里面测试的吗?
1 楼 pyzheng 2009-11-25  
一个必须注意的地方是:SELECT 列表中指定的每一列也必须出现在 GROUP BY 子句中,除非这列是聚合函数列。
-----------------------------------
select a.NEW_RO_SO_CASE,'' as testcol,count(*)
    from vedvr_master a,ve_issue_letter b,ve_letter_dvr c
    where a.dvr_id = c.dvr_id
    and c.letter_id = b.letter_id
    group by a.NEW_RO_SO_CASE,b.LETTER_TYPE_CODE

运行没问题



select PARENT_DVR_ID,
(select ENG_DESC from VE_DEFECT_GROUP where DEFECT_GROUP_CODE = a.DEFECT_GROUP_CODE1) as DEFECT_GROUP_DESC,
count(*)
from vedvr_master a  group by PARENT_DVR_ID,DEFECT_GROUP_DESC
------------------
却有问题呢?

我的疑问是:
第一句:b.LETTER_TYPE_CODE没有出现在select的列表中,却能运行。同时,testcol可有可无  一样能运行
第二节:DEFECT_GROUP_DESC出现在select列表中  为什么又运行不了?
我想是不是一定是出现在from的tables的列表中才对啊?

相关推荐

    经典全面的SQL语句大全

    select type,sum(case vender when 'A' then pcs else 0 end),sum(case vender when 'C' then pcs else 0 end),sum(case vender when 'B' then pcs else 0 end) FROM tablename group by type  显示结果: type ...

    Oracle SQL高级编程(资深Oracle专家力作,OakTable团队推荐)--随书源代码

    4.3.3 空值与GROUP BY和ORDER BY 112 4.3.4 空值与聚合函数 114 4.4 小结 114 第5章 关于问题 116 5.1 问出好的问题 116 5.2 提问的目的 117 5.3 问题的种类 117 5.4 关于问题的问题 119 5.5 关于数据的问题...

    SQL sever 实训

    GROUP BY Product .ProNO,ProName ,Price ) PRINT @MONEY GO --单元十二 触发器 --创建触发器,实现即时更新每种产品的库存数量。 CREATE TRIGGER UPDATE_ProNo_Stocks_TRIGGER ON Product FOR UPDATE AS...

    MYSQL常用命令大全

    在进行开发和实际应用中,用户不应该只用root用户进行连接数据库,虽然使用root用户进行测试时很方便,但会给系统带来重大安全隐患,也不利于管理技术的提高。我们给一个应用中使用的用户赋予最恰当的数据库权限。如...

    SQL语法大全

    sql="select * from 数据表 where 字段名 like \'%字段值%\' order by 字段名 [desc]" sql="select top 10 * from 数据表 where 字段名 order by 字段名 [desc]" sql="select * from 数据表 where 字段名 in (\'值...

    OCA认证考试指南1Z0-051

    6.3 使用GROUPBY子句分组数据 6.3.1 创建数据组 6.3.2 GROUPBY子句 6.3.3 按多列分组 6.4 使用HAVING子句包含或者排除分组行 6.4.1 限制分组结果 6.4.2 HAVING子句 6.5 认证小结 6.6 本章 测试题 ...

    Oracle_Database_11g完全参考手册.part3/3

    12.1 groupby和having的用法 12.1.1 添加一个orderby 12.1.2 执行顺序 12.2 分组视图 12.3 用别名重命名列 12.4 分组视图的功能 12.4.3 对列和分组函数进行排序 12.4.4 连接列 12.5 更多分组可能性 第13章 当一个...

    Oracle_Database_11g完全参考手册.part2/3

    12.1 groupby和having的用法 12.1.1 添加一个orderby 12.1.2 执行顺序 12.2 分组视图 12.3 用别名重命名列 12.4 分组视图的功能 12.4.3 对列和分组函数进行排序 12.4.4 连接列 12.5 更多分组可能性 第13章 当一个...

    Java数据库编程宝典2

    8.2 GROUP BY子句 8.3 聚合函数 8.4 使用HAVING子句筛选组 8.5 使用索引来提高SQL查询的性能 8.6 视图 8.7 小结 第9章 连接和组合查询 9.1 连接表 9.1.1 连接的类型 9.2 键 9.2.1 主键 9.2.2 外键 ...

    Java数据库编程宝典4

    8.2 GROUP BY子句 8.3 聚合函数 8.4 使用HAVING子句筛选组 8.5 使用索引来提高SQL查询的性能 8.6 视图 8.7 小结 第9章 连接和组合查询 9.1 连接表 9.1.1 连接的类型 9.2 键 9.2.1 主键 9.2.2 外键 ...

    Java数据库编程宝典1

    8.2 GROUP BY子句 8.3 聚合函数 8.4 使用HAVING子句筛选组 8.5 使用索引来提高SQL查询的性能 8.6 视图 8.7 小结 第9章 连接和组合查询 9.1 连接表 9.1.1 连接的类型 9.2 键 9.2.1 主键 9.2.2 外键 ...

    Java数据库编程宝典3

    8.2 GROUP BY子句 8.3 聚合函数 8.4 使用HAVING子句筛选组 8.5 使用索引来提高SQL查询的性能 8.6 视图 8.7 小结 第9章 连接和组合查询 9.1 连接表 9.1.1 连接的类型 9.2 键 9.2.1 主键 9.2.2 外键 ...

    Oracle8i_9i数据库基础

    §2.3.2 带 GROUP BY 的计算 75 §2.3.3 用 HAVING 来限制分组的计算 75 §2.4 控制和格式化输出 76 §2.4.1 用 ORDER BY 子句来对结果进行排序 76 §2.4.2 用 BREAK 命令 来对结果进行排列 76 §2.4.3 用 COMPUTE ...

    数据分页程序完全解决方案(含普通分页/分段分页/原始分页/since_id分页)

    (这一点换一种说法更容易理解: 当数据集没有发生变化时, 同样的输入, 多次执行, 得到的输出顺序保持不变) 3) 所有的分段式数据读取, 要完全保证数据集的一致性, 必须保证数据集顺序的一致性, 即快照 4) 传统的...

    MySQL命令大全

    在进行开发和实际应用中,用户不应该只用root用户进行连接数据库,虽然使用root用户进行测试时很方便,但会给系统带来重大安全隐患,也不利于管理技术的提高。我们给一个应用中使用的用户赋予最恰当的数据库权限。如...

    高性能MySQL(第3版).part2

    6.7.4优化GROUPBY和DISTINCT239 6.7.5优化LIMIT分页241 6.7.6优化SQL_CALC_FOUND_ROWS243 6.7.7优化UNION查询243 6.7.8静态查询分析244 6.7.9使用用户自定义变量244 6.8案例学习251 6.8.1使用MySQL构建一个...

    mysql官方中文参考手册

    12.10. 与GROUP BY子句同时使用的函数和修改程序 12.10.1. GROUP BY(聚合)函数 12.10.2. GROUP BY修改程序 12.10.3. 具有隐含字段的GROUP BY 13. SQL语句语法 13.1. 数据定义语句 13.1.1. ALTER DATABASE语法 ...

    MYSQL中文手册

    12.10. 与GROUP BY子句同时使用的函数和修改程序 12.10.1. GROUP BY(聚合)函数 12.10.2. GROUP BY修改程序 12.10.3. 具有隐含字段的GROUP BY 13. SQL语句语法 13.1. 数据定义语句 13.1.1. ALTER DATABASE...

Global site tag (gtag.js) - Google Analytics