LYWILL设计运营 - 网站运营与推广、开发技术、成功项目展示。

从oracle去重复记录实例中学习使用group by, having

        oracle中去重复记录不用distinct ,用distinct关键字只能过滤查询字段中所有记录相同的(记录集相同),而如果要指定一个字段却没有效果,另外distinct关键字会排序,效率很低 。

        select distinct name from t1 能消除重复记录,但只能取一个字段,现在要同时取id,name这2个字段的值。

        select distinct id,name from t1 可以取多个字段,但只能消除这2个字段值全部相同的记录。

        所以用distinct达不到想要的效果,用group by ,可以解决这个问题

        例如要显示的字段为A、B、C三个,而A字段的内容不能重复可以用下面的语句:

        select A, min(B),min(C),count(*) from [table] where [条件] group by   A  having [条件] order by A desc

        为了显示标题头好看点可以把select A, min(B),min(C),count(*) 换称select A as A, min(B) as B,min(C) as C,count(*) as 重复次数

        显示出来的字段和排序字段都要包括在group by 中,但显示出来的字段包有min,max,count,avg,sum等聚合函数时可以不在group by 中。

        如上句的min(B),min(C),count(*)

        一般条件写在where 后面,有聚合函数的条件写在having 后面

        如果在上句中having加 count(*)>1   就可以查出记录A的重复次数大于1的记录

        如果在上句中having加 count(*)>2   就可以查出记录A的重复次数大于2的记录

        如果在上句中having加 count(*)>=1   就可以查出所有的记录,但重复的只显示一条,并且后面有显示重复的次数----这就是所需要的结果,而且语句可以通过hibernate

        下面语句可以查询出那些数据是重复的:

        select 字段1,字段2,count(*) from 表名 group by 字段1,字段2 having count(*) > 1

        将上面的>号改为=号就可以查询出没有重复的数据了。

        例如 select count(*) from (select gcmc,gkrq,count(*) from gczbxx_zhao t group by gcmc,gkrq having

        count(*)>=1 order by GKRQ)

 

        select * from gczbxx_zhao where viewid in ( select max(viewid) from gczbxx_zhao group by

        gcmc ) order by gkrq desc ---还是这个可行。

 

        聚合函数对一组行中的某个列执行计算执行计算并返回单一的值。聚合函数忽略空值。聚合函数经常与 SELECT 语句的 GROUP BY 子句一同使用,所以有的时候也把其称之为分组函数。
 

SQL代码
  1. 常见的分组函数有:   
  2. 函数名称    函数描述   
  3. Count   返回找到的记录数   
  4. Min 返回一个数字列或计算列的最小值   
  5. Max 返回一个数字列或计算列的最大值   
  6. Sum 返回一个数字列或计算列总和   
  7. avg 返回一个数字列或计算列的平均值   
  8. 分组函数的语法:   
  9. SELECT  [column,] group_function(column), ...    
  10. FROM        table    
  11. [WHERE  condition]   
  12. [GROUP BY   column]   
  13. [ORDER BY   column];   
  14. //返回总记录数   //* 代表的是:一条记录   
  15. SQL> select count(*) from emp;   
  16. //返回comm不为空的总记录数   
  17. SQL> select count(comm) from emp;   
  18. //COUNT(DISTINCT expr) 返回 expr非空且不重复的记录总数    
  19. SQL> select count(distinct(sal)) from emp;   
  20. 注意:组函数忽略空值。   
  21. //返回所有员工的平均工资      
  22. SQL> select avg(nvl(sal,0)) from emp;   
  23. 注意:NVL函数使分组函数无法忽略空值   
  24. //返回员工编号最小值      
  25. SQL> select min(empno) from emp;   
  26. //返回员工工资最大值   
  27. SQL> select max(sal) from emp;   
  28. //求该月本公司发出的工资总额   
  29. SQL> select sum(comm)+sum(sal) from emp;   
  30. SQL> select sum(nvl(sal,0)+nvl(comm,0)) from emp;   
  31.   
  32. Group by子句   
  33. Group By语句从英文的字面意义上理解就是“根据(by)一定的规则进行分组(Group)”。它的作用是通过一定的规则将一个数据集划分成若干个小的区域,然后针对若干个小区域进行数据处理。 如果在查询的过程中需要按某一列的值进行分组,以统计该组内数据的信息时,就要使用group by子句。不管select是否使用了where子句都可以使用group by子句。   
  34.   
  35. 注意:group by子句一定要与分组函数结合使用,否则没有意义。   
  36. //求出每个部门的员工人数   
  37. SQL> select deptno,count(*) as "人数" from emp group by deptno;   
  38. //求出每个部门的员工的平均工资   
  39. SQL> select deptno,avg(nvl(sal,0)) from emp group by deptno;   
  40. //注意:group by 子句中的列不必包含在SELECT 列表中   
  41. SQL> select avg(nvl(sal,0)) from emp group by deptno;   
  42.   
  43. //求出某个部门中相同职位的员工人数   group by 后可以跟多个分组的字段   
  44. SQL> select deptno,job,count(*) from emp group by deptno,job order by deptno;   
  45.   
  46. 非法使用组函数   
  47. 1、  所用包含于SELECT 列表中,而未包含于组函数中的列都必须包含于 GROUP BY 子句中。   
  48. 举例:   
  49. SQL> select empno,count(job) from emp;   
  50. 正确写法如下:   
  51. SQL> select empno,count(job) from emp group by empno;   
  52. 2、  不能在 WHERE 子句中使用组函数(注意)。   
  53. SQL> select deptno from emp where count(job)>0 group by deptno;   
  54. 备注:ORA-00934: 此处不允许使用分组函数   
  55.   
  56. Having 子句   
  57.     HAVING 子句对 GROUP BY 子句设置条件的方式与 WHERE 子句和 SELECT 语句交互的方式类似。WHERE 子句搜索条件在进行分组操作之前应用;而 HAVING 搜索条件在进行分组操作之后应用。HAVING 语法与 WHERE 语法类似,但 HAVING 可以包含聚合函数。HAVING 子句可以引用选择列表中出现的任意项。   
  58. 备注:having子句通常与group by子句结合使用   
  59.   
  60. 语法:   
  61. SELECT  column, group_function    
  62. FROM        table    
  63. [WHERE  condition]   
  64. [GROUP BY   group_by_expression]    
  65. [HAVING group_condition]   
  66. [ORDER BY   column];    
  67. //查询部门的员工人数大于五部门编号   
  68. SQL> select deptno,count(*) from emp group by deptno having count(*)>5;   
  69.   
  70. 备注:分组函数可以嵌套   
  71.   
  72. 嵌套函数   
  73.   
  74.   函数可以嵌套。一个函数的输出可以是另一个函数的输入。操作数有一个可继承的执行过程。但函数的优先权只是基于位置,函数遵循由内到外,由左到右的原则.   
  75.  嵌套函数可以包括在组函数中嵌套单行函数,或者组函数嵌套入单行函数或组函数中   
  76. 总结:整个查询语句的语法格式如下:   
  77. SELECT  column, group_function(column)    
  78. FROM        table    
  79. [WHERE  condition]   
  80. [GROUP BY   group_by_expression]    
  81. [HAVING group_condition]   
  82. [ORDER BY   column];