ORACLE多表查询
1 多表查询概念
所谓多表查询是相对单表而言的,指从通过关联字段(一般为外键关联)从多个数据表中查询数据。
2 无条件多表查询
无条件多表查询是将各表的记录以“笛卡尔”积的方式组合起来。
如scott.dept表共有4条记录,scott.emp表共有14条记录,其“笛卡尔”积将有4*14=56条记录。
select emp.empno,emp.ename,emp.deptno,dept.dnam e,dept.loc
from emp,dept;
- “笛卡尔”积
如果连接查询中的两个表没有where子句中指定的连接条件或连接条件无效,则ORALE会返回这两个表的“笛卡尔”积。
即:将一个表的每一行和另外一个表的每一行组合在一起。
笛卡尔积会产生大量的无效数据,在多表关联查询时,要尽量避免出现笛卡尔积,简单的说就是一定要使用where子句提供正确的条件。
3 内连接
- 语法:
select 表名(别名).查询字段(A,B...)
from 表A,表B...
where 表A.字段=表B.字段 --通常为外键
3.1 等值多表查询
内连接即为等值多表查询
按照等值的条件查询多个数据表中关联的数据。要求关联的多个数据表的某些字段具有相同的属性,即具有相同的数据类型、宽度和取值范围。
- 查询所有人的信息,包括其所在部门的信息,没有部门的员工除外
select emp.empno,emp.ename,emp.deptno,dept.dname,dept.loc
from emp,dept
where emp.deptno=dept.deptno
order by emp.empno;
3.2 非等值多表查询
- 仅做示例,不要轻易尝试
select emp.empno,emp.ename,emp.deptno,dept.dname,dept.loc
from emp,dept
where emp.deptno!=dept.deptno;
3.3 别名的应用
将查询结果集当成一张表进行使用,但需要给相应结果集起别名
- 查询员工FORD的上级
select emp.ename,boss.ename
from emp,(select empno,ename from emp) boss
where emp.mgr= boss.empno and emp.ename = 'FORD';
3.4 自连接
将同一张表当成具有不同用处的多张表进行使用
- 查询每个人的上司的名字,不包括上司为null的员工
select e.empno 员工号,e.ename 员工名,m.empno 上司工号,m.ename 上司名
from emp e,emp m
where e.mgr = m.empno;
4 外连接
外连接即是将目标表中不符合某个连接条件的记录也显示出来。
4.1 左外连接
关键字左边的表为主要查询(不符合条件的也会出现在结果集中)
- 查询所有员工以及其所在部门的信息,包括没有部门的员工
select e.*,d.*
from emp e
left join dept d
on e.deptno=d.deptno;
--可以使用+符号代替外连接符,(+)所在边的另一边就是主要显示的表
select e.*,d.* from emp e,dept d
where e.deptno=d.deptno(+);
4.2 右外连接
关键字右边的表为主要查询(不符合条件的也会出现在结果集中)
- 查询所有部门的信息及部门下的员工,包括没有员工的部门
select e.*,d.*
from emp e
right join dept d
on e.deptno=d.deptno;
select e.*,d.* from emp e,dept d
where e.deptno(+)=d.deptno;
4.3 全外连接
2张表中不符合条件的记录都会显示,不支持(+)
- 查询所有部门和所有员工的信息,包括没有部门的员工和没有员工的部门
select e.*,d.*
from emp e
full join dept d
on e.deptno=d.deptno;