oracle(41)

在 应用系统开发中,进行需要统计数据库中的数据,当执行数据统计时,需要将表中的数据进行分组显示,在统计分组中是通过group by子句、分组函数、having子句共同实现的。其中group by子句用于指定要分组的列,而分组函数用户指定显示统计的结果,而having子句用户限制显示分组结果。 
   一、分组函数 
   分组函数用于统计表的数据,并作用于多行,但是返回一个结果,一般情况下,分组函数要与group by子句结合使用,Oracle数据库提供了大量的分组函数,常用的五个分组函数:

  1. Max:该函数用于取得列或表达式的最大值,适用于任何数据类型。
  2. Min:该函数用于取得列或表达式的最小值,适用于任何数据类型。
  3. Avg:该函数用于取得列或表达式的平均值,适用于数字类型。
  4. Sum:该函数用于取得列或表达式的总和,  适用于数字类型。
  5. Count:该函数用于取的行数总和。

注意: 
1、当使用分组函数时,分组函数只能出现在选择列表、order by和having子句中,而不能出现在where、group by子句中。 
2、当使用分组函数时,除了函数count(*)外,其他分组函数都会忽略NULL行。 
3、当执行select语句时,如果选择列表同时包括列、表达式和分组函数,那么这些列、表达式必须出现在group by子句中。 
4、当使用分组函数时,在分组函数中可以指定all和distinct选项,其中all是默认选项,该选项表示统计所有行数据(包括重复行),distinc可以统计不同行数据。

示例如下: 
1、取得某列最小值、最大值、平均值、总和和总计行数

  1. select max(id) as max_id,min(id) as min_id,avg(id) as avg_id,sum(id) as sum_id,count(*) as count from cip_temps;

2、去除重复值

  1. select count(distinct id) from cip_temps;

二、group by和having子句 
   group by子句是对统计的结果进行分组统计,而having子句用于限制分组显示结果,语法如下: 
select column,group_function from table [where condition][group by group_by_experssion][having group_function];如上所示,column用于指定列表中的列或表达式,group_function用于指定分组函数,condition用于指定条件子句,group_by_experssion用于指定分组表达式,group_function用于指定排除分组结果条件。 
1、使用group by进行单列分组,如下:

  1. select id as id,min(age) max_age,max(age) max_age from cip_temps group by id;

2、使用having子句限制分组显示结果,如下:

  1. select id as id,count(age) count from cip_temps group by id having count(age)=2;

三、case表达式 
case格式如下:

  1. case when 条件 then 返回值1 when 条件2 then 返回值2 else 返回值3 end

