结构化查询语言之 SQL 连接表达式(以Mysql为例)

160 阅读2分钟

[TOC]

查询使用的数据库文件下载


1. 自然连接、using条件连接、on条件连接:内连接

  • 连接条件-natural:natural join
select * from student natural join takes;

在这里插入图片描述   ID属性列出现一次。注:mysql57不能加inner

在这里插入图片描述 在这里插入图片描述

  • 连接条件-using条件:join ... using ...
select * from student join takes using(ID); # default to be inner
# or
select * from student inner join takes using(ID);

在这里插入图片描述   ID属性列出现一次。由于student表与takes表仅ID属性值相同,两者(natural join与join...using)查询结果一致。

  • 连接条件-on条件:允许在参与连接的关系上设置通用的谓词,谓词写法与where子句类似;on条件可以表示任何SQL谓词,使用on可以表示比自然连接更为丰富的连接条件
select * from student join takes on student.ID=takes.ID;

在这里插入图片描述 在这里插入图片描述   上面两个查询ID属性列出现两次,查询结果一致。

2. 外连接

  • 左外连接:只保留出现在左外连接运算之前(即左边)的关系中的元祖
select *
from student natural left outer join takes;

在这里插入图片描述   outer可不写: 在这里插入图片描述

如何计算?

  • 计算自然连接(内连接)的结果;
  • 对于内连接左侧关系的任意一个与右侧关系任意元祖不匹配的元祖t,结果添加元祖r
    • 元祖r从左侧关系得到的属性被赋为t中的值;
    • r的其它属性被赋为空;
  • 右外连接:只保留出现在右外连接运算之后(即右边)的关系中的元祖
select *
from takes natural right outer join student;

在这里插入图片描述

  上述查询结果与左外连接查询结果一致。

  • 全外连接:保留出现在两个关系的元祖(mysql不支持,可以针对左外连接与右外连接的结果采用union来实现)
select *
from (select *
	  from student
	  where dept_name = 'Comp.Sci') as A
	  natural full outer join
	  (select *
	  from takes
	  where semester = 'Spring' and year = 2009
	  ) as B

在这里插入图片描述

  • 带on条件的外连接
select * from student left outer join takes on student.ID=takes.ID;

在这里插入图片描述

  与natural left outer join查询结果一致,但与下面的查询结果不一致(由于natural条件不存在,故 on true 作为一个连接条件不能缺少),因为on和where在外连接的表现是不同的:

在这里插入图片描述


References: [1] Abraham Silberschatz, Henry F Korth, S Sudarshan. Database System Concepts. New York: McGraw-Hill, 2010 Database System Concepts