Oracle学习(4):分组函数

分组函数

什么是分组函数?

分组函数作用于一组数据,并对一组数据返回一个值

组函数的类型

lAVG

lCOUNT

lMAX

lMIN

lSUM

数值求和

SQL> --求员工工资总额

SQL> select sum(sal) from emp;

SUM(SAL)

----------

29025

求数据条数

SQL> --求员工的人数

SQL> select count(*)from emp;

COUNT(*)

----------

14

求平均

SQL> --平均工资

SQL> select sum(sal)/count(*) 方式一, avg(sal) 方式二 from emp;

方式一     方式二

---------- ----------

2073.21429 2073.21429

SQL> --奖金的平均值

SQL> select sum(comm)/count(*) 方式一,sum(comm)/count(comm) 方式二, avg(comm) 方式三

2  from emp;

方式一     方式二     方式三

---------- ---------- ----------

157.142857        550        550

SQL> select count(*), count(comm) from emp;

COUNT(*) COUNT(COMM)

---------- -----------                                                                  (组函数自动滤空)

14           4

SQL> select * from emp;

EMPNO ENAME    JOB              MGR HIREDATE         SAL       COMM     DEPTNO

---------- -------- --------- ---------- -------------- ----- ---------- ----------

7369 SMITH    CLERK           7902 17-12月-80       800                    20

7499 ALLEN    SALESMAN        7698 20-2月 -81      1600        300         30

7521 WARD     SALESMAN        7698 22-2月 -81      1250        500         30

7566 JONES    MANAGER         7839 02-4月 -81      2975                    20

7654 MARTIN   SALESMAN        7698 28-9月 -81      1250       1400         30

7698 BLAKE    MANAGER         7839 01-5月 -81      2850                    30

7782 CLARK    MANAGER         7839 09-6月 -81      2450                    10

7788 SCOTT    ANALYST         7566 13-7月 -87      3000                    20

7839 KING     PRESIDENT            17-11月-81      5000                    10

7844 TURNER   SALESMAN        7698 08-9月 -81      1500          0         30

7876 ADAMS    CLERK           7788 13-7月 -87      1100                    20

7900 JAMES    CLERK           7698 03-12月-81       950                    30

7902 FORD     ANALYST         7566 03-12月-81      3000                    20

7934 MILLER   CLERK           7782 23-1月 -82      1300                    10

已选择14行。

组函数自动滤空

SQL> --组函数自动滤空

SQL> select count(*), count(nvl(comm,0)) from emp;

COUNT(*) COUNT(NVL(COMM,0))

---------- ------------------

14                 14

最大最小值

SQL> --最高工资 最低工资

SQL> select max(sal),min(sal) from emp;

MAX(SAL)   MIN(SAL)

---------- ----------

5000        800

SQL> host cls

分组数据

group by分组

SQL> --group by分组:求各个部门的平均工资

SQL> select deptno,avg(sal)

2  from emp

3  group by deptno;

DEPTNO   AVG(SAL)

---------- ----------

30 1566.66667

20       2175

10 2916.66667

SQL> ed

已写入 file afiedt.buf

1  select deptno,job,avg(sal)

2  from emp

3  group by deptno,job

4* order by 1

SQL> /

DEPTNO JOB         AVG(SAL)

---------- --------- ----------

10 CLERK           1300

10 MANAGER         2450

10 PRESIDENT       5000

20 ANALYST         3000

20 CLERK            950

20 MANAGER         2975

30 CLERK            950

30 MANAGER         2850

30 SALESMAN        1400

已选择9行。

**********************************************************************************************

注意:

在SELECT列表中所有未包含在组函数中的列都应该包含

在GROUPBY子句中。

包含在GROUPBY
子句中的列不必包含在SELECT
列表中

**********************************************************************************************

group by作用于多列

SQL> --group by作用于多列:先按照第一列分组;如果相同,再按照第二列分组

SQL>  select deptno,avg(sal)

2   from emp

3   group by deptno

4   having avg(sal)>2000;

DEPTNO   AVG(SAL)

---------- ----------

20       2175

10 2916.66667

having:在分组的基础上,再过滤

SQL> --having:在分组的基础上,再过滤

SQL> select deptno,avg(sal)

2  from emp

3  group by deptno

4  where depno=10;

where depno=10

*

第 4 行出现错误:

ORA-00933: SQL 命令未正确结束

**********************************************************************

(where后面不能跟组函数!!!)

不能在 WHERE 子句中使用组函数(注意)。

可以在 HAVING 子句中使用组函数。

**********************************************************

SQL> ed

已写入 file afiedt.buf

1  select deptno,avg(sal)

2  from emp

3  where deptno=10

4* group by deptno

5  /

DEPTNO   AVG(SAL)

---------- ----------

10 2916.66667

SQL> select deptno,avg(sal)

2  from emp

3  group by deptno

4  having deptno=10;

DEPTNO   AVG(SAL)

---------- ----------

10 2916.66667

数据库优化问题

SQL> --where和having均可使用时,尽量采用where! 因为where可以先对数据进行过滤然后分组,提高分组效率!

SQL> host cls

group by的增强

SQL> /*

SQL> group by的增强

SQL> group by deptno,job

SQL> +

SQL> group by deptno

SQL> +

SQL> group by null

SQL> =

SQL> group by rollup(deptno,job)

SQL>

SQL>

SQL> group by rollup(a,b)

SQL> =

SQL> group by a,b

SQL> +

SQL> group by a

SQL> +

SQL> group by null

SQL> */

SQL> select deptno,job,sum(sal)

2  from emp

3  group by rollup(deptno,job);

DEPTNO JOB         SUM(SAL)

---------- --------- ----------

10 CLERK           1300

10 MANAGER         2450

10 PRESIDENT       5000

