多表连接查询

发表时间:2017-05-11 16:49:39 浏览量( 26 ) 留言数( 0 )

学习目标:

1、了解Java的历史

2、为什么要学习Java语言

3、端正学习态度


学习过程:

有时候我们需要从多张表中获取数据,select语句支持一次性查询多张表,这些表在内存中会做一个“乘法”操作。两个表如何相乘呢?我们看看那下面这个例子。

比如现在有两张表,员工表和部门表

attcontent/1674edc9-44c9-4cf7-b885-966bd2c5b554.png

如果这两张表做一个乘法运算,那么结果如下:

attcontent/fd18cb69-d2f6-403a-b33a-e7b71d575a34.png

一、内链接查询

现在我们要查询,查询所有部门的员工信息,要求显示部门名称,员工名称,工资等信息,因为部门名称保存在部门表中,其他信息保存在员工表中,所以我们需要一次性的查询两个表,代码如下:

select d.dep_name  部门名称,e.employee_name 员工名称 ,e.salary  工资 
      from employee e,department d

这样得到的结果就是部门表和员工表的一个乘法结果,其中部门的id和员工的所属部门的外交id是对不上的,所以我们添加一个条件判断,就是主键=外键,这样就可以得到正确的数据了。修改上面的查询语句。

select d.dep_name  部门名称,e.employee_name 员工名称 ,e.salary  工资 
      from employee e,department d where e.dep_id=d.dep_id

得到结果如下:

attcontent/c765cae4-181c-4207-a695-ecf49e01cd35.png

多表查询可以是多张表的,比如下面这个例子,需要查询四张表,才可以得到员工每门课程的对应的成绩。

--查询员工的姓名,部门名称,科目名称,科目的成绩
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

结果如下:

attcontent/137a4cb7-e8be-4bd5-a250-e8b07689f1e8.png

二、外链查询

主要有左外连接,右外连接和全连接。

左外连接:指定的左表的所有行,而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值。     

右外连接:其实和左外连接差不多。右向外联接是左向外联接的反向联接。将返回右表的所有行。如果右表的某行在左表中没有匹配行,则将为左表返回空值。

全连接:完整外部联接返回左表和右表中的所有行。

oracle有自己的一套实现外链接的语法格式,这些语法格式有别于标准的sql语句,相对来说比较容易一点。下面两个我们都介绍一下:

首先我们现在员工表插入一条部门外键为空的数据。

attcontent/dc4d37e3-259f-4fb6-a421-9949cc887feb.png

然后在部门表,添加一条没有任何员工是该部门的数据。

attcontent/cd3493ac-fe12-4159-845d-d2bfc2e6cac2.png

1、左外连接示例如下:

 --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

结果如下:

attcontent/67ff151a-4a34-4ba3-a238-af7f6bf8358e.png

右外连接示例如下:

 --右外链接
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

结果如下:

attcontent/419697b3-d451-41f3-bec1-a7276395da6a.png

全连接示例如下:

--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


attcontent/c2fd4041-999f-49e6-a1db-d5c2a9e82e98.png