一、字符串函数是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
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。