多表查询-SQL92

多表查询是一个比较实际有比较复杂的一种查询。下面希望可以通过实例展示的形式,可以供大家一起学习交流。

--笛卡尔积式的查询
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个条件关联

 

posted @ 2017-12-18 14:53  superdrew  阅读(394)  评论(0编辑  收藏  举报