sql常用函数

Sql总结之Sql--常用函数

一、字符串函数是oracle使用最广泛的一种函数(表是参考sql查询介绍(二)中的表).
A、LOWER(参数):把参数变成小写
例如:查询名称为scott的员工信息 (不区分大小写的查询)
SQL> select empno,ename,job,mgr,hiredate,sal,comm,deptno from emp  where lower(ename)='scott';
输出的结果是:
EMPNO ENAME      JOB         MGR HIREDATE          SAL      COMM DEPTNO
----- ---------- --------- ----- ----------- --------- --------- ------
7788 SCOTT      ANALYST    7566 1982-12-9     3000.00               20

B、UPPER(参数):把参数变成大写
例如:查询名称为scott的员工信息 (不区分大小写的查询)
SQL> select empno,ename,job,mgr,hiredate,sal,comm,deptno from emp  where upper(ename)='scott';
输出的结果是:
EMPNO ENAME      JOB         MGR HIREDATE          SAL      COMM DEPTNO
----- ---------- --------- ----- ----------- --------- --------- ------
7788 SCOTT      ANALYST    7566 1982-12-9     3000.00               20

C、INITCAP(参数): 把参数的首字母大写
例如:查找员工编号是7788的信息,他的名字显示成首字母大写
SQL> select empno,initcap(ename),job,mgr,hiredate,sal,comm,deptno from emp where empno='7788';
显示结果是:
EMPNO INITCAP(ENAME) JOB         MGR HIREDATE          SAL      COMM DEPTNO
----- -------------- --------- ----- ----------- --------- --------- ------
7788 Scott          ANALYST    7566 1982-12-9     3000.00               20

D、LENGTH(参数): 返回参数的长度
例如:输出员工编号是7788的job的长度
SQL> select length(job) as "7788的job的length" from emp where empno=7788;
显示的结果如下:
  7788的job的length
-----------------
                7

E、CONCAT(参数1,参数2): 把参数1和参数2连接起来
例如:把员工7788的工资显示成:薪水+奖金
SQL> select empno,ename,job,mgr,hiredate,concat(sal,comm) as "工资",deptno from emp where empno='7788';
显示的结果如下:
EMPNO   ENAME    JOB     MGR   HIREDATE     工资              DEPTNO
-----   ------   ------  ----- -----------  ----------------  ------
7788    SCOTT    ANALYST 7566  1982-12-9    3000              20

F、SUBSTR(参数,开始,截取数目): 截取参数 
例如:输出员工编号是7788的job的后三位
SQL> select empno,ename,job,substr(job,length(job)-2,3) as "job的后三位" from emp where empno=7788; 或:
select empno,ename,job,substr(job,length(job)-2) as "job的后三位" from emp where empno=7788;显示的结果如下:
EMPNO ENAME      JOB       job的后三位
----- ---------- --------- ------------
7788 SCOTT      ANALYST   YST


G、INSTR(参数,字母): 返回字母首次出现的位置
例如:查找用户7788的名字中‘T’出现的位置
SQL> select empno,ename,instr(ename,'T') as "T首次出现的位置" from emp where empno=7788;
显示的结果如下:
EMPNO ENAME             T首次出现的位置
----- ---------- ---------------
7788 SCOTT                    4

H、LPAD(参数,长度,在前补齐参数字母):向左补齐
例如:查找用户是7788的薪水,如果不够4位的话,前面补0
SQL>  select empno,ename,sal,lpad(sal,6,'0') as "薪水是6位的格式" from emp where empno=7788;
显示的结果如下:
EMPNO ENAME            SAL 薪水是6位的格式
----- ---------- --------- ------------------------
7788 SCOTT        3000.00 003000

I、RPAD(参数,长度,在后补齐参数字母):向右补齐
例如:查找用户是7788的薪水,如果不够4位的话,前面补0
SQL>  select empno,ename,sal,rpad(sal,6,'0') as "薪水是6位的格式" from emp where empno=7788;
显示的结果如下:
EMPNO ENAME            SAL 薪水是6位的格式
----- ---------- --------- ------------------------
7788 SCOTT        3000.00 300000

