多表查询是一个比较实际有比较复杂的一种查询。下面希望可以通过实例展示的形式,可以供大家一起学习交流。
--笛卡尔积式的查询 select * from emp,dept; --笛卡尔积查询的结果会有很多无效的数据,所以要通过关联条件进行筛选 --所以,出现了一些“关联符号” --等值连接:提示查询结构中如果有相同的列,要指定表名 标识 是哪个表的字段 select * from emp,dept where emp.deptno = dept.deptno order by dept.deptno; --使用多表查询可以给表 指定 别名 表的别名不要加 AS 报错 --给表取别名之后,原来的表名不能再使用了 (只能使用的是别名) select e.empno,e.ename,e.job,e.deptno,d.dname,d.loc from emp e,dept d where e.deptno = d.deptno order by deptno; --非等值连接 --查询所有员工的姓名,职位,薪水和薪水等级 select e.ename,e.job,e.sal,s.grade from emp e, salgrade s where e.sal >= s.losal and e.sal <=hisal --条件也可以使用between...and... select e.ename,e.job,e.sal,s.grade from emp e,salgrade s where e.sal between s.losal and s.hisal; --自连接 --查询员工编号,姓名,领导的编号和姓名 --select * from emp; select e1.empno ,e1.ename,e1.mgr,e2.ename from emp e1,emp e2 --e1 可以看作是员工表,e2可以看作领导表 where e1.mgr = e2.empno;--让员工表领导的编号等于领导表的员工编号 select e1.empno ,e1.ename,e2.empno,e2.ename from emp e1,emp e2 where e1.mgr = e2.empno; --查询所有的员工编号,姓名,有领导的显示领导的编号和姓名,没有领导的只显示员工信息 --外连接 :显示某张表中没有关联的信息,可以通过 "(+)" 来实现 select e1.empno ,e1.ename,e1.mgr,e2.ename from emp e1,emp e2 where e1.mgr = e2.empno(+);--左外连接 --查询所有部门的信息以及每个部门的平均工资,包涵没有员工的部门 select d.*,round(nvl(avg(e.sal),0)) avg_sal from emp e,dept d where e.deptno(+) = d.deptno group by d.deptno,d.dname,d.loc order by d.deptno; --查询20部门的员工编号,姓名,薪水,部门名称,薪水等级 select e.empno,e.ename,e.sal,d.dname,s.grade from emp e,dept d ,salgrade s where e.deptno = d.deptno and e.sal between s.losal and s.hisal and d.deptno=20; --n张表关联查询,至少需要n-1个条件关联