oracle常用函数(二)

四、 通用函数
这些函数适用于任何数据类型,同时也适用于空值:  
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!!” 博客,转载请与作者联系!

你可能感兴趣的:(oracle,函数,职场,休闲)