SQL函数
SQL函数分单行函数和多行函数俩种
一、单行函数
单行函数是只操作数据库表中的一条记录并返回一条结果,这样的函数称为单行函数。若操作多条记录,则每条记录都会返回一个结果。
单行函数分5大类:字符函数、数字函数、日期函数、转换函数、通用函数。
dual是Oracle中的一个“伪表”
1、大小写控制函数(字符函数)
lower 全部转为小写
upper 全部转为大写
initcap 每个单词的首字母转为大写
select lower('DO WHATEVER YOU WANT'),upper('do whaterver you want'),initcap('do whaterver you want')
from dual;
--输出结果:
--do whatever you want DO WHATERVER YOU WANT Do Whaterver You Want
select * from employees
where lower(last_name) = 'king'
--lower(last_name)是先把last_name转为小写,再与king比较
2、字符控制函数(字符函数) concat 连接字符串
substr 截取字符串
length 获取字符串长度
select concat('hello','world'),substr('helloworld',2,4),length('helloworld')
from dual;
--输出结果:
--helloworld ello 10
--上面substr的意思是从第二个字符开始,截取后面的4个字符,如果不写会截取后面的全部
--注意:Oracle里下标都是从1开始的
instr 获取字符或字符串在某字符串中首次出现的下标位置
lpad 左边补齐,即右对齐
rpad 右边补齐,即左对齐
trim 去除首尾字符,中间出现的则不能去除
replace 替换字符
select instr('helloworld','l') from dual;
--输出结果:3
--如果查找的字符或字符串不存在则返回0
select last_name,lpad(salary,10,'0'),rpad(salary,10,'*')
from employees
--lpad是将工资右对齐,工资输出长度为10,不足10位的用*左边补齐
--rpad是将工资左对齐,工资输出长度为10,不足10位的用*右边补齐
select trim('h' from 'hhhehllohhworldhh') from dual;
--仅去除首尾的
--输出结果:ehllohhworld
select replace('abcdab','b','m') from dual;
--讲字符串中的b替换成m,替换的是字符串中所有存在的
--输出结果:amcdam
3、数字函数
round 四舍五入
trunc 截断,不管后面是什么都舍掉
mod 求余,如 mod(12, 5) 结果为2
select round(10532.92,2),round(10532.92),round(10532.92, -2),round(10532.92, -3) from dual;
--round(10532.92,2):保留两位小数
--round(10532.92):取整
--round(10532.92, -2):即十位上进行四舍五入
--round(10532.92, -3):即百位上进行四舍五入
--输出结果:10532.92 10533 10500 11000
select trunc(10532.92,2), trunc(10532.92, 0),trunc(10532.92, -1) from dual;
--输出结果:10532.92 10532 10530
select mod(12,5) from dual;
--输出结果:2
4、日期函数:
Oracle中的日期型数据实际含有俩个值:日期和时间。默认的日期格式是DD-MON-RR(天月年)
(1)日期的数学运算
* 日期与数字:在日期上加上或减去一个数字结果仍为日期
* 俩个日期相减返回日期之间相差的天数,但两个日期不能相加,日期可以和数字加减
* 可以用数字除24来向日期中加上或减去小时。
select sysdate-1,sysdate, sysdate+1,sysdate-1/24,sysdate-1/24/60 from dual;
--sysdate-1 昨天
--sysdate 今天
--sysdate+1 明天
--sysdate-1/24 当前时间减去一小时
--sysdate-1/24/60 当前时间减去一分钟
select empName, sysdate-hireDate from employees;
--hireDate是员工入职时间,
--sysdate-hireDate,两个日期相见计算天数
(2)日期函数
months_between:俩个日期相差的月数
add_months:向指定日期上加上或减去N个月
next_day:获取指定时间的下个星期N的日期时间
last_day:本月的最后一天
round:日期四舍五入
trunc:日期截断
select months_between(sysdate,hireDate) from employees
--会将sysdate减去hireDate,该函数返回的结果可以是正、负、0
select add_months(sysdate,2),add_months(sysdate,-3),next_day(sysdate,'星期六') from dual;
--next_day下个星期六的日期时间
select last_day(sysdate) from dual;
--查询本月的最后一天
select empName,hireDate from employees
where hireDate = last_day(hire-date)-1;
--查询是每个月倒数第二天入职的员工
select round(sysdate,'month'),round(sysdate,'mm'),trunc(sysdate,'hh')
from dual;
alter session set NLS_DATE_FORMAT='yyyy-mm-dd';
-- 修改当前session的日期格式
5、转换函数:
(1)隐式数据类型转换,Oracle自动完成varchar2或char与date或数字之间的转换
(2)显式数据类型转换
* to_char:日期或数字转换 成字符串
*to_date:字符串转换成日期
*to_number:字符串转换成数字
下面是to_char和to_number函数经常使用的几种格式:
select hireDate from employees
where to_char(hireDate,'yyyy-mm-dd') = '1994-7-6'--日期转换成字符串
or to_date('1994-7-7','yyyy-mm-dd') = hireDate--字符串转换成日期
select to_char(123456.89,'999,999,999.99'),to_char(123456.89,'L999,999,999.99'),to_number('$123,456.89','$999,999,999.99')
from dual;
--数字与字符串的转换
--L999,999,999.99:这个是数字转换的格式,可以用9或0
6、通用函数
这些函数适用于任何数据类型,同时也适用于空值:
NVL(expr1, expr2):滤空函数,不为Null返回本身的值,expr1为Null时返回expr2
NVL(expr1, expr2, expr3):不为Null返回expr2,expr1为Null时返回expr3
NULLIF(expr1, expr2):expr1等于expr2返回Null,不等返回expr1
COALESCE(expr1, expr2, ... exprn):若expr1为Null,则返回expr2,若expr2也为Null则返回exprn
select empName,salary*12*(1+nvl(commission,0))
from employees;
--若commission(奖金)为Null返回0,不为Null就是本身的值
select empName,nvl2(commission,commission*0.015,0.01)
from employees;
--若奖金不为Null返回commission*0.015,为Null返回0.01
select firstName,lastName,nullif(length(firstName),length(lastName))
from employees;
--如果firstName与lastName的长度相等返回Null,不等返回firstName的长度
select empName,coalesce(commission,salary,10)
from employees;
--如果commission为Null,返回salary,若salary也为Null则返回10
7、条件表达式
(1) CASE ... WHEN ... THEN ...ELSE ...END
select empName,deptId,
case deptId
when 10 then salary * 1.1
when 20 then salary * 1.2
else salary * 1.3
end new_salary
from employees
where deptId in(10,20,30);
--查询部门号为10,20,30的员工信息,若部门号为10,则打印其工资的1.1倍
--若部门号20,则打印其工资的1.2倍,若部门号30,则打印其工资的1.3倍
--PS:new_salary 是别名
(2)DECODE
select empName,deptId,
decode(deptId,
10,salary * 1.1,
20,salary * 1.2,
salary
) new_salary
from employees
where deptId in(10,20,30);
--deptId为10时工资为salary * 1.1,20号部门工资为salary * 1.2,30号部门为salary
二、多行函数
多行函数是操作数据库表中多条记录返回一条结果。不能在WHERE子句中使用组函数,可以在HAVING子句中使用组函数
1、组函数
(1)AVG(平均值)
(2)COUNT(总数)
COUNT(expr):返回expr不为空的记录总数
COUNT(DISTINCT expr):返回expr非空且不重复的记录总数
(3)MAX(最大值)
(4)MIN(最小值)
(5)SUM(总和)
组函数忽略空值,可以使用NVL函数,使组函数无法忽略空值
max和min里的参数类型可以是number、varchar、date
avg和sum里的参数类型只能是number
组函数计算的都是非空的