您的位置:首页 > 数据库 > Oracle

oracle常用函数(二)

2011-04-10 17:41 411 查看
四、通用函数这些函数适用于任何数据类型,同时也适用于空值: A、NVL (expr1, expr2):如果expr1为空的话,显示expr2例如:查看emp如奖金comm为空的话,替换成0SQL> 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 selectedB、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 1750C、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 3000D、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))--------------- 1935B、COUNT(字段名):求该字段中的总记录例如:查询emp表中有几条记录 SQL> select count(*) from emp;显示结果: COUNT(*)---------- 15C、MAX(字段名):求该字段的最大值例如:求出emp表中的最高的工资的员工SQL> select max(nvl(sal,0)) from emp;显示结果: MAX(NVL(SAL,0))--------------- 5000D、MIN(字段名):求该字段的最小值例如:求出emp表中的最低的工资的员工SQL> select min(nvl(sal,0)) from emp;显示结果:MIN(NVL(SAL,0))--------------- 0E、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 42、求每个部门的中员工的平均工资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 selectedB、查询员工信息按照部门的编号进行降序排列 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 selectedC、按部门升序,员工编号降序查询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!!” 博客,转载请与作者联系!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: