多表查询
分为等值查询,不等值查询,外连接,自连接。
注:四种类型,表一m行,表二n行,两个表有共同的一列(字段)
1.以表一为基准,每行都完全匹配表二所有行。共m*n行(笛卡尔积)
2.以共有字段为基准,表一.字段=表二.字段,共m∩n行(等值连接/内连接)
3.以独有字段为基准,如以表一某列为基准,表二能和表一该字段匹配的就显示,不能匹配的就显示为空。共m行。
同理若以表二为基准,则共n行。(外连接/不等值连接)
4.一张表和自己连接,就是自连接
其中2和3中的两张表都是有共有字段的。
笛卡尔积
select * from 表1,表2;
这样查询结果总条数为表1条数和表2条数之积。
查询会影响性能。
关联查询
多表查询时,先执行from部分,再执行select 和where条件,所以编写sql语句时先考虑from部分,确定表,再确定select的字段和where条件。
两张表的关联查询字段,一般是一张表的主键,另一张表的外键。
如:select * from emp,dept where epm.deptno=dept.deptno;
查询效率:
from 后面两张表会先做笛卡尔乘积,会很慢,可以改为join on即可在做笛卡尔积之前先根据on后的条件判断,这样可以减少很多操作,提高效率
select * from emp join dept on epm.deptno=dept.deptno;
自连接
select e.empno,e.ename,e2.empno,e2.ename from emp e, emp e2 where e.mgr= e2.empno;
外连接
左连接
(+)在右边,表示左连接
select e.empno,e.ename,d.deptno,d.dname from emp e, dept d where
e.deptno =d.deptno(+);
右连接
(+)在左边,表示右连接
select e.empno,e.ename,d.deptno,d.dname from emp e, dept d where
e.deptno(+) =d.deptno;
或
select e.empno,e.ename,d.deptno,d.dname from emp e, right join dept d on
e.deptno =d.deptno;
子查询
就是嵌套,一条sql语句里嵌套进另一条sql语句
select ename,job,sal from emp where sal =(select MIN(sal) from emp);
分页查询
ROWNUM表示行号,
ROWID表中每行数据指向磁盘上的物理地址
集合运算
1.union并集
select * from emp where sal>10000 union select * from emp where deptno =10;
2.intersect交集
select * from emp where sal>10000 intersect select * from emp where deptno=10;
3.minus差集(属于其中一个,但不属于另一个)
select * from emp where to_char(hiredate,yyyy’)=‘1990’
minus select * from emp where job =‘manager’;