多表查询

select table_name.column_name,........

from table_name1,table_name,.....

1.等值连接
2.不等值连接
3.外连接
4.自连接

s_emp
s_dept
s_region

需求一:
查询所有员工的名字,和所有部门的名字

select last_name,name
from s_emp,s_dept;

等值连接:
需求二:
查询所有员工的last_name,以及员工所属部门的名称

目标:last_name,name
from s_emp, s_dept
条件:员工所属部门
s_emp.dept_id = s_dept.id

select lasT_name,name
from s_emp,s_dept
where s_emp.dept_id = s_dept.id;

需求三:
查询部门名称,以及部门所属区域的名称
目标:部门name,区域名称
from: s_dept, s_region
条件:部门所属区域
s_dept.region_id = s_region.id

select s_dept.name,s_region.name
from s_dept,s_region
where s_dept.region_id = s_region.id;

不等值连接:
salaryGrade:
min         max      grade
0            1000       三级
1001       1500      二级
1501       2500      一级

需求三:
查找员工名称,员工工资,以及员工工资所属等级信息。

目标:last_name,salary,grade
from:s_emp,salGrade
条件:员工工资所属等级
salary between minSal and maxSal;

select last_name,salary,grade
from s_emp,salGrade
where salary between minSal and maxSal

create table salGrade(
id number primary key,
minSal number,
maxSal number,
grade varchar2(10)
);
insert into salGrade values(1,0,1000,'三级');
insert into salGrade values(2,1001,1500,'二级');
insert into salGrade values(3,1501,2500,'一级');

外连接:
左外:left join    +出现在等号  右边
右外: right join  +出现在等号  左边
全外: full join

需求四:
1.要求查询所有员工的名称,以及员工所属部门的名称,就算员工没有部门,也要显示员工的名称。

目标:last_name,name
from:s_emp,s_dept
条件:员工所属部门,就算员工没有部门,也要显示员工名称。


select last_name,name
from s_emp,s_dept
where s_emp.dept_id = s_dept.id(+);

select last_name,name
from s_emp left join s_dept
on s_emp.dept_id = s_dept.id;

语义分析,将+号放在值少的一方。

2.要求查询所有员工的名称,以及员工所属部门的名称,就算部门没有员工,也要显示部门名称。

select last_name,name
from s_emp,s_dept
where s_emp.dept_id(+) = s_dept.id;

select last_name,name
from s_emp right join s_dept
on s_emp.dept_id = s_dept.id;

3.要求查询所有员工的名称,以及员工所属部门的名称,就算部门没有员工,也要显示部门名称。就算员工没有部门也要显示员工名称。

select last_name,name
from s_emp full join s_dept
on s_emp.dept_id = s_dept.id;


自连接
需求五:
查询员工的名称以及员工所属经理的名称

目标:员工last_name,经理的last_name
from: s_emp , s_emp
条件:员工所属经理
员工的manager_id = 经理的id

select emp.last_name,manager.last_name
from s_emp emp,s_emp manager
where emp.manager_id = manager.id;

2.就算员工没有经理,也要显示员工信息

select emp.last_name,manager.last_name
from s_emp emp,s_emp manager
where emp.manager_id = manager.id(+);

posted on 2015-12-23 09:34  tengke  阅读(120)  评论(0编辑  收藏  举报