10                 8750

20 CLERK           1900

20 ANALYST         6000

20 MANAGER         2975

20                10875

30 CLERK            950

30 MANAGER         2850

30 SALESMAN        5600

30                 9400

29025

已选择13行。

设定格式

SQL> break on deptno skip 2

SQL> /

DEPTNO JOB         SUM(SAL)

---------- --------- ----------

10 CLERK           1300

MANAGER         2450

PRESIDENT       5000

8750

20 CLERK           1900

ANALYST         6000

MANAGER         2975

10875

30 CLERK            950

MANAGER         2850

SALESMAN        5600

9400

DEPTNO JOB         SUM(SAL)

---------- --------- ----------

29025

已选择13行。

取消格式

SQL> break on null

SQL> /

DEPTNO JOB         SUM(SAL)

---------- --------- ----------

10 CLERK           1300

10 MANAGER         2450

10 PRESIDENT       5000

10                 8750

20 CLERK           1900

20 ANALYST         6000

20 MANAGER         2975

20                10875

30 CLERK            950

30 MANAGER         2850

30 SALESMAN        5600

30                 9400

29025

已选择13行。

SQL> spool off

时间: 2024-10-06 01:30:29

Oracle学习(4):分组函数的相关文章

Oracle - 查询语句 - 分组函数

/* 分组函数 不能再select子句中出现普通的列,除非这个列在group by中给出 所有的空值都会被分为一组 分组过滤 SELECT FROM WHERE GROUPBY HAVING ORDERBY */ --求出每种工作的平均薪资 SELECT JOB,AVG(SAL),MAX(SAL),MIN(SAL) FROM EMP GROUP BY JOB; SELECT MAX(SAL) FROM EMP; SELECT DEPTNO,AVG(SAL) FROM EMP GROUP BY D

ORACLE学习05-单行函数

一.字符函数 1,字符串转换 -- lower() 将字符串转成小写 select lower('HELLO WORLD') from dual;   -- upper() 将字符串转大写 select upper('hello world') from dual;   -- initcap() 将字符串首字母大写 select initcap('hEllo woRld') from dual; 2,字符串截取 -- substr(a,b) 从a中,第b位开始取,取右边所有的字符 select

oracle学习笔记单行函数

单行函数 只对一行进行变换  每行返回一个结果 单行函数分 字符.数值.日期.转换.通用 字符函数:大小写控制函数.字符控制函数 大小写控制函数:lower, upper, initcap 字符控制函数:concat,substr,length,instr,lpad|rpad,trim,replace lower,upper,initcap select lower('SQL') from dual; --结果 sql select upper('sql') from dual; --结果 SQ

oracle学习篇五:组函数,分组统计

常用组函数: 1.ccount() 求出全部记录数. 2.max() 求出一组最大值 3.min() 求出一组最小值 4.avg() 求出平均值 5.sum() 求和 --1.统计员工数量: select count(empno) from emp; --2.求出最高薪资 select max(sal) from emp; --3.求出最低薪资 select min(sal) from emp; --4.求出平均薪资 select avg(sal) from emp; --查询各部门员工数量 s

Oracle学习(四):组函数

1.知识点:可以对照下面的录屏进行阅读 SQL> --组函数类型:avg,count,max,min,sum SQL> --工资总额 SQL> select sum(sal) from emp; SQL> --员工人数 SQL> select count(*) from emp; SQL> --平均工资 SQL> select sum(sal)/count(*) 一, avg(sal) 二 from emp; SQL> --平均奖金的三种方式:二三方法一样,

Oracle学习(四)_SQL函数

--第一部分:SQL基础 --ch1 简单查询 --ch2 查询基本概念 --ch3 数据过滤 --第二部分:多表操作 --ch4 集合理论 --ch5 内连接 --ch6 外连接 --ch7 子查询 --第三部分:数据分组 --ch8 简单统计 --ch9 数据分组 --ch10 分组数据过滤 --第四部分:SQL函数 --ch11 内置函数 --ch12 case表达式 --第五部分:DML语句 --ch13 插入数据 --ch14 修改数据 --ch15 删除数据 ------------

ORACLE分组函数stddev和variance,我心存的疑问

方差函数VARIANCE(x),具体方法是: 设方差s,a为x1,x2...xn的平均值 ,则s = [(x1-a)^2+(x2-a)^2+(x3-a)^2+--(xn-a)^2]/n 标准差函数STDDEV(x),具体算法是: 方差开方.设标准查为& ,则 &^2 = s 但是我通过以下的实验,发现oracle是这样计算variance()的, s = [(x1-a)^2+(x2-a)^2+(x3-a)^2+--(xn-a)^2]/n-1 ,注意不是除以n,而是n-1 ---------

Oracle学习(三):单行函数

1.知识点:可以对照下面的录屏进行阅读 SQL> --字符函数 SQL> --字符串的转换 SQL> select lower('hellO WORld') 转小写,upper('hellO WORld') 转大写,initcap('hello world') 首字母大写 2 from dual; SQL> --substr(a,b) 从a中,第b位开始取,取右边所有的字符 SQL> select substr('Hello World',4) from dual; SQL&

Oracle学习笔记六 SQL常用函数

函数的分类 Oracle 提供一系列用于执行特定操作的函数 SQL 函数带有一个或多个参数并返回一个值 以下是SQL函数的分类: 单行函数对于从表中查询的每一行只返回一个值 可以出现在 SELECT 子句中和 WHERE 子句中 单行函数可以大致划分为: 1.日期函数 2.数字函数 3.字符函数 4.转换函数 5.其他函数 单行函数 日期函数 日期函数对日期值进行运算,并生成日期数据类型或数值类型的结果 日期函数包括: 1.ADD_MONTHS 2.MONTHS_BETWEEN 3.LAST_D