===============单行函数 多行函数 单行函数:
作用于一行 返回一个值 多汗函数:
作用于多行 返回一个值
(1)字符函数
接收字符输入返回字符或者数值,dual 是伪表
1.1: 把小写的字符转换成大的字符
upper('yes')
select upper('yes') from dual
1.2;把大写的字符转换成小写的字符
lower('YES')
select lower('YES') from dual
数值函数
1. 四舍五入函数:
ROUND()默认情况下 ROUND 四舍五入取整,可以自己指定保留的位数。
select round(56.16,2) from dual
select trunc(56.16,-1) from dual 直接截取
select mod(10,3) from dual 求余数
.日期函数
Oracle 中提供了很多和日期相关的函数,包括日期的加减,在日期加减时有一些规律
日期 – 数字 = 日期
日期 + 数字 = 日期
日期 – 日期 = 数字
范例:查询emp中所有员工入职距离现在几天
select sysdate-e.hiredate from emp e;
算出明天刺客
select sysdate +1 from dual
查询出emp中所有员工入职距离现在几月
select months_between(sysdate,e.hiredate) from emp e;
查询出emp中所有员工入职距离现在几年
select months_between(sysdate,e.hiredate) /12 from emp e;
查询出emp中所有员工入职距离现在几周
select (sysdate-e.hiredate) /7 from emp e;
转换函数
TO_CHAR:字符串转换函数
拆分时需要使用通配符
年:y, 年是四位使用 yyyy
月:m, 月是两位使用 mm
日:d, 日是两位使用 dd
select to_char(sysdate,'yyyy-mm-dd hh:mi:ss') from dual
2019-08-23 03:18:35
select to_char(sysdate,'fm yyyy-mm-dd hh:mi:ss') from dual
2019-8-23 3:19:19
select to_char(sysdate,'fm yyyy-mm-dd hh24:mi:ss') from dual
2019-8-23 15:19:40
TO_DATE:日期转换函数
TO_DATE 可以把字符串的数据转换成日期类型
select to_date('1994-05-14','yyyy-mm-dd' ) from dual ----1994/5/14
通用函数
nvl
计算emp员工公年薪
select sal*12 + nvl(comm,0) from emp
Decode 函数
1;case when
select 条件,
case 条件
when 条件1 then 赋值1
when 条件2 then 赋值2
--else 赋值3
end
from 表;
select emp.ename,
case emp.ename
when 'SMITH' then '1'
when 'allen' then '2'
--else '3'
end
from emp;
Decode 函数
该函数类似 if....else if...esle
语法:DECODE(col/expression, [search1,result1],[search2, result2]....[default])
Col/expression:列名或表达式
Search1,search2...:用于比较的条件
Result1, result2...:返回值
如果 col/expression 和 Searchi 匹配就返回 resulti,否则返回 default 的默认值
select decode(emp.ename,'SMITH','aa','ALLEN','BB') from emp
运行结果 设置列的别 名
select decode(emp.ename,'SMITH','aa','ALLEN','BB') name from emp
select decode(emp.ename,'SMITH','aa','ALLEN','BB') "name" from emp
oracle 除了起别名 都用单引号 别名起在from 之前
==================多行函数
统计记录数 count()
select count(1) from emp
最小值查询 min()
select min(条件) from 表 例如: select min(sal) from emp
最大值查询 max()
select max(条件) from 表 例如: select max(sal) from emp
查询平均值 avg()
select avg(条件) from 表 例如: select avg(sal) from emp
求和函数 sum()
select sum(条件) from 表 例如: select sum(sal) from emp
=================分组查询
分组统计需要使用 GROUP BY 来分组
语法:SELECT */列名 条件 from 表名字 (表名字后面也可以加where 条件) GROUP BY 分组字段
分组查询中,出现在group by 后面的原始列,才能出现在select 后面
没有出现在group by 后面的原始列,想在select 后面 必须系上聚合函数
所有条件都不能使用别名
例如查询每个部门平均工资
select emp.deptno, avg(emp.sal)
from emp
group by emp.deptno
例如查询每个部门平均工资高于2000的
select emp.deptno, avg(emp.sal)
from emp
group by emp.deptno
having avg(emp.sal)>2000
查询每个部门工资高于800的员工的平均值
select emp.deptno ,avg(emp.sal)
from emp
where emp.sal >800
group by emp.deptno
whewe 是过滤分组前的数据 having 是过滤分组之后的 数据
表现形式 where 必须在group by前,having在group by后面
========================多表查询
语法: SELECT {DISTINCT} *|列名.. FROM 表名 别名,表名 1 别名
{WHERE 限制条件 ORDER BY 排序字段 ASC|DESC...}
select * from emp ,dept;
等值连接:
两张表中我们发现有一个共同的字段,我们可以使用这个字段来做限制条件,两张表的关联查询字段一般是其中一张表的主键,另一张表的
外键。
select * from emp ,dept where emp.deptno = dept. deptno
内连接
select * from emp inner join dept on emp.deptno = dept.deptno
外连接 {左连接 和有=右连接}
查询所有部门以及部门下的员工信息
select * from emp right join dept on emp.deptno = dept.deptno
查询所有员工信息,以及所属不么
select * from emp left join dept on emp.deptno = dept.deptno
oracle 专用外连接
select * from emp ,dept where emp.deptno(+) = dept. deptno
自连接
====查询员工姓名和 员工l领导姓名
select e1.ename ,e2.ename
from emp e1, emp e2
where e1.mgr = e2.empno
====查询员工姓名和 员工姓名 员工领导姓名和 员工领导部门姓名
select e1.ename ,d1.dname, e2.ename, d2.dname
from emp e1, emp e2 ,dept d1,dept d2
where e1.mgr = e2.empno
and e1.deptno = d1.deptno
and e2.deptno = d2.deptno
===============子查询
子查询:在一个查询的内部还包括另一个查询,则此查询称为子查询。
子查询在操作中有三类:
单列子查询:返回的结果是一列的一个内容
单行子查询:返回多个列,有可能是一个完整的记录
多行子查询:返回多条记录
====================Rownum与分页查询
ROWNUM:表示行号,实际上此是一个列,但是这个列是一个伪列,此列可以在每张表中出现。
当我们select 操作的时候 没查询出一行记录,就会在该还行上加一个行号 行号从1开始 一次递增不能跳着走
排序操作 影响ROWNUM顺入
如果涉及到排序 但是还要使用ROWNUM 我们可以再次嵌套
ROWNUM行号 不能写上大大于一个正数
select rownum,t.*from(select rownum, e.* from emp e order by e.sal desc) t
emp 表员工倒叙排列后 每页5条数据查询第二页
select * from(
select rownum rn , e. * from (
select * from emp order by sal desc
)e where rownum < 11
) where rn>5
=========
第一种写法:
select *
from (select rownum rm, a.* from (select * from emp) a where rownum < 11) b where b.rm >
5
第二种写法:
select *
from (select rownum r ,emp.* from emp) b
where b.r >5 and b.r <11
网友评论