学习目标:
1、掌握自然连接、左外连接、右外连接和全连接的概念
2、掌握Oracle对自然连接、左外连接、右外连接和全连接的语法的支持
3、熟练掌握多表连接查询
学习过程:
有时候我们需要从多张表中获取数据,select语句支持一次性查询多张表,这些表在内存中会做一个“乘法”操作。两个表如何相乘呢?我们看看那下面这个例子。
比如现在有两张表,员工表和部门表
如果这两张表做一个乘法运算,那么结果如下:
一、内链接查询
现在我们要查询,查询所有部门的员工信息,要求显示部门名称,员工名称,工资等信息,因为部门名称保存在部门表中,其他信息保存在员工表中,所以我们需要一次性的查询两个表,代码如下:
1 2 |
select d.dep_name 部门名称,e.employee_name 员工名称 ,e.salary 工资 from employee e,department d |
这样得到的结果就是部门表和员工表的一个乘法结果,其中部门的id和员工的所属部门的外交id是对不上的,所以我们添加一个条件判断,就是主键=外键,这样就可以得到正确的数据了。修改上面的查询语句。
1 2 |
select d.dep_name 部门名称,e.employee_name 员工名称 ,e.salary 工资 from employee e,department d where e.dep_id=d.dep_id |
得到结果如下:
多表查询可以是多张表的,比如下面这个例子,需要查询四张表,才可以得到员工每门课程的对应的成绩。
1 2 3 4 |
--查询员工的姓名,部门名称,科目名称,科目的成绩 select employee_name,dep_name,EMP_SOURCE_NAME, POINT from employee e,department d,emp_source es,emp_result er where e.dep_id=d.dep_id and e.employee_id=er.employee_id and er.emp_source_id=es.emp_source_id |
结果如下:
二、外链查询
主要有左外连接,右外连接和全连接。
左外连接:指定的左表的所有行,而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值。
右外连接:其实和左外连接差不多。右向外联接是左向外联接的反向联接。将返回右表的所有行。如果右表的某行在左表中没有匹配行,则将为左表返回空值。
全连接:完整外部联接返回左表和右表中的所有行。
oracle有自己的一套实现外链接的语法格式,这些语法格式有别于标准的sql语句,相对来说比较容易一点。下面两个我们都介绍一下:
首先我们现在员工表插入一条部门外键为空的数据。
然后在部门表,添加一条没有任何员工是该部门的数据。
1、左外连接示例如下:
1 2 3 4 5 6 7 |
--oracle的实现方式 --+号写在右边,左外链接,左边边全部出现, select d.dep_name 部门名称,e.employee_name 员工名称 ,e.salary 工资 from employee e,department d where e.dep_id=d.dep_id(+) --标准sql写法 select d.dep_name 部门名称,e.employee_name 员工名称 ,e.salary 工资 from employee e left outer join department d on e.dep_id=d.dep_id |
结果如下:
右外连接示例如下:
1 2 3 4 5 6 |
--右外链接 select d.dep_name 部门名称,e.employee_name 员工名称 ,e.salary 工资 from employee e,department d where e.dep_id(+)=d.dep_id --标准sql写法 select d.dep_name 部门名称,e.employee_name 员工名称 ,e.salary 工资 from employee e right outer join department d on e.dep_id=d.dep_id |
结果如下:
全连接示例如下:
1 2 3 4 5 6 7 8 9 10 |
--oracle可以把左外和右外连接做个并集 select d.dep_name 部门名称,e.employee_name 员工名称 ,e.salary 工资 from employee e,department d where e.dep_id=d.dep_id(+) union select d.dep_name 部门名称,e.employee_name 员工名称 ,e.salary 工资 from employee e,department d where e.dep_id(+)=d.dep_id --标准sql写法 select d.dep_name 部门名称,e.employee_name 员工名称 ,e.salary 工资 from employee e full outer join department d on e.dep_id=d.dep_id |