函数
--单行函数
--函数: 能够接收参数,完成某些计算,并且返回结果
--测试表: dual
select * from dual
--字符串函数
--大小写转换函数
--将 ‘I Love sql‘ 转换成大写、小写、首字母大写
select UPPER(‘I Love sql‘),lower(‘I Love sql‘),initcap(‘I Love sql‘) from dual
--字符串拼接
-- 将 ‘I‘,‘Love‘,‘sql‘连接到一起
select ‘I ‘||‘Love ‘||‘sql‘ from dual
select concat (concat(‘I ‘,‘Love ‘),‘sql‘) from dual
--截取函数: substr(源字符串,m[,n])
--m : 从源字符串的第几位开始截取
--n : 从截取开始位置截取几位
select substr(‘I Love sql‘,3,4) from dual
select substr(‘I Love sql‘,-5) from dual
select substr(‘I Love sql‘,-5,3) from dual
--查询emp表中职位是以‘MAN‘结尾的员工信息
select * from emp where substr(job,-3) = ‘MAN‘
--查询首字母是‘K‘的员工信息
select * from emp where substr(ename,1,1) = ‘K‘
--字符串长度函数: length(p1)
--返回‘I Love sql‘长度
select length(‘I Love sql‘) from dual
--返回子串在源字符串中的位置 : instr(源字符串,子串[ , m , [n] ] )
--m: 从第几位开始查起
--n: 第几次出现的下标位置
select instr(‘I Love sql‘,‘L‘) from dual
select instr(‘I Love sqL‘,‘L‘,4,1) from dual
select instr(‘I Love sqL‘,‘L‘,1,2) from dual
instr(‘192.168.101.123‘)
--查询emp表中 员工名字至少含有一个‘E‘的员工
select * from emp
where instr(ename,‘E‘,1,1) != 0
--填充函数: LPAD() - 左侧填充、RPAD() - 右侧填充
--LPAD(源字符串,m,子串)、RPAD(源字符串,m,子串)
select lpad(‘abc‘,10,‘*‘) from dual
--查询员工的工资,1000,显示一个* ,2000,显示两个*
select ename, lpad(‘*‘,sal/1000,‘*‘)
from emp
--去掉函数: trim(字符 from 源字符串)
--将源字符串头尾两端的字符去掉
select trim(‘L‘ from ‘LEVEL‘) from dual --默认both
select trim(leading‘L‘ from ‘LEVEL‘) from dual
select trim(trailing‘L‘ from ‘LEVEL‘) from dual
select trim(both‘L‘ from ‘LEVEL‘) from dual
--替换函数
--replace(源字符串,查找字符串,替换字符串)
--将源字符串中的所有查找的字符串替换成替换字符串
--将‘I Love sql‘中的‘sql‘替换成oracle
select replace(‘I Love sql‘,‘ql‘,‘oracle‘) from dual
--数字函数
--四舍五入 : round(数据源,位数)
select round(657.36,1) from dual
select round(657.36,0) from dual
select round(657.36,-1) from dual
--截断函数 : trunc(数据源,位数)
select trunc(657.32,1) from dual
select trunc(657.32,-1) from dual
--取余 mod(m,n)
select mod(10,3) from dual
--绝对值 abs(m)
select abs(-5.2) from dual
--日期函数
--sysdate : 返回当前系统的时间,没有参数,不需要括号
select sysdate from dual
--months_between(p1,p2) 返回两个日期之前相差多少个月
--查询emp表中所有员工工作了多少个月
select months_between(sysdate,hiredate) from emp
select months_between(hiredate,sysdate) from emp
--计算自己的年龄
select trunc(months_between(sysdate,‘10-2月-1987‘)/12,2)
from dual
--add_months(指定的日期,n) 返回指定日期加 n个月的日期
--计算emp表中每一个员工转正日期
select add_months(hiredate,3) from emp
--注意: 如果给定日期是某个月的最后一天,其结果也是这个月的最后一天
--返回给定日期后七天内的星期几: next_day(给定日期,‘星期几‘)
select next_day(sysdate,‘星期二‘) from dual
--返回给定日期的当月的最后一天
--last_day(给定日期)
select last_day(sysdate) from dual
类型转换
--隐式转换
select * from emp where deptno = ‘10‘
select * from emp where deptno = 10
--显式转换
--可以确保sql语句的正确性
--利用oracle 给提供的转换函数,把对应的数据类型进行转换
--to_char(日期|数字, ‘fmt‘) 字符串转换函数
--查询当前系统的日期,格式2016-03-22,星期二
select to_char(sysdate,‘yyyy-mm-dd dy‘) from dual
--查询当前系统的时间,格式 :时间格式 时:分:秒
select to_char(sysdate,‘yyyy-mm-dd hh24:mi:ss dy ‘) from dual
--查询当前系统时间
--格式: xxxx年xx月xx日
select to_char(sysdate,‘yyyy"年"mm"月"dd"日"‘) from dual
--数字转换成字符串
--查询员工表中King的工资,格式要求以人民币的格式进行显示
select to_char(sal,‘L99,999.99‘) from emp where ename = ‘KING‘
--查询emp表中在1980年12月17日入职的员工
select * from emp where hiredate = to_date(‘1980-12-17‘,‘yyyy-mm-dd‘)
select to_number(‘123‘) from dual
--空值转换函数
--1、nvl(p1,p2) 如果p1不为null, 则返回p1, 否则返回p2
--查询员工表中,员工姓名,工资,年薪
select ename,sal,sal*12+nvl(comm,0)
from emp
--2、nvl2(p1,p2,p3) 如果p1不为null, 则返回p2,否则返回p3
select ename,sal,sal*12+nvl2(comm,comm,0)
from emp
--3、coalesce(p1,p2,p3,p4……) 返回第一个不为null的参数值
select ename,sal,coalesce(sal+comm,sal,0)*12
from emp
--case 表达式
--语法结构
case 列 |表达式
when 值1 then 返回值1
when 值2 then 返回值2
when 值3 then 返回值3
when 值4 then 返回值4
... ...
when 值n then 返回值n
else 默认返回值
end
--需求: 查询员工表中 10部门下的员工信息,要求职位用中文输出
select ename,job,(case job
when ‘CLERK‘ then ‘办事员‘
when ‘SALESMAN‘ then ‘经理‘
when ‘PRESIDENT‘ then ‘董事长‘
else ‘员工‘
end)
from emp where deptno = ‘10‘
--decode 表达式
语法结构
默认返回值
--decode(列 |表达式,值1,返回值,值2,返回值……,返回值n)
select ename,job,decode(job,‘CLERK‘,‘办事员‘,‘SALESMAN‘,‘经理‘,‘PRESIDENT‘,‘董事长‘,‘员工‘)
from emp where deptno = ‘10‘
多表查询
--将多张表联合到一起进行查询
--需要将表与表连接起来
--将连接条件写到 from子句后面
--查询emp表中 员工姓名,部门编号,以及部门名称
select *
from emp,dept
--如果将两张表简单的连接起来,此时会产生笛卡尔积
--为两张表创建关联字段,给与关联条件
--关联字段 -> 侠义角度: 两个字段列名相同,数据类型相同,内容都在同一个范围里
--广义角度: 两个列要有相同的意义
select * from dept
select ename,e.deptno
from emp e,dept d
where e.deptno = d.deptno
--多表关联中
--1、等值连接: 两个表的公共字段用 = 进行连接
--2、不等值连接: 两个表的公共字段不用 = 进行连接
--查询 员工姓名、工资、以及工资等级
select ename, sal,grade
from emp e,salgrade s
where e.sal between s.losal and s.hisal
--查询emp表中部门号 是 30 的员工姓名、工资、部门编号、以及工资等级、部门名称
select e.ename,e.sal,e.deptno,s.grade,d.dname
from emp e,dept d,salgrade s
where e.deptno = d.deptno
and e.sal between s.losal and s.hisal
--注意 n个表进行连接时,至少需要 (n-1) 个条件,否则就会出现笛卡尔积
--3、外连接: 用符号(+)做连接
--(+)永远写在缺乏表的一端
--如果要查询哪一张表的信息,对应的另外一张表就是缺乏表
--查询各部门有哪些员工,即使这些部门没有员工
select e.empno,e.deptno,d.dname
from emp e,dept d
where e.deptno (+)= d.deptno
order by e.deptno
--查询员工信息,即使这个员工没有部门
select e.empno,e.deptno,d.dname
from emp e,dept d
where e.deptno = d.deptno(+)
order by e.deptno
--4、自连接 : 查询结果和查询条件都需要在同一张表中
--查询员工表中和SMITH是同一部门的员工,不包含SMITH
select e1.ename,e1.deptno
from emp e1,emp e2
where e1.deptno = e2.deptno
and e2.ename = ‘SMITH‘
and e1.ename <> ‘SMITH‘
SQL99连接语法
--1、CROSS JOIN : 交叉连接,生成笛卡尔积
--查询员工表和部门表
select emp.*,dept.*
from emp cross join dept
--2、natural join : 自然连接
--用于连接两个具有相同列名以及相同类型的表
--查询员工表和部门表
select ename,dname
from emp natural join dept
--3、using 字节连接,需要写条件
--查询员工表和部门表
select *
from emp join dept using(deptno)
--4、on 子句连接,指定连接条件
--查询员工表和部门表
select *
from emp join dept on(emp.deptno = dept.deptno)
--5、left outer join : 左外连接,也称为左连接
--显示查询结果,左边表的全部,和右边表符合条件的数据
select *
from emp left outer join dept
on(emp.deptno = dept.deptno)
--6、right outer join : 右外连接,也称为右连接
--显示查询结果,右边表的全部,和左边表符合条件的数据
select *
from emp right outer join dept
on(emp.deptno = dept.deptno)
--7、full outer join : 全外连接
--两个表的数据都显示出来
select *
from emp full outer join dept
on(emp.deptno = dept.deptno)
--8、inner join : 内连接,两个表中有匹配的数据显示出来
select *
from emp inner join dept
on(emp.deptno = dept.deptno)