oracle教程第二篇

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Phone_1070333541/article/details/83538816

一、笛卡尔积。

笛卡尔积会产生很多没有意义的数据。

二、连接查询。

1. 内连接。

1.1.隐式内连接。
表比较少的时候使用。
1.2.显式内连接。
表比较多的时候使用。
1.3.特点。
两个表关联字段其中有一个为空值的数据,就不会查出来。

2. 外连接

2.1.左外连接。
左外连接以左边为主表,右外连接以右表为主表。
2.2.特殊之处。
select * from emp e , dept d where e.deptno=d.deptno(+);
谁加 + ,谁是从表。
2.3.性能。
左边的一列 会被当成索引,所以当右外连接的时候第一列有空值时,索引会被破坏掉,性能就会下降。

3.自连接。

3.1.等值自连接。
select E.ename 员工姓名,me.ename 领导名称 from emp E ,emp me where w.mgr = me.empno;
3.2.内连接自连接。
SELECT * FROM EMP e INNER JOIN emp me ON e.mgr = me.empno;
3.2.外连接自连接。
SELECT e.ename 员工名称,me.ename 领导名称 FROM emp e LEFT JOIN emp me ON e.mgr = me.empno;

三、练习。

1.查询出员工的姓名,工资 和 工资等级 并命名为 一级 二级 。。。
SELECT 
	E.ENAME,
	E.SAL,
	decode(G.GRADE,1,'一级',2,'二级',3,'三级',4,'四级',5,'五级','高级') C1 
FROM EMP E 
LEFT JOIN SALGRADE G ON E.SAL BETWEEN G.LOSAL AND G.HISAL;

2.查询员工的信息,一级领导的信息

SELECT 
	E.EMPNO,
	E.ENAME,
	E.SAL,
	decode(G1.GRADE,1,'一级',2,'二级',3,'三级',4,'四级',5,'五级','高级') C1,
	ME.ENAME,
	ME.SAL,
	decode(G2.GRADE,1,'一级',2,'二级',3,'三级',4,'四级',5,'五级','高级') C2,
	D.DNAME
FROM EMP E
LEFT JOIN EMP ME ON E.MGR = ME.EMPNO 
LEFT JOIN DEPT D ON E.DEPTNO = D.DEPTNO 
LEFT JOIN SALGRADE G1 ON E.SAL BETWEEN G1.LOSAL AND G1.HISAL 
LEFT JOIN SALGRADE G2 ON ME.SAL BETWEEN G2.LOSAL AND G2.HISAL;

四、总结

select * from 外键表 left join 主键表 on 外键表的外键id = 主键表的主键id

五、子查询

1.思想
把一个查询结果当成条件或者新表。
2.in
oracle中 in 后面的值可以为空。
空格空格呦 not in 后面不能有空值。
3.exists
只返回 true 或者 false,在 DDL 语句使用的时候用这个关键字。
4.找到工资的最高的前三个员工
limit 用不了-->新的知识:
空格呦 伪列: rownum / rowid
空格呦 oracle 中独特的定义,不存在于表中,但是能使用。
空格呦 select rownum,e.* from emp e;
空格呦 但是 rownum 将查询结果从1 开始编号,但是发生在排序之前
这个时候用子查询。
空格呦 select rownum,a.* from ( select * from emp order by sal desc ) a where rownum < 4;
5.查询工资在5-8名的员工信息
新的问题 : rownum 每次都会从1给你排序你的新查询结果,也就是筛选rownum 时必须包括1
解决:
select b.* from ( select rownum rn ,a.* from ( select * from emp order by sal desc ) a )b where b.rn between 5 and 8 ;
6.统计每年入职的员工个数并统计总人数
6.1.先查1981年入职的员工
select count(*) from emp where hiredate between date ' ' and date ' '
6.2.再查有多少个年份。
6.3.假如按年份分组,就查不了总人数。
6.4.用decode年代正确了 就是1 不正确 就是0 再相加 就求出来了这个年代的人数。
SELECT 
	COUNT(empno) total,
	sum(DECODE(TO_CHAR(HIREDATE,'yyyy'),'1980',1,0)) "1980",
	sum(DECODE(TO_CHAR(HIREDATE,'yyyy'),'1981',1,0)) "1981",
	sum(DECODE(TO_CHAR(HIREDATE,'yyyy'),'1982',1,0)) "1982",
	sum(DECODE(TO_CHAR(HIREDATE,'yyyy'),'1987',1,0)) "1987"
FROM EMP;

六、oracle中的分页查询。

1.oracle 分页 必须用到伪列 且必须从1开始
2.oracle 分页公式:
数据层 伪列层 分页层。
3.数据层
只提供分页数据 排序 分组,一定在这层完成。
4.伪列层。
这一层就获取伪列。
select A.* ,rownum rn from( 数据层) A
5.分页层。
获取分页参数。
select * from ( 伪列层 ) B where b.rn between (1-1) * 3+1 and 1*3

七、伪列 rowId

1.简介
rowid 记录的是表中每条数据存储的物理真实位置。
2. 应用场景
当一个表没有主键 且数据相同 你想删除某一条。

八、集合

1.并集。
1.1.联合 union
空格 去重,自然排序,查询效率很低
空k (把两个毫无关系结果放在一起,且破坏了本来的索引机制以及其他的优化查询机制,这种情况下又要排序,又要去重)
1.2.union all
空格 不去重也不排序。
2.交集。 intersect
空格 select * from emp where sal > 1500 intersect select * from emp where deptno=20;
3.差集。minus
空格 在第一个集合但是不在第二个集合中
4.注意。
空格 集合运算两边查询的字段类型,数量,顺序必须一致。
空格 所有的集合查询 都可以用连接查询。

九、oracle的运行环境。

1. 物理部分:ctl 控制文件 数据文件 .log 日志文件
2. 实例部分:内存结构(200多M 缓存)系统全局区域:
3. PGA:每个用户独有的区域。
空k PMON 是控制SGA 和 PGA 联系。
4. DBWR:数据读写。
空k LGWR:日志读写。
5. CKPT:检查点进程,主要控制事务。
6. SGA:system global area。

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Phone_1070333541/article/details/83538816
今日推荐