示例如下: 
select name,age,address,case when id=21 then 'abc' when id=22 then 'def' else 'hij' end alias from cip_temps; 
四、Oracle常用统计函数 
1、数字函数 
  (1)、mod(m,n)该函数用于返回取得两个数字相除后的余数,如果数字为0,则返回结果为m。 
  (2)、round(n,[m]该函数用于取得四舍五入运算,如果省略m,则四舍五入至整数位;如果m是负数,则四舍五入到小数点前m位;如果m是正数,则四舍五入到小数点后m位。 
  (3)、trunc(n,[m])该函数用于截取数字,如果省略m,则将数字n的小数部门截取;如果m为正数,则将数字n截取至小数点后的第m位,如果m为负数,则将数字n截取小数点的前m为。 
示例如下:

  1. select mod(10,4) from dual;
  2. select round(101234.567,-4) from dual;
  3. select round(101.234567,4) from dual;
  4. select trunc(101234.457,2) from dual;
  5. select trunc(101234.457,-2) from dual;

2、日期函数 
   (1)、round(d,[fmt])该函数用于返回日期时间的四舍五入结果,如果fmt指定年度,则7月1日为分割线;如果fmt指定月,则16日为分割线;如果fmt指定为天,则中午12:00为分割线。 
   (2)、trunc(d,[fmt])该函数用于截取日期时间数据,如果fmt指定年度,则结果为本年度的1月1日,如果fmt指定月,则结果为本月1日。 
示例如下:

  1. select round(sysdate,'yyyy') from dual;
  2. select round(sysdate,'mm') from dual;
  3. select round(sysdate,'dd') from dual;
  4. select trunc(sysdate,'yyyy') from dual;
  5. select trunc(sysdate,'mm') from dual;
  6. select trunc(sysdate,'dd') from dual;

3、转换函数 
    (1)、to_char(date,fmt)该函数用于将日期类型转换为字符串类型,其中fmt用于指定日期格式。 
    (2)、to_date(char,fmt)该函数用于将符合特定日期格式的字符串转变为date类型的值。 
    (3)、to_number(char)该函数用于将符合特定数字格式的字符串转换为数字类型。 
示例如下:

  1. select to_date('2009-3-1','yyyy-mm-dd') from dual;
  2. select to_char(sysdate,'YYYY-MM-DD HH24:MI:SS') from dual;
  3. select to_number('10.123') from dual;

4、其他单行函数

(1)、decode(expr,search1,result1[,search2,result2,...],default)该函数用于返回匹配于
特定表达式结果,如果search1匹配与expr,则返回结果result1,如果search2匹配expr,则返回结果result2,以此类推,
如果没有任何匹配关系,则返回默认default。 
示例如下:

  1. select name,decode(age,'bb21',id*10,'bb22',id*20,1000) as decodee from cip_temps;

注意:decode函数和case表达式的用法基本相似,但是case表达式可以多个条件进行判断,从而返回结果。 
示例如下:

    1. select name,case when (
    2. (age='bb21' and address='cc21')
    3. or (age='bb22' and address='cc22')
    4. or (age='bb23' and address='cc23')
    5. ) then 1 else 0 end as cases from cip_temps

Oracle中SQL语句学习五(统计分组语句group by和having)的更多相关文章

  1. oracle中sql语句的优化

    oracle中sql语句的优化 一.执行顺序及优化细则 1.表名顺序优化 (1) 基础表放下面,当两表进行关联时数据量少的表的表名放右边表或视图: Student_info   (30000条数据)D ...

  2. Oracle中SQL语句分类

    Oracle中SQL语句分类如下:1.DML语句 insert/delete/update/select/merge/explan plan/lock table2.DDL语句 create/atlt ...

  3. 转:Oracle中SQL语句执行过程中

    Oracle中SQL语句执行过程中,Oracle内部解析原理如下: 1.当一用户第一次提交一个SQL表达式时,Oracle会将这SQL进行Hard parse,这过程有点像程序编译,检查语法.表名.字 ...

  4. oracle 中SQL 语句开发语法 SELECT INTO含义

    oracle 中SQL 语句开发语法 SELECT INTO含义 在ORACLE中SELECT INTO是如何使用的,什么意思?和SQL SERVER的不一样?   和sqlserver的不一样sql ...

  5. 使用PL/SQL能查询oracle中数据,在for update 语句中一直卡住

    原因:在oracle中,执行了update或者insert语句后,都会要求commit,如果不commit却强制关闭连接,oracle就会将这条提交的记录锁住.下次就不能执行增删操作. 解决:1.查询 ...

  6. 跟踪oracle中sql语句运行过程及相关知识拓展

    select * from v$sqlarea; select * from v$sqlarea where first_load_time>'2010-11-27/09:30:00'; 这种方 ...

  7. SQL数据库学习,常用语句查询大全

    数据库学习 sql server数据库基本概念 使用文件保存数据存在几个缺点: 1.文件的安全性问题: 2.文件不利于查询和对数据的管理: 3.文件不利于存放海量数据 4.文件在程序中控制不方便. 数 ...

  8. MySQL、Oracle和SQL Server的分页查询语句

    假设当前是第PageNo页,每页有PageSize条记录,现在分别用Mysql.Oracle和SQL Server分页查询student表. 1.Mysql的分页查询: SELECT * FROM s ...

  9. Oracle中SQL调优(SQL TUNING)之最权威获取SQL执行计划大全

    该文档为根据相关资料整理.总结而成,主要讲解Oracle数据库中,获取SQL语句执行计划的最权威.最正确的方法.步骤,此外,还详细说明了每种方法中可选项的意义及使用方法,以方便大家和自己日常工作中查阅 ...

随机推荐

  1. C++_知识点_namespace

    #include <iostream> #include <string> using namespace std; void name() { cout << & ...

  2. C++ try catch 捕获空指针异常,数组越界异常

    #include <exception> #include <iostream> using namespace std; /************************* ...

  3. 一个原生js写的加减乘除运算

    根据我的经验我说的再多也没人看,不过还是简单介绍下效果吧,可以选择+,-,*,/,去计算数据,喜欢的话就粘贴复制自己看去吧! <!DOCTYPE html PUBLIC "-//W3C ...

  4. 在实体对象中访问导航属性里的属性值出现异常“There is already an open DataReader associated with this Command which must be closed first”

    在实体对象中访问导航属性里的属性值出现异常“There is already an open DataReader associated with this Command which must be ...

  5. MYSQL group_concat() 函数

    看来看一下表中的数据 select * from t; 下一步来看一下group_concat函数的用法 select ID,group_concat(Name) from t group by ID ...

  6. chrome extensions

        chrome web store   AppsGamesExtensionsThemes   CATEGORIES   All FEATURESClear   Runs Offline By ...

  7. windows平台发消息到非UI线程.

    下面的代码是介绍如何在windows平台发消息到非UI线程. 主要是'PeekMessage || GetMessage' 这两个API的应用. 当他们被调用的时候,如果当前线程还没有消息循环,就会创 ...

  8. HDU 5019 Revenge of GCD

    题解:筛出约数,然后计算即可. #include <cstdio> #include <algorithm> typedef long long LL; LL a1[10000 ...

  9. Juicy Couture_百度百科

    Juicy Couture_百度百科 Juicy Couture

  10. 1分钟搞定超慢SQL

    前几天,一个用户的研发人员找到我了,说他们有个SQL语句非常慢,我说多慢?他们说:半个小时也没出结果.于是问他们要了SQL语句和执行计划,SQL语句就不能再这里贴出来了,下面是调整前的执行计划(略去某 ...