initcap:单词首字母大写函数。
substr:取字串函数,得到一个字符串。
DUAL表
DUAL表的所有者是SYS,可以被所有用户使用。DUAL表包含一个字段DUMMY,只有一条记录,值为X。DUAL表非常有用,当你需要数据库返回一个并不存在于任何表中的常数、伪字段或表达式。
SELECT SYSDATE FROM DUAL;
SELECT USER FROM DUAL;
SELECT DBMS_RANDOM.RANDOM FROM DUAL;
SELECT DBMS_RANDOM.VALUE FROM DUAL;
在scott_conn下:
show user;————得user为scott用户
select user from dual;————得c##SCOTT
数学函数
例:SELECT ROUND(45.923,2),ROUND(45.923,0),ROUND(45.923 , -1) FROM dual;
SELECT TRUNC(45.923,2),TRUNC(45.923),TRUNC(45.923,-1) FROM dual;
Select DBMS_RANDOM.RANDOM from dual;
Select DBMS_RANDOM.value(1,20) from dual;
四舍五入函数:
select round(2345.678,1) from dual;
得:2345.7
select round(2345.678,0) from dual;
得:2346.
第二个参数默认是0,可以省略。
select round(2345.678,-1) from dual;
得:2350
第二个参数默认是复数表示小数点前面的进行四舍五入
select round(2345.678,-2) from dual;
得:2300
截断函数:(不进行四舍五入)
select trunc(2345.678,1) from dual;
得:2345.6
向上取整——天花板函数
select ceil(5.7) from dual;
得:6
select ceil(-5.7) from dual;
得:-5
向下取整——地板函数
select floor(5.7) from dual;
得:5
select floor(-5.7) from dual;
得:-6
生成随机数函数
select dbms_round.random from dual;
说明:
- dbms_round是一个包名
- 这种方式生成的是一个特别大的随机整数
select dbms_random.value(1,20) from dual;
生成一个[1,20)之间的随机小数
如果想取整数怎么办?
select round(dbms_random.value(1,20)) from dual;
这种取整方式的结果在[1,20]内
select trunc(dbms_random.value(1,20)) from dual;
这种取整方式的结果在[1,20)内
平方、平方根函数
求2的三次方:
select power(2,3) from dual;
得:8
求9的平方根:
select sqrt(9) from dual;
得:3
取余函数:mod函数
求7除以3的余数:
select mod(7,3) from dual;
得:1
字符串函数
截取字符串函数:substr函数
Oracle中的起始位置是1,而不是从0开始的。
select substr(‘abcdefg’,3) from dual;
得:cdefg
说明:只有两个参数的时候,第二个参数表示从第几位开始取字符串,一直取到末尾
select substr(‘abcdefg’,3,3) from dual;
得:cde
说明:有三个参数的时候,第二个参数表示从第几位开始取字符串,第三个参数表示从左往右取几位。
select substr(‘abcdefg’,-3,2) from dual;
得:ef
说明:第二个参数是负数的时候,从字符串的右边往左边数3个位置的地方开始查找,第三个参数表示从左往右取几位。
例:在字符串“MessageBox”中从第8个位置截取长度为3的字符串:
select substr(‘MessageBox’,8,3) from dual;
得:Box
查找字符/字符串函数:instr函数
查找不到就返回0值。
select instr(‘hello world’,‘l’) from dual;
得:3
说明:只有两个参数的时候,第二个参数表示从前往后所需要查找的字符,最终返回的是查找到的位置。
select instr(‘hello world’,‘l’,4) from dual;
得:4
说明有三个参数的时候,第二个参数表示从前往后所需要查找的字符,第三个参数表示从第几位开始查找。
select instr(‘hello world’,‘l’,5) from dual;
得:10
因为是从第5位开始查找,找到的第一个l就是位置10处的。
select instr(‘hello world’,‘l’,2,2) from dual;
当有四个参数的时候,第二个参数表示从前往后所需要查找的字符,第三个参数表示从第几位开始查找,第四个参数表示要查找字符第几次出现的位置。
这个就是表示从第2位开始找,找l第2次出现的位置。
select instr(‘hello world’,‘l’,-2,3) from dual;
得:3
当第三个参数是负数的时候,从右往左找,从右边往左数第2个的位置开始向左查询,但是返回的位数还是从左往右的位置。
删除字符/字符串函数:ltrim函数
select ltrim (‘cccabw’,‘c’) from dual;
得:abw
从左往右,把左边的c删除,有c出现就一直删,一直删到第一个字符开始不是c为止。
select ltrim (‘caccb’,‘c’) from dual;
得:accb
select ltrim (‘caccabw’,‘cac’) from dual;
得:bw
从左往右,删除第二个参数中含有的所有的字符,比如这个就是要删除含有a和c的,那么删除c与a,一直删到第一个字符开始不是c也不是a为止。
select ltrim (‘caccabw’,‘cab’) from dual;
得:w
类似:rtrim是从右往左删除的函数,和ltrim同样的使用规则。
如果第二个参数空缺的话,表示删除空格:
select ltrim (’ caccabw’) from dual;
得:caccabw(删除左侧空格后得到的结果。)
删除右侧的空格用rtrim。
首字母大写其他字母小写函数:initcap函数
将emp表中所有雇员的姓名首字母大写:
select initcap(ename) from emp;
填充函数:lpad函数
在“my book”的左侧填充’th’,使字符串长度为10:
select lpad(‘my book’,10) from dual;
这种是只填充空格,使得字符串长度为10。
select lpad(‘my book’,10,‘th’) from dual;(✅)
得:thtmy book
翻译函数:translate函数
将字符串’abcd’ 按序翻译成‘1234’,以此翻译’jack’:
select translate(‘jack’,‘abcd’,‘1234’) from dual;
得j13k
注意:第二个参数和第三个参数是翻译的对应规则。
字符转ASCII码值函数:ascii函数
分别求得“Z”,“H”,“D”和空格的ASCII值:
select ascii(‘Z’) from dual;
select ascii(‘H’) from dual;
select ascii(‘D’) from dual;
select ascii(’ ') from dual;
这里面有一个空格,得32
ASCII码值转字符函数:chr函数
将ASCII值为122的转换为对应的字符:
select chr(122) from dual;
得:p
字符/字符串替换函数:replace函数
把字符串"Bad Luck Bad Girl"中的’Bad’字符串用’Good’替换:
select replace(‘Bad Luck Bad Girl’,‘Bad’,‘Good’) from dual;
求字符串长度函数:length函数
求字符串“student”的长度:
select length(‘student’) from dual;
得:7
连接字符串函数:contact函数
连接“MY”和“book”两个字符串
select concat(‘my’,‘book’) from dual;
得:mybook
日期函数
显示当前的系统日期:select sysdate from emp;
例:对于所有工作年限少于70个月的员工,输出员工号、雇佣日期、工作年限(月)、6个月试用期结束的时间、开始上班以后的第一个星期五。
SELECT empno, hiredate,MONTHS_BETWEEN(SYSDATE, hiredate),ADD_MONTHS(hiredate, 6),NEXT_DAY(hiredate, ‘星期五’) FROM emp WHERE MONTH_BETWEEN(SYSDATE, hiredate)<70;
说明一下:
NEXT_DAY()函数查询下一个星期几,周日代表的是1,周一代表的是2
比如现在是周一,要查找下一个星期三,就是查找两天后的周三。如果现在是周四,要查找下一个周三,那么就是查找下个周的周三。
获取当前日期还有一个方法:
select current_date from dual;
求月份间隔函数:months_between()函数
查询emp表中雇员员工的工作年限(月份):
select months_between(sysdate,hiredate) from emp;
注意:scott表中有一个错误,现在需要修改:
update emp set hiredate = ‘19-4月-1987’ where empno=7788;
增加月份函数:add_months()函数
在今天的基础上,查找增加五个月后的日期:
select add_months(sysdate,5) from dual;
查询下一个星期几函数:next_day()函数
在今天的基础上查询下一个周三的日期:
select next_day(sysdate,4) from dual;
select next_day(sysdate,‘星期三’) from dual;
提取年月日函数:extract函数
提取年份:
select extract(year from sysdate) from dual;
提取月份:
select extract(month from sysdate) from dual;
提取日份:
select extract(day from sysdate) from dual;
类型转换
日期类型格式元素
例:
SELECT empno,TO_CHAR(hiredate,’MM/YY’) FROM emp WHERE ename = ‘BLAKE’;
SELECT TO_CHAR(sal, ‘$99,999’) SALARY FROM emp WHERE ename = ‘SCOTT’;
SELECT EXTRACT(MONTH FROM DATE ‘2003-08-22’) FROM dual;
将数值或日期转换为字符串函数:to_char()函数
查询员工的雇佣日期:
select ename,hiredate from emp;
这样显示的日期格式并不是很好看.
select ename,to_char(hiredate,‘yyyy-mm-dd’) from emp;
美观了,但是没有文字,也不好
select ename,to_char(hiredate,‘yy"年"mm"月"dd"日"’) from emp;
这次好看了,完美
汉字要加双引号
将字符串转换为日期函数:to_date()函数
插入日期:
1.
insert into emp(empno,hiredate) values(111,to_date(‘89-09-23’,‘yy-mm-dd’));
这种插入方式太麻烦
2. alter session set nls_date_format = ‘yy-mm-dd’;
insert into emp(empno,hiredate) values(112,‘84-11-10’);
nls_date_format表示设置本地语言支持的格式
返回指定日期所在月份的最后一天函数:last_day()函数
last_day(time):返回指定日期所在月份的最后一天;
查询当前月份的最后一天:
select last_day(sysdate) from dual;
查询某天所在月份的最后一天:
select last_day(to_date(‘1992-10-09’,‘yyyy-mm-dd’)) from dual;
查询每一个月最后一天过生日的同学:
select * from stu where last_day(birthday) = birthday;
空函数:nvl函数、nvl2函数、nvlif函数(暂不作说明,自己网络找资料)
空值的特点:
- 空值最大
- 空值和其他数值运算还空值,空值与字符串连接还是字符串。
查询员工每个月的总收入(工资+奖金):
select ename,sal+comm from emp;
出现了很多null值,因为很多人没有奖金comm,故用nvl或nvl2函数。
select ename,nvl(sal+comm,sal) from emp;nvl:第一个参数值为null就显示第二个参数值,不为null就显示第一个参数值。
select ename,nvl2(comm,sal+comm,sal) from emp;
comm是用来判断的,comm为null则显示第二个参数值,comm不为null就显示第一个参数值。
练习题:加强巩固
--1. 显示满40年服务年限的员工的姓名和雇佣日期
select ename,hiredate from emp where months_between(sysdate,hiredate)/12>=40;
--2. 以年月日的方式显示所有员工的服务年限
select ename,hiredate,trunc(months_between(sysdate,hiredate)/12)||'年'||trunc(mod(months_between(sysdate,hiredate),12))||'月'||round(mod((mod(months_between(sysdate,hiredate),12)*30),30))||'天'年限 from emp;
select ename,trunc(months_between(sysdate,hiredate)/12)||'年'||trunc(mod((months_between(sysdate,hiredate)),12))||'月'||trunc(sysdate-add_months(hiredate,months_between(sysdate,hiredate)))||'天' 年限 from emp;
--3. 使用函数显示姓名字段的任何位置包含’A’的所有员工的姓名
select ename from emp where instr(ename,'A')<>0;
--4. 对于每个员工,显示其加入公司的天数
select ename,(sysdate-hiredate) days from emp;
--5. 找出在任意年份2月受聘的所有员工
select * from emp where extract(month from hiredate)=2;
select * from emp where to_char(hiredate,'MM')=2;
--6. 显示所有员工的姓名,用a代替A
select translate(ename,'A','a') from emp;
--7. 显示所有员工姓名的前三个字符
select substr(ename,1,3)from emp;
--8. 以首字母大写的方式显示员工的姓名
select initcap(ename) from emp;
--9. 显示不带有’R’的员工姓名
select ename from emp where instr(ename,'R')=0;
--10. 找出各月倒数第3天受雇的所有员工
select ename,hiredate from emp where hiredate=last_day(hiredate)-2;
--11. 统计每年雇佣的人数
select extract(year from hiredate) year,count(*) from emp group by extract(year from hiredate);
select to_char(hiredate,'yyyy'),count(*) from emp group by to_char(hiredate,'yyyy');