多表查询
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(+);