Oracle 的多表查询 ,主要是结合各种查询进行组合。从而构造出一个复杂的查询。 所以首先得掌握一些常用的多表查询的方法。再根据实际情况来进行组合。 首先介绍的是 Union: 将多个表的结果集去除重复取并集 (使用的表是自带的学习表 emp dept salgrade) 注意 被取出的字段数据类型得相同 例子
Select empno from emp Union Select deptno from dept; 结果
Union all 将多个表取并集(不会去除重复) 注意 被取出的字段数据类型得相同 使用方法与union一致
子查询 SELECT <字段列表> from table_name where 字段 运算符( SELECT 语句 );
示例: select * from emp where sal=(select max(sal) from emp);运算符 Any 数据集中的任一个数据(下限)
select * from emp where sal>ANY(select sal from emp where deptno=30) and deptno 30; 找出比deptno=30的员工最低工资高的其他部门的员工ALL 数据集的所有的数据(上限)
select * from emp where sal>ALL(select sal from emp where deptno=30) and deptno=30; 找出比deptno=30的员工最高工资高的其他部门的员工IN (条件) 所有满足在条件列表中的记录
例如 select * from emp where empno in(7788,7369,7499); 找出empno是7788或者7369或者7499的记录NOT IN (条件) 所有不满足在条件列表中的记录
select * from emp where empno not in(7788,7369,7499); 找出empno不是7788或者7369或者7499的记录EXIST(数据集),NOT EXIST和in ,not in的意思差不多
select * from table1 where exists ( select null from table2 where y = x )执行的过程相当于:(重点理解)
for x in ( select * from table1 ) loop if ( exists ( select null from table2 where y = x.x ) then OUTPUT THE RECORD end if end loop例子 解释 上图的查询就是每当在emp中取出一个数据 就去判断是否满足EXISTS中的要求 当emp取出 sal=3000 时 去 EXISTS中判断 发现 hisal中有3000所以满足于是就输出了 和IN的方法差不多
连接查询 SELECT <字段列表> from table1,table2 WHERE table1.字段=table2.字段
示例 select empno,ename,dname from emp,dept where emp.deptno=dept.deptno;查询指定行数的数据 SELECT <字段列表> from table_name WHERE ROWNUM<行数;
示例: select * from emp where rownum<=10;--查询前10行记录 注意ROWNUM只能为1 因此不能写 select * from emp where rownum between 20 and 30;要查第几行的数据可以使用以下方法:
select * from (select * from emp where rownum <=6) where rownum >= 3; 结果可以返回整个数据的3-6行;表连接
Inner join 返回两表相匹配的数据
Left join 左表为主表 返回所有的数据,右表只返回与左表相匹配的部分
Right join 右表为主表 返回所有的数据,左表只返回与右表相匹配的部分
Full join 左右表均返回所有数据但只有匹配的数据显示在同一行
例 将emp表中的薪水大于1300依照salgrade表中的薪水等级来计算emp表中的薪水对应的等级
select e.ename,e.sal,s.grade from emp e (这里分别改为inner join,left join,right join,full join 来对比结果) salgrade s on e.sal>=s.losal and e.sal<=s.hisal and e.sal >= 1300order by 3 asc;
结果 inner join
left join
right join
full join
关系图
总结 Oracle的基础差不多到此结束。数据库的使用主要还是依靠实际中的需求。 Oracle的增删改查,看起来简单,其实要想用好,还是需要大量的锻炼。 各种查询的组合以及对效率的优化,这些不在真正的生产环境中是学不了的。 写这博文的目的,一是为了锻炼自己的表达能力,二是让自己对知识进行总结。
水平有限 若有错误 欢迎指正