J、TRIM([both||leadingtrailing||]字母 from 参数):从参数中去掉指定的字母
例如:查找员工编号是7788的去掉“T”后的员工姓名
SQL> select empno,ename,trim('T' from ename) as "去掉T后" from emp where empno=7788;

SQL> select empno,ename,trim(both 'T' from ename) as "去掉T后" from emp where empno=7788;
显示的结果如下:
EMPNO ENAME      去掉T后
----- ---------- ----------
7788 SCOTT      SCO

例如:查找员工编号是7788的去掉左边的“T”后的员工姓名
SQL> select empno,ename,trim(leading 'T' from ename) as "去掉T后" from emp where empno=7788;
或:
SQL> select empno,ename,ltrim(ename,'T') as "去掉T后" from emp where empno=7788;
显示的结果如下:
EMPNO ENAME      去掉T后
----- ---------- ----------
7788 SCOTT      SCOTT

例如:查找员工编号是7788的去掉右边的“T”后的员工姓名
SQL> select empno,ename,trim(trailing 'T' from ename) as "去掉T后" from emp where empno=7788;
或:
SQL> select empno,ename,rtrim(ename,'T') as "去掉T后" from emp where empno=7788;
显示的结果如下:
EMPNO ENAME      去掉T后
----- ---------- ----------
7788 SCOTT      SCO

K、REPLACE:(参数,参数[,参数]): 第一个参数操作数,第二是要查找的字符,第三个是替换的字符,如果没有第三个就删除查找的字符。
例如:把编号7788的员工姓名中的‘T’换成‘L’
SQL> select empno,ename,replace(ename,'T','L') as "替换后" from emp where empno=7788;
显示的结果如下:
EMPNO ENAME      替换后
----- ---------- ----------
7788 SCOTT      SCOLL



二、数字函数
A、ROUND(参数): 四舍五入
例如:查找12.89的四舍五入
SQL> select round(12.89) from dual;
显示的结果如下:
ROUND(12.89)
------------
          13

B、TRUNC(参数1[,参数2]): 截断 ,第一个参数是要操作的数,第二个参数可有可无,如果没有的话,截断的是整数部分,如果参数2是正数的话,截取小数点右边的‘参数2’个数,如果是负数的话,截取小数点左边的“参数2”个数
例如:采用默认的方式
SQL> select trunc(12.89) from dual;
显示的结果:
TRUNC(12.89)
------------
          12

例如:第二个参数是正数的时候
SQL> select trunc(12.89,1) from dual;
显示的结果:
TRUNC(12.89,1)
--------------
          12.8

例如:第二个参数是负数的时候
SQL> select trunc(12.89,-1) from dual;
显示的结果:
TRUNC(12.89,-1)
---------------
             10

C、MOD(参数1,参数2): 求参数1除以参数2后的余数
例如:100除以30的余数
SQL> select mod(100,30) from dual;
显示的结果:
MOD(100,30)
-----------
         10

D、ABS(参数):求参数的绝对值
例如:求-10 的绝对值
SQL> select abs(-10) from dual;
显示的结果:
  ABS(-10)
----------
        10
E、CEIL(参数):返回大于或等于参数的最小整数
SQL> select ceil(-10.23) from dual;
显示的结果:
CEIL(-10.23)
------------
         -10

F、FLOOR(参数):返回小于或等于参数的最大整数
例如:求-10.23的向下取整
SQL> select floor(-10.23) from dual;
显示的结果:
FLOOR(-10.23)
------------
         -11

G、SQRT(参数) :返回参数的平方根 负数无意义。
例如:求4的平方根
SQL> select sqrt(4) from dual;
显示的结果:
   SQRT(4)
----------
         2
日期函数:Oracle 中的日期型数据实际含有两个值: 日期和时间。默认的日期格式是 DD-MON-RR.日期时间函数用来返回当前系统的日期和时间、以及对日期和时间类型的数据进行处理运算。
A、sysdate();获取系统的当前日期
例如:
SQL> select sysdate from dual;
显示的结果是:
SYSDATE
-----------
2011-4-8 13
B、current_timestamp();获取当前的时间和日期值
例如:
SQL> select current_timestamp from dual;
显示的结果是:
CURRENT_TIMESTAMP
--------------------------------------------------------------------------------
08-4月 -11 01.38.27.546000 下午 +08:00

