oracle第二天总结
(1)单表查询(完整语句:select from where group by having order by ) <除了第5点,其他都要求掌握>
1.select 查询语句
去重:select distinct deptno,mgr 作用于多列
别名:select ename (as) "员工姓名",sal 工资 from emp;
连接: select '员工姓名:' || ename from emp; concat(,)
聚合函数:sum(),max(),min(),avg(),count()
2.where 过滤语句
=,!=,>,>=,<=
not between and 边界 小值在前,大值在后
and 和or 逻辑运算 从右边往左边执行
is not null ??=null 这是错误的写法
not like==>select * from teacher where teacher_name like '%r_%' escape 'r';
in(10,20) not in(10,20)特别注意要在使用not in 要防止出现null
3.group by 分组(非聚合函数中的列都要参与group by的分组)
select 中查询显示列并且为非聚合函数的列都要参与到group by分组中
select deptno,max(sal) from emp group by deptno;//这里的deptno为非聚合函数的列,所有需要参与到分组中去
select deptno,job,max(sal) from emp group by deptno,job;//多列分组,首先按照deptno分组,相同的组再按照job分组
使用having来过滤分组后的结果
4.order by 排序
order by deptno,sal desc 多列排序:首先是按照deptno 升序排列,然后按照sal 降序排列
5.伪列rowid和rownum
rowid:每一行的物理地址 rownum:每一行排序的序号
select rowid,rownum,empno,ename from emp;
ROWID ROWNUM EMPNO ENAME
------------------ ---------- ---------- ------
AAAMfPAAEAAAAAgAAA 1 7369 SMITH
AAAMfPAAEAAAAAgAAB 2 7499 ALLEN
AAAMfPAAEAAAAAgAAC 3 7521 WARD
AAAMfPAAEAAAAAgAAD 4 7566 JONES
AAAMfPAAEAAAAAgAAE 5 7654 MARTIN
AAAMfPAAEAAAAAgAAF 6 7698 BLAKE
AAAMfPAAEAAAAAgAAG 7 7782 CLARK
AAAMfPAAEAAAAAgAAH 8 7788 SCOTT
AAAMfPAAEAAAAAgAAI 9 7839 KING
AAAMfPAAEAAAAAgAAJ 10 7844 TURNER
AAAMfPAAEAAAAAgAAK 11 7876 ADAMS
(2)多表查询<掌握多表联合查询和外连接>
where A.xxx=B.xxx<只要2个表能够建立关联关系,2个表都能够联合查询>
外连接:全集表和子集表(全集表在哪边,就是哪边连接;(+)是帮助我们子集表)
sql99标准:
A a left join B b on a.col1=b.col2 左连接
A a right join B b on a.col1=b.col2 右连接
orcle:
A a , B b where a.col1(+)=b.col2 右连接
A a , B b where a.col1 =b.col2(+) 左连接
select d.deptno 部门编号,d.dname 部门名称,count(e.empno) 部门总人数 from emp e, dept d where e.deptno(+)=d.deptno
group by d.deptno,d.dname order by d.deptno;
(3)子查询(select的语句嵌套)
子查询放在哪里?select ,from ,where
子查询用什么关键字连接?单行子查询使用(=,<>,>,>=,<,<=),多行子查询使用单行运算符和(in(),any(),all())
子查询和主查询执行顺序?一般首先执行子查询,相关子查询首先执行主查询;
(4)分页查询<掌握>
一张表不经过任何操作默认带有rownum行号,经过排序操作之后,该行号也随着排序了,但不是从1-2-3排序的
为了重新按照1-2-3排序,需要将参与排列的表放入from中构成一张新的表;新表的顺序是按照1-2-3排序的
rownum 不能直接rownum>1,但是可以使用rownum<6
为了使用rownum>1,我们把rownum当成列来使用而不是行号;
select * from (select rownum rm,e1.* from (select rownum,e.* from emp e order by sal desc)
e1 where rownum<8 ) e2 where rm>2;
(5)函数
字符函数
length(),concat(),substr(),trim()
数值函数
round() trunc()
select round(45.926,2) 一,round(45.926,1) 二,round(45.926,0) 三,round(45.926,-1) 四,round(45.926,-2) 五 from dual;
select trunc(45.926,2) 一,trunc(45.926,1) 二,trunc(45.926,0) 三,trunc(45.926,-1) 四,trunc(45.926,-2) 五 from dual;
日期函数
sysdate systimestamp
next_day(,'星期一')
last_day()
trunc()
查看并修改oracle默认日期格式:
select * from v$nls_parameters;
alter sessin|system set NLS_DATE_FORMATE=’yy-mm-dd’;
转换函数
to_char() 可以转换成日期或者指定格式
to_number() 字符串转换成数字
to_date() 字符串转换日期
(6)其他函数
关于null的函数:
nvl(a,b) a为null,则返回b
nvl2(a,b,c) a为null,则返回c,否则返回b
nullif(a,b) a=b,则返回null,否则返回a
条件语句函数
case when then else end
decode(ename,'',,,,)
分析排名函数
rank() over(order by xxx ) 相同的值排名相同,排名跳跃
DENSE_RANK() over(order by xxx) 相同的值排名相同,排名连续
ROW_NUMBER() over(order by xxx) 连续的排名,无论值是否相等
(7)集合操作
union 去重,union all不去重
集合参与运算(并集,交集,差集)需要每一个集合的列个数和类型要一样;
order by放在最后;