四、
通用函数
这些函数适用于任何数据类型,同时也适用于空值:
A、
NVL (expr1, expr2)
:如果
expr1为空的话,显示expr2
例如:查看emp如奖金comm为空的话,替换成0
SQL> select empno,ename,job,mgr,hiredate,sal,nvl(comm,0),deptno from emp;
显示结果:
EMPNO ENAME JOB MGR HIREDATE SAL NVL(COMM,0) DEPTNO
----- ---------- --------- ----- ----------- --------- ----------- ------
7369 SMITH CLERK 7902 1980-12-17 800.00 0 20
7499 ALLEN SALESMAN 7698 1981-2-20 1600.00 300 30
7521 WARD SALESMAN 7698 1981-2-22 1250.00 500 30
7566 JONES MANAGER 7839 1981-4-2 2975.00 0 20
7654 MARTIN SALESMAN 7698 1981-9-28 1250.00 1400 30
7698 BLAKE MANAGER 7839 1981-5-1 2850.00 0 30
7782 CLARK MANAGER 7839 1981-6-9 2450.00 0 10
7788 SCOTT ANALYST 7566 1982-12-9 3000.00 0 20
7839 KING PRESIDENT 1981-11-17 5000.00 0 10
7844 TURNER SALESMAN 7698 1981-9-8 1500.00 0 30
7876 ADAMS CLERK 7788 1983-1-12 1100.00 0 20
7900 JAMES CLERK 7698 1981-12-3 950.00 0 30
7902 FORD ANALYST 7566 1981-12-3 3000.00 0 20
7934 MILLER CLERK 7782 1982-1-23 1300.00 0 10
14 rows selected
B、
NVL2 (expr1, expr2, expr3)
:如果
expr1为不空的话,显示expr2,
如果
expr1为空的话,显示expr3
例如:查找员工的编号是7521的员工的工资,如果奖金(comm)不为空的话,显示工资加奖金
SQL> select sal,nvl2(comm,sal+comm,sal) from emp where empno=7521;
显示结果:
SAL NVL2(COMM,SAL+COMM,SAL)
--------- -----------------------
1250.00 1750
C、
NULLIF (expr1, expr2)
:
expr1与expr2相等返回NULL,不等返回expr1
例如:查看员工7788的薪水和奖金,如果薪水和奖金相等的话返回null,否则返回工资
SQL> select sal,comm,nullif(sal,comm) from emp where empno=7788;
显示结果:
SAL COMM NULLIF(SAL,COMM)
--------- --------- ----------------
3000.00 3000
D、
COALESCE (expr1, expr2, ..., exprn)
:
如果第一个表达式为空,则返回下一个表达式
。COALESCE 与 NVL 相比的优点在于 COALESCE 可以同时处理交替的多个值
例如:在emp表中测试的
为了测试,向emp表中添加一条记录:
SQL> insert into emp(empno,ename,deptno) values(7978,'guo',10);
测试语句:
SQL> select empno,ename,job,mgr,hiredate,sal,comm,deptno,coalesce(comm,sal,1000) as "测试结果" from emp;
显示结果:
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO 测试结果
----- ---------- --------- ----- ----------- --------- --------- ------ ----------
7369 SMITH CLERK 7902 1980-12-17 800.00 20 800
7499 ALLEN SALESMAN 7698 1981-2-20 1600.00 300.00 30 300
7521 WARD SALESMAN 7698 1981-2-22 1250.00 500.00 30 500
7566 JONES MANAGER 7839 1981-4-2 2975.00 20 2975
7654 MARTIN SALESMAN 7698 1981-9-28 1250.00 1400.00 30 1400
7698 BLAKE MANAGER 7839 1981-5-1 2850.00 30 2850
7782 CLARK MANAGER 7839 1981-6-9 2450.00 10 2450
7788 SCOTT ANALYST 7566 1982-12-9 3000.00 20 3000
7839 KING PRESIDENT 1981-11-17 5000.00 10 5000
7844 TURNER SALESMAN 7698 1981-9-8 1500.00 0.00 30 0
7876 ADAMS CLERK 7788 1983-1-12 1100.00 20 1100
7900 JAMES CLERK 7698 1981-12-3 950.00 30 950
7902 FORD ANALYST 7566 1981-12-3 3000.00 20 3000
7934 MILLER CLERK 7782 1982-1-23 1300.00 10 1300
7978 guo 10 1000
15 rows selected
五、
组合函数:
分组函数作用于一组数据,并对一组数据返回一个值。
A、
AVG
(字段名):求该字段的
平均值
例如:求出emp表中工资的平均值
SQL> select avg(nvl(sal,0)) from emp;
显示结果:
AVG(NVL(SAL,0))
---------------
1935
B、
COUNT
(字段名):求该字段中的
总记录
例如:查询emp表中有几条记录
SQL> select count(*) from emp;
显示结果:
COUNT(*)
----------
15
C、
MAX
(字段名):求该字段的
最大值
例如:求出emp表中的最高的工资的员工
SQL> select max(nvl(sal,0)) from emp;
显示结果:
MAX(NVL(SAL,0))
---------------
5000
D、
MIN
(字段名):求该字段的
最小值
例如:求出emp表中的最低的工资的员工
SQL> select min(nvl(sal,0)) from emp;
显示结果:
MIN(NVL(SAL,0))
---------------
0
E、
SUM
(字段名):求该字段的
和
例如:求emp一个需要发多少工资
SQL> select sum(sal)+sum(comm) as "总工资" from emp;
显示结果:
MIN(NVL(SAL,0))
---------------
0
非法使用组函数
A、
所用包含于
SELECT
列表中,而未包含于组函数中的列都必须包含于
GROUP BY
子句中。
例如
:
SQL> select empno,count(job) from emp;
正确写法如下:
SQL> select empno,count(job) from emp group by empno;
B、
不能在
WHERE
子句中使用组函数(注意)。
例如:
SQL> select deptno from emp where count(job)>0 group by deptno;
备注:
ORA-00934: 此处不允许使用分组函数
六、
group by 语句
如果在查询的过程中需要按某一列的值进行分组,以统计该组内数据的信息时,就要使用group by子句。不管select是否使用了where子句都可以使用group by子句。
注意:group by子句一定要与分组函数结合使用,否则没有意义。
1、
求出每个部门的员工的数
SQL> select count(*) from emp group by deptno;
显示的结果:
COUNT(*)
----------
6
5
4
2、
求每个部门的中员工的平均工资
SQL> select avg(nvl(sal,0)) from emp group by deptno;
显示的结果:
AVG(NVL(SAL,0))
---------------
1566.6666666666
2175
2187.5
七、
Having子句
HAVING 子句对 GROUP BY 子句设置条件的方式与 WHERE 子句和 SELECT 语句交互的方式类似。WHERE 子句搜索条件在进行分组操作之前应用;而 HAVING 搜索条件在进行分组操作之后应用。HAVING 语法与 WHERE 语法类似,但 HAVING 可以包含聚合函数。HAVING 子句可以引用选择列表中出现的任意项。
备注:having子句通常与group by子句结合使用
语法:
SELECT
column
,
group_function
FROM
table
[WHERE
condition
]
[GROUP BY
group_by_expression
]
[HAVING
group_condition
]
[ORDER BY
column
];
A、
查询部门的员工人数大于五部门编号
SQL> select deptno,count(*) from emp group by deptno having count(*)>5;
显示结果:
DEPTNO COUNT(*)
------ ----------
30 6
备注:分组函数可以嵌套
八、
Order by语句
ORDER BY 子句在SELECT语句的结尾。使用 ORDER BY 子句排序 :ASC(ascend): 升序 ;DESC(descend): 降序 。默认的是
ASC升序
A、
查询员工信息按照部门的编号进行升序排列
SQL> select empno,ename,job,mgr,hiredate,sal,comm,deptno from emp order by empno;
或:
SQL> select empno,ename,job,mgr,hiredate,sal,comm,deptno from emp order by empno asc;
显示的结果:
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
----- ---------- --------- ----- ----------- --------- --------- ------
7369 SMITH CLERK 7902 1980-12-17 800.00 20
7499 ALLEN SALESMAN 7698 1981-2-20 1600.00 300.00 30
7521 WARD SALESMAN 7698 1981-2-22 1250.00 500.00 30
7566 JONES MANAGER 7839 1981-4-2 2975.00 20
7654 MARTIN SALESMAN 7698 1981-9-28 1250.00 1400.00 30
7698 BLAKE MANAGER 7839 1981-5-1 2850.00 30
7782 CLARK MANAGER 7839 1981-6-9 2450.00 10
7788 SCOTT ANALYST 7566 1982-12-9 3000.00 20
7839 KING PRESIDENT 1981-11-17 5000.00 10
7844 TURNER SALESMAN 7698 1981-9-8 1500.00 0.00 30
7876 ADAMS CLERK 7788 1983-1-12 1100.00 20
7900 JAMES CLERK 7698 1981-12-3 950.00 30
7902 FORD ANALYST 7566 1981-12-3 3000.00 20
7934 MILLER CLERK 7782 1982-1-23 1300.00 10
7978 guo 10
15 rows selected
B、
查询员工信息按照部门的编号进行
降序
排列
SQL> select empno,ename,job,mgr,hiredate,sal,comm,deptno from emp order by empno desc;
显示的结果:
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
----- ---------- --------- ----- ----------- --------- --------- ------
7978 guo 10
7934 MILLER CLERK 7782 1982-1-23 1300.00 10
7902 FORD ANALYST 7566 1981-12-3 3000.00 20
7900 JAMES CLERK 7698 1981-12-3 950.00 30
7876 ADAMS CLERK 7788 1983-1-12 1100.00 20
7844 TURNER SALESMAN 7698 1981-9-8 1500.00 0.00 30
7839 KING PRESIDENT 1981-11-17 5000.00 10
7788 SCOTT ANALYST 7566 1982-12-9 3000.00 20
7782 CLARK MANAGER 7839 1981-6-9 2450.00 10
7698 BLAKE MANAGER 7839 1981-5-1 2850.00 30
7654 MARTIN SALESMAN 7698 1981-9-28 1250.00 1400.00 30
7566 JONES MANAGER 7839 1981-4-2 2975.00 20
7521 WARD SALESMAN 7698 1981-2-22 1250.00 500.00 30
7499 ALLEN SALESMAN 7698 1981-2-20 1600.00 300.00 30
7369 SMITH CLERK 7902 1980-12-17 800.00 20
15 rows selected
C、
按部门升序,员工编号降序查询
SQL> select empno,ename,job,mgr,hiredate,sal,comm,deptno from emp order by deptno asc,empno desc;
显示的结果:
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
----- ---------- --------- ----- ----------- --------- --------- ------
7978 guo 10
7934 MILLER CLERK 7782 1982-1-23 1300.00 10
7839 KING PRESIDENT 1981-11-17 5000.00 10
7782 CLARK MANAGER 7839 1981-6-9 2450.00 10
7902 FORD ANALYST 7566 1981-12-3 3000.00 20
7876 ADAMS CLERK 7788 1983-1-12 1100.00 20
7788 SCOTT ANALYST 7566 1982-12-9 3000.00 20
7566 JONES MANAGER 7839 1981-4-2 2975.00 20
7369 SMITH CLERK 7902 1980-12-17 800.00 20
7900 JAMES CLERK 7698 1981-12-3 950.00 30
7844 TURNER SALESMAN 7698 1981-9-8 1500.00 0.00 30
7698 BLAKE MANAGER 7839 1981-5-1 2850.00 30
7654 MARTIN SALESMAN 7698 1981-9-28 1250.00 1400.00 30
7521 WARD SALESMAN 7698 1981-2-22 1250.00 500.00 30
7499 ALLEN SALESMAN 7698 1981-2-20 1600.00 300.00 30
15 rows selected
本文出自 “Lucky!!” 博客,转载请与作者联系!