C、add_months(date,count):在指定的日期上增加count个月
例如:输出当前时间的加上3个月的后的时间
SQL> select add_months(sysdate,3) from dual;
显示结果:
ADD_MONTHS(SYSDATE,3)
---------------------
2011-7-8 13:43:06
D、last_day(date);返回日期date所在月的最后一天
例如:
SQL> select sysdate,last_day(sysdate) from dual;
显示结果:
SYSDATE     LAST_DAY(SYSDATE)
----------- -----------------
2011-4-8 13 2011-4-30 13:51:2
E、months_between(date1,dates);返回date1到date2之间间隔多少个月
例如:
SQL> select sysdate,months_between(sysdate,add_months(sysdate,3)) from dual;
显示结果:
SYSDATE     MONTHS_BETWEEN(SYSDATE,ADD_MON
----------- ------------------------------
2011-4-8 13                             -3
F、new_time(date,'this','other');将时间date从this时区转换成other时区
例如:
SQL> select sysdate,new_time(sysdate,'GMT','AST') from dual;
显示结果:
SYSDATE     NEW_TIME(SYSDATE,'GMT','AST')
----------- -----------------------------
2011-4-8 13 2011-4-8 9:
G、next_day(day,'week');返回指定日期或最后一的第一个星期几的日期,这里day为星期几
例如:
SQL> select sysdate,next_day(sysdate,'星期五') from dual;
显示结果:
SYSDATE     NEXT_DAY(SYSDATE,'星期五')
----------- --------------------------
2011-4-8 13 2011-4-15 13:53:10

H、round(参数,截取类型):日期的四舍五入
例如:四舍五入当前时间年
SQL> select sysdate,round(sysdate,'yyyy') from dual;
显示结果:
SYSDATE     ROUND(SYSDATE,'YYYY')
----------- ---------------------
2011-4-9 22 2011-1-1
例如:四舍五入当前时间月
SQL> select sysdate,round(sysdate,'mm') from dual;
显示结果:
SYSDATE     ROUND(SYSDATE,'MM')
----------- -------------------
2011-4-9 22 2011-4-1
例如:四舍五入当前时间日
SQL> select sysdate,round(sysdate,'dd') from dual;
显示的结果:
SYSDATE     ROUND(SYSDATE,'DD')
----------- -------------------
2011-4-9 22 2011-4-10
I、to_char(参数,转换的类型): 日期的截取
例如:截取当前时间的年
SQL> select sysdate,to_char(sysdate,'yyyy') from dual;

显示结果:
SYSDATE     TO_CHAR(SYSDATE,'YYYY')
----------- -----------------------
2011-4-9 22 2011
例如:截取当前时间的月
SQL> select sysdate,to_char(sysdate,'mm') from dual;
显示结果:
SYSDATE     TO_CHAR(SYSDATE,'MM')
----------- ---------------------
2011-4-9 22 04
例如:截取当前时间的日
SQL> select sysdate,to_char(sysdate,'dd') from dual;
显示结果:
SYSDATE     TO_CHAR(SYSDATE,'DD')
----------- ---------------------
2011-4-9 22 09

日期的数学运算:
在日期上加上或减去一个数字结果仍为日期。
两个日期相减返回日期之间相差的天数。
可以用数字除24来向日期中加上或减去小时
通用函数
这些函数适用于任何数据类型,同时也适用于空值:
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子句一定要与分组函数结合使用,否则没有意义。

求出每个部门的员工的数
SQL> select count(*) from emp group by deptno;
显示的结果:
  COUNT(*)
----------
         6
         5
         4
求每个部门的中员工的平均工资
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升序
查询员工信息按照部门的编号进行升序排列
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
查询员工信息按照部门的编号进行降序排列
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
按部门升序,员工编号降序查询
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

猜你喜欢

转载自yingwu007.iteye.com/blog/2241576