一、字符函数
字符串相关基本函数
1. upper(n)(返回字符串的大写形式)
SELECT * FROM student WHERE name=UPPER('smith') ;
select upper(name) from student ;
2. Lower(n)(返回字符串的小写形式)
SELECT lower('ABCDE') FROM student;
SELECT LOWER(NAME) FROM student ;
3. Length(n)(返回字符或者字符串的长度,长度包括空格)
Select length(ename) from emp;
4. Trim
trim(' Mr Smith ') 过滤首尾空格 trim() Mr Smith
Lpad 和 Rpad 填充函数
1.Lpad (chr1,n,[chr2]) 左填充
描述:在chr1左边填充字符chr2,使得字符总长度为n。chr2可选,默认为空格;当chr1字符串长度大于n时,则从左边截取chr1的n个字符显示。
SELECT LPAD(NAME,15,'*') FROM student
*****Smith
2.Rpad(chr1,n,chr2)右填充
描述:在chr1右边填充chr2,使返回字符串长度为n..当chr1长度大于n时,返回左端n个字符。参考LPAD()函数。
select rpad(name,15,'*') from student
Smith*****
例1:
SELECT LPAD(NAME,15,'*') FROM student
例2:
select rpad(name,15,'*') from student
Concat 拼接字符串函数
1. Concat(m,n)(连接m和n)
SELECT CONCAT(NAME,"111",chinese) FROM student
将name列,‘111‘,chinese列拼接显示。
SELECT CONCAT(NAME,chinese) FROM student
将name列,chinese列拼接显示。
SELECT CONCAT(NAME,age,chinese) FROM student
将name列,age列,chinese列拼接显示。
Substr 截取字符串函数
1.Substr(chr ,m[,n])
描述:截取字符串
SELECT SUBSTR('abcd',1) FROM student
截取’abcd’字符串,从1开始截取。abcd
SELECT SUBSTR('abcd',1,1) FROM student
截取’abcd’字符串,从1开始截取,截取1个字符。a
SELECT SUBSTR('abcd',1,2) FROM student
截取’abcd’字符串,从1开始截取,截取2个字符。ab
SELECT SUBSTR('abcd',1,3) FROM student -
截取’abcd’字符串,从1开始截取,截取3个字符。abc
Replace 替换字符串函数
1. Replace(chr,search_string,[,replacement_string]) 替换字符串
SELECT REPLACE(NAME,'ac','b') AS NAME FROM student
将name列中的'ac'替换'b'
SELECT REPLACE(NAME,'ac','') AS NAME FROM student
将name列中的'ac'替换空字符串。
Instr 函数 (替换like函数)
instr(field, str) 函数,
第一个参数 field 是字段,
第二个参数 str 是要查询的串,返回串 str 的位置,没找到就是0
mysql 进行模糊查询时,可使用内部函数 instr,替代传统的 like 方式,并且速度更快。
方式一:
SELECT * FROM student WHERE INSTR(NAME,'aa')
方式二:
SELECT * FROM student WHERE INSTR(NAME,'aa')>0
查看姓名中含有aa的人名。
SELECT INSTR(NAME,'aa') FROM student
查看aa在姓名列中的索引值。
二、数值函数
1.MOD(n1,n2) 返回n1除n2的余数,如果n2=0则返回n1的值。
select mod(24,5) from dual;
2.ROUND(n1[,n2]) 返回四舍五入小数点右边n2位后n1的值,n2缺省值为0,如果n2为负数就舍入到小数点左边相应的位上(虽然oracle documents上提到n2的值必须为整数,事实上执行时此处的判断并不严谨,即使n2为非整数,它也会自动将n2取整后做处理,但是我文档中其它提到必须为整的地方需要特别注意,如果不为整执行时会报错的)。
select round(412,-2) from dual;
例子:
SELECT ABS(-12); -- 取绝对值
SELECT BIN(-12); -- 十进制转二进制
SELECT CEIL(10.34); -- 向上取整 11
SELECT FLOOR(10.54);-- 向下取整 10
SELECT FORMAT(10.5459,2); -- 四舍五入保留2位小数
三、日期函数
3.1 获取当前时间
CURRENT_DATE () 获取当前日期
eg: SELECT CURRENT_DATE(); -- 2020-02-02
CURRENT_TIME() 获取当前时间
eg: SELECT CURRENT_TIME(); -- 21:07:05
CURRENT_TIMESTAMP () 获取当前时间戳
eg: SELECT CURRENT_TIMESTAMP (); -- 2020-02-02 21:07:05
NOW ( ) 获取当前时间戳
eg: SELECT NOW (); -- 2020-02-02 21:07:05
YEAR|Month|DAY|DATE (datetime ) 年月日
eg:
SELECT YEAR(NOW()); --获取年份
SELECT MONTH(NOW()); --获取月份
SELECT DAY(NOW()); --获取日份
SELECT DATE(NOW()); --获取日期
3.2 时间计算相关
1)在data2上加上一个时间
ADDTIME (date2 ,time_interval ) 将time_interval加到date2 。
eg:
SELECT ADDTIME(b,'02:20:00') FROM student
在时间上推迟两个小时20分钟。
2)在data2上加上一个年份或者月、日、时、分、秒
DATE_ADD (date2 , INTERVAL d_value d_type )
d_value :
1,2,4...
d_type:
YEAR / MONTH / DAY / HOUR / SECOND /MINUTE
eg:
SELECT b2 FROM student
--2020-02-02 00:00:00
SELECT DATE_ADD(b2,INTERVAL 2 YEAR) FROM student
--2022-02-02 00:00:00
--在原时间戳上增加2年
SELECT DATE_ADD(b2,INTERVAL 2 MONTH) FROM student
--2020-04-02 00:00:00
--在原时间戳上增加2月
SELECT DATE_ADD(b2,INTERVAL 2 DAY) FROM student
--2020-02-04 00:00:00
--在原时间戳上增加2日
SELECT DATE_ADD(b2,INTERVAL 2 HOUR) FROM student
--2020-02-02 02:00:00
--在原时间戳上增加2小时
3)在data2上减去一个年份或者月、日、时、分、秒
DATE_SUB (date2 , INTERVAL d_value d_type ) 在date2上减去一个时间
eg:
SELECT b2 FROM student
--2020-04-04 00:00:00
SELECT DATE_SUB (b2,INTERVAL 2 YEAR) FROM student
--2018-04-04 00:00:00
--在原时间戳上减少2年
SELECT DATE_SUB (b2,INTERVAL 2 MONTH) FROM student
--2020-02-04 00:00:00
--在原时间戳上减少2月
SELECT DATE_SUB (b2,INTERVAL 2 DAY) FROM student
--2020-04-02 00:00:00
--在原时间戳上减少2日
4)计算两个日期的天数差,得到天数。
DATEDIFF (date1 ,date2 ) 两个日期差
eg:
select datediff(b,b2) from student -- b-b2 24天
5)获取本月的最后一天
Last_day(b)本月最后一天
eg:
SELECT LAST_DAY(b) FROM student --2020-02-29
例子:
SELECT ADDTIME(b,'02:20:00') FROM student
在时间上推迟两个小时20分钟。
四、通用函数
CASE 表达式
1.当colume 与condition 条件相等时结果为result
case colume
when condition then result
when condition then result
when condition then result
else result
end
2.当满足某一条件时,执行某一result
case
when condition then result
when condition then result
when condition then result
else result
end
例1:
当语文成绩为0时,显示不及格;当语文成绩为1时,显示优秀。
SELECT NAME,
CASE chinese
WHEN 1 THEN '优秀'
WHEN 0 THEN '不及格'
ELSE '零蛋'
END AS 语文,
chinese
FROM student
例2:
当英语成绩为0时,显示零蛋;
当50>英语成绩>=20,显示不及格。
当50<=英语成绩,显示优秀。
SELECT NAME,
CASE
WHEN english>=20 AND english < 50 THEN '不及格'
WHEN english>=50 THEN '优秀'
ELSE '零蛋'
END AS 英语,
english
FROM student
coalesce() 函数
coalesce(column ,str ) 判断字段是否为null,如果null,显示str。
例子:
SELECT COALESCE(b,'test') FROM student
单行函数嵌套
select empno, lpad(initcap(trim(ename)),10,' ') name, job, sal from emp;
五、不支持mysql,只支持oracle
1. Initcap (n)(首字母大写)
Select initcap(name) from student;
注意:mysql不支持。oracle支持。
+++ 转换函数 [不支持mysql,只支持oracle]
1.To_char
select to_char(sysdate,'yyyy') from dual;
select to_char(sysdate,'fmyyyy-mm-dd') fr om dual;
select to_char(sal,'L999,999,999') from emp;
select to_char(sysdate,’D’) from dual;//返回星期
2.To_number
select to_number('13')+to_number('14') from dual;
3.To_date
Select to_date(„20090210‟,‟yyyyMMdd‟) from dual;
+++ 日期函数
1.Months_between(m,n) [不支持mysql,只支持oracle]
日期m和n相差的月数
select months_between(sysdate,hiredate) from emp;
2. Add_months(m,n) [不支持mysql,只支持oracle]
当前日期m后推n个月 ,用于从一个日期值增加或减少一些月份
select add_months(sysdate,1) from dual;
3.Next_day(d, day_of_week) [不支持mysql,只支持oracle]
返回由"day_of_week"命名的,在变量"d"指定的日期之后的第一个工作日的日期。参数"day_of_week"必须为该星期中的某一天。
select next_day(sysdate,'星期一') from dual;
3.TRUNC(n1[,n2] [不支持mysql,只支持oracle]
详细:返回截尾到n2位小数的n1的值,n2缺省设置为0,当n2为缺省设置时会将n1截尾为整数,如果n2为负值,就截尾在小数点左边相应的位上
select trunc (412.13,-2) from dual;
1.NVL(expr1,expr2) [不支持mysql,只支持oracle]
如果第一个参数为空那么显示第二个参数的值,如果第一个参数的值不为空,则显示第一个参数本来的值。
select nvl(comm,0) from emp;
2.NULLIF()
如果表达式exp1 与exp2 的值相等则返回null ,否则 返回exp1 的值
3.NVL2(expr1,expr2, expr3) [不支持mysql,只支持oracle]
如果该函数的第一个参数为空那么显示第三个参数的值,如果第一个参数的值不为空,则显示第二个参数的值。
select empno, ename, sal, comm, nvl2(comm, sal+comm, sal) total from emp;
4.NVL2(expr1,expr2, expr3) [不支持mysql,只支持oracle]
如果该函数的第一个参数为空那么显示第三个参数的值,如果第一个参数的值不为空,则显示第二个
select empno, ename, sal, comm, coalesce(sal+comm, sal, 0)总收入 from emp;
+++ DECODE() 函数
在ORACLE数据库里decode函数实现的功能,于MySQL数据库里可以使用case when函数来替代;
MySQL数据库的decode函数是解密函数,它是加密函数encode的反函数,与ORACLE数据库里
decode函数实现的功能完全不同。
decode()函数在mysql中是解密函数,它是加密函数encode的反函数。
decode()函数在oracle中的功能相当于MySQL数据库里的case when函数。
和case 表达式类似,decode() 函数也用于实现多路分支结构
select empno, ename, sal,
decode(deptno, 10, '财务部', 20 , '研发部', 30, '销售部', '未知部门') 部门 from emp;
六、练习
练习
1.找出每个月倒数第三天受雇的员工(如:2009-5-29 )
Select * from emp where last_day(h redate)-2=hiredate;
select t.ename,t.hiredate from emp t where t.hiredate=last_day(t.hiredate)-2;
2.找出25 年前雇的员工
Select * from emp where hiredate<=add_months(sysdate,-25*12);
select t.ename,t.hiredate from emp t where t.hiredate<add_months(sysdate,12*25)
3.所有员工名字前加上Dear ,并且名字首字母大写
select 'Dear ' || initcap(ename) from emp;
select lpad(t.ename,12,'Dear ') from emp t
4.找出姓名为5 个字母的员工
select * from emp where length(ename)=5;
select t.ename from emp t where length(t.ename)=5
5.找出姓名中不带R 这个字母的员工
select * from emp where ename not like '%R%';
6.显示所有员工的姓名的第一个字
select substr(ename,0,1) from emp;
select substr(t.ename,1,1) from emp t