`

SQL中group by怎么用?执行原理是什么?

阅读更多
group by
分组
通用数据库具有基于表的特定列对数据进行分析的能力。
可按照在 GROUP BY 子句中定义的组对行进行分组。以其最简单的形式,组由称为分组列的列组成。 SELECT 子句中的列名必须为分组列或列函数。列函数对于 GROUP BY 子句定义的每个组各返回一个结果。下列示例产生一个列出每个部门编号的最高薪水的结果:
SELECT DEPT, MAX(SALARY) AS MAXIMUM
FROM STAFF
GROUP BY DEPT
此语句产生下列结果:
DEPT MAXIMUM
------ ---------
10 22959.20
15 20659.80
20 18357.50
38 18006.00
42 18352.80
51 21150.00
66 21000.00
84 19818.00
注意:计算的是每个部门(由 GROUP BY 子句定义的组)而不是整个公司的 MAX(SALARY)。
将 WHERE 子句与 GROUP BY 子句一起使用
分组查询可以在形成组和计算列函数之前具有消除非限定行的标准 WHERE 子句。必须在GROUP BY 子句之前指定 WHERE 子句。例如:
SELECT WORKDEPT, EDLEVEL, MAX(SALARY) AS MAXIMUM
FROM EMPLOYEE
WHERE HIREDATE > '1979-01-01'
GROUP BY WORKDEPT, EDLEVEL
ORDER BY WORKDEPT, EDLEVEL

结果为:
WORKDEPT EDLEVEL MAXIMUM
-------- ------- -----------
D11 17 18270.00
D21 15 27380.00
D21 16 36170.00
D21 17 28760.00
E11 12 15340.00
E21 14 26150.00
注意:在 SELECT 语句中指定的每个列名也在 GROUP BY 子句中提到。未在这两个地方提到的列名将产生错误。GROUP BY 子句对 WORKDEPT 和 EDLEVEL 的每个唯一组合各返回一行。
在 GROUP BY 子句之后使用 HAVING 子句
可应用限定条件进行分组,以便系统仅对满足条件的组返回结果。为此,在GROUP BY 子句后面包含一个 HAVING 子句。 HAVING 子句可包含一个或多个用 AND 和 OR 连接的谓词。每个谓词将组特性(如 AVG(SALARY))与下列之一进行比较:
该组的另一个特性
例如:
HAVING AVG(SALARY) > 2 * MIN(SALARY)
常数
例如:
HAVING AVG(SALARY) > 20000
例如,下列查询寻找雇员数超过 4 的部门的最高和最低薪水:
SELECT WORKDEPT, MAX(SALARY) AS MAXIMUM, MIN(SALARY) AS MINIMUM
FROM EMPLOYEE
GROUP BY WORKDEPT
HAVING COUNT(*) > 4
ORDER BY WORKDEPT
此语句产生下列结果:
WORKDEPT MAXIMUM MINIMUM
-------- ----------- -----------
D11 32250.00 18270.00
D21 36170.00 17250.00
E11 29750.00 15340.00
有可能(虽然很少见)查询有 HAVING 子句但没有 GROUP BY 子句。在此情况下,DB2 将整个表看作一个组。因为该表被看作是单个组,所以最多可以有一个结果行。如果 HAVING 条件对整个表为真,则返回选择的结果(该结果必须整个由列函数组成);否则不返回任何行。来自:http://zhidao.baidu.com/question/11763032.html
分享到:
评论
1 楼 百威 2009-04-03  
使用 GROUP BY 子句时,一定要记住下面的规则:

1.   不能 GROUP BY text、image 或 bit 数据类型的列
2.   SELECT 列表中指定的每一列也必须出现在 GROUP BY 子句中,除非这列是用于聚合函数。
3.   不能 GROUP BY 列的别名。 这是说 GROUP BY 字段列表中的所有字段必须是实际存在于 FROM 子句中指定的表中的列。
4.   进行分组前可以使用 WHERE 子句消除不满足条件的行。
5.   使用 GROUP BY 子句返回的组没有特定的顺序。可以使用 ORDER BY 子句指定想要的排序次序。

相关推荐

    当数据库复杂查询执行顺序与编写顺序原理及sql案例:同时出现了where_group_by_having_order_by的时候_执行顺序和编写顺序

    当同时出现了where_group_by_having_order_by的时候_执行顺序和编写顺序时的用法

    数据库笔试题之查询语句where,group by,having,order by执行与编写顺序详解

    数据库复杂查询执行顺序与编写顺序原理及sql案例:同时出现了where_group_by_having_order_by的时候_执行顺序和编写顺序

    MySQL中distinct语句的基本原理及其与group by的比较

    DISTINCT 实际上和 GROUP BY 操作的实现非常相似,只不过是在 GROUP BY 之后的每组中只取出一条记录而已。所以,DISTINCT 的实现和 GROUP BY 的实现也基本差不多,没有太大的区别。同样可以通过松散索引扫描或者是...

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

    14.1 什么是事务 386 14.2 事务的ACID属性 387 14.3 事务隔离级别 388 14.4 多版本读一致性 390 14.5 事务控制语句 391 14.5.1 Commit(提交) 391 14.5.2 Savepoint(保存点) 391 14.5.3 Rollback(回滚) 391 ...

    MySQL分组查询Group By实现原理详解

     在MySQL 中,GROUP BY 的实现同样有多种(三种)方式,其中有两种方式会利用现有的索引信息来完成 GROUP BY,另外一种为完全无法使用索引的场景下使用。下面我们分别针对这三种实现方式做一个分析。  1、使用松散...

    SQL性能优化

     以上四个SQL在ORACLE分析整理之后产生的结果及执行的时间是一样的,但是从ORACLE共享内存SGA的原理,可以得出ORACLE对每个SQL 都会对其进行一次分析,并且占用共享内存,如果将SQL的字符串及格式写得完全相同则...

    sql总结.doc

    (3)若视图的定义中有GROUP BY子句或聚集函数时,则此视图不允许更新; (4)若视图的定义中有DISTINCT任选项,则此视图不允许更新; (5)若视图的定义中有嵌套查询,并且嵌套查询的FROM子句中涉及的表也是导出该...

    SQL sever 实训

    SQL sever 2008 Rar! ?s X<t ? ? ? ?祕BwL0 17240671-1.sql ?年3月9日 --1.查询course表的所有信息(所有行所有列) USE Xk GO SELECT * FROM Course --有哪些种类的选修课?学分是多少 USE XK GO SELECT Kind,...

    Java面试宝典2020修订版V1.0.1.doc

    21、order by与group by的区别 47 22、commit在哪里会运用 47 23、行转列、列换行怎么转 48 24、什么是PL/SQL? 49 25、序列的作用 50 26、表和视图的关系 50 27、oracle基本数据类型 50 28、drop、truncate、 ...

    sql 删除表中的重复记录

    遇见了表中存在重复的记录的问题,直接写sql删除时最快的,才不要慢慢的复制到excel表中慢慢的人工找呢 ...group by StructSN ,Date,UserID,StarCount having COUNT(StructSN) > 1 然后就可以直接删除,基本原理就是,

    java面试题

    同步和异步,在什么情况下分别使用? 答:如果数据将在线程间共享。例如正在写的数据以后可能被另一个线程读到,或者正在读的数据可能已经被另一个线程写过了,那么这些数据就是共享数据,必须进行同步存取。 当...

    数据库原理实验报告整合

    在SQL Server中创建数据库的方法主要有两种:一是在SQL Server Management Studio窗口中使用可视化界面,通过方便的图形化向导创建,二是通过执行Transact-SQL语句创建。 (一)向导方式创建 1、从“开始”菜单选择...

    asp.net面试题

    A.insert、update、delete等操作的Sql语句主要用ExecuteNonQuery()方法来执行; B.ExecuteNonQuery()方法返回执行Sql语句所影响的行数。 C.Select操作的Sql语句只能由ExecuteReader()方法来执行; D....

    浅谈MySQL排序原理与案例分析

    用户通过Order by语句即能达到将指定的结果集排序的目的,其实不仅仅是Order by语句,Group by语句,Distinct语句都会隐含使用排序。本文首先会简单介绍SQL如何利用索引避免排序代价,然后会介绍MySQL实现排序的内部...

    大数据常见问题之数据倾斜.docx

    1、Hadoop中的数据倾斜 Hadoop中直接贴近用户使用使用的时Mapreduce程序和Hive程序,虽说Hive最后也是用MR来执行(至少目前Hive内存计算并不普及),但是毕竟写的内容逻辑区别很大,一个是程序,一个是Sql,因此...

    siuba:Python库,用于将dplyr等语法用于熊猫和SQL

    可以在group_by()执行这些操作,这会使它们分别应用于分组的数据行。 此外,实现了许多SQL概念,例如distinct() , count()和联接。 这些函数的输入可以是pandas DataFrame或SQL连接(当前为postgres, DataFrame或...

    Mysql 进阶修行学习

    索引:结构、Btree、索引分类、索引语法、性能分析、执行频次、慢查询日志、show profiles、explain、使用规则(验证索引效率、最左前缀法则、索引失效情况、SQL提示、覆盖索引&回表查询、前缀索引、单列&联合索引、...

Global site tag (gtag.js) - Google Analytics