Sql总结常用函数---超详细

  Sql总结--常用函数

 我花了好长时间总结的oracle常用的函数,超详细,特别适合初学者。闲话少说,来看“真本事”hang!!!                                                          

一、字符串函数是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(参数) 返回参数的长度

例如:输出员工编号是7788job的长度

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.日期时间函数用来返回当前系统的日期和时间、以及对日期和时间类型的数据进行处理运算。

Asysdate();获取系统的当前日期

例如:

SQL> select sysdate from dual;

显示的结果是:

SYSDATE

-----------

2011-4-8 13

Bcurrent_timestamp();获取当前的时间和日期值

例如:

SQL> select current_timestamp from dual;

显示的结果是:

CURRENT_TIMESTAMP

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

08-4月 -11 01.38.27.546000 下午 +08:00

Cadd_months(date,count):在指定的日期上增加count个月

例如:输出当前时间的加上3个月的后的时间

SQL> select add_months(sysdate,3) from dual;

显示结果:

ADD_MONTHS(SYSDATE,3)

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

2011-7-8 13:43:06

Dlast_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

Emonths_between(date1,dates);返回date1date2之间间隔多少个月

例如:

SQL> select sysdate,months_between(sysdate,add_months(sysdate,3)) from dual;

显示结果:

SYSDATE     MONTHS_BETWEEN(SYSDATE,ADD_MON

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

2011-4-8 13                             -3

Fnew_time(date,'this','other');将时间datethis时区转换成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:

Gnext_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

Hround(参数,截取类型):日期的四舍五入

例如:四舍五入当前时间年

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

Ito_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来向日期中加上或减去小时

四、通用函数

这些函数适用于任何数据类型,同时也适用于空值: 

ANVL (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

BNVL2 (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

CNULLIF (expr1, expr2)expr1expr2相等返回NULL,不等返回expr1 

例如:查看员工7788的薪水和奖金,如果薪水和奖金相等的话返回null,否则返回工资

SQL> select sal,comm,nullif(sal,comm) from emp where empno=7788;

显示结果: 

      SAL      COMM NULLIF(SAL,COMM)

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

  3000.00                       3000

DCOALESCE (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

五、组合函数:

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

AAVG(字段名):求该字段的平均值

例如:求出emp表中工资的平均值

SQL> select avg(nvl(sal,0)) from emp;

显示结果:

AVG(NVL(SAL,0))

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

           1935

BCOUNT(字段名):求该字段中的总记录

例如:查询emp表中有几条记录 

SQL> select count(*) from emp;

显示结果:

  COUNT(*)

----------

        15

CMAX(字段名):求该字段的最大值

例如:求出emp表中的最高的工资的员工

SQL> select max(nvl(sal,0)) from emp;

显示结果: 

MAX(NVL(SAL,0))

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

           5000

DMIN(字段名):求该字段的最小值

例如:求出emp表中的最低的工资的员工

SQL> select min(nvl(sal,0)) from emp;

显示结果:

MIN(NVL(SAL,0))

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

              0

ESUM(字段名):求该字段的

例如:求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 columngroup_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 子句排序 :ASCascend升序 ;DESCdescend降序 。默认的是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

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值