版权声明:本文为博主原创文章,未经博主允许不得转载。 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。