↑ 点击上面 “时代Java”关注我们,
关注新技术,学习新知识!
连接 (Join)
我们知道,连接可以理解为筛选+笛卡尔乘积
,即便真实的算法可以做很多优化,基本思想不会变。笛卡尔乘积是固定的,让连接操作变得复杂的,只有筛选
操作,也就是筛选条件
。根据不同的筛选条件,SQL提供了不同的书写方式,帮助程序员明确目的、减少意料之外的事情,也增加了学习的难度。只要牢记,各种连接就是筛选条件不同,也就可以很容易地区分各种连接了。
以下挨个介绍常用的连接方式,同时呈现对应SQL的写法。
自然连接 (Natural Join)
两个表中含有相同的「属性」,或称「列」,在笛卡尔乘积的结果集中,筛选这些相同属性相等的情况。
前文讲解笛卡尔集合时的例子就是一种自然连接,相同的列是表达教师姓名的两个属性。但是, 从SQL的角度说,这个例子并不自动构成「自然连接」,因为两个列的「名称」不同。把instructor
表中的列名改为teacher
,或把course
表中的列名改为name
,才可以自动构成SQL意义下的「自连接」。
虽然SQL有所规定,但是我们知道,自然连接实际划出了一类连接,代表「使用相等条件筛选」。只要我们明确,「使用相等条件筛选」是有直接SQL支持的,就可以了。
说了这么多,还没说SQL怎么写。
最简单的是直接使用SQL提供的关键字natural join
。假设student
表和takes
表有相同的列ID
,则以下两行SQL等价:
select name, title from student natural join takes;select name, title from student, takes where student.ID = takes.ID;
关键字natural join
相当于自动添加了where
语句,自动检查了两个表的哪几个属性相同。
也可以同时操作多个表,多