数据库SQL连接查询(外连接、内连接、自然连接)及SQL左右连接中的on and和on where的区别

在实际查询中,往往需要从多个表中获取需要的数据。当查询涉及到多个表时,可以利用连接查询来实现。连接主要分为:

name Value
内连接 inner join
外连接 left join / right join
交叉连接 一般不用

1. 内连接

两个表的内连接是把两个表在相关列满足连接条件的元组进行拼接后形成新的元组而组成的新的关系;对于表中不满足连接条件的元组将被舍弃。
内连接语句格式为:
FROM <表1> [INNER] JOIN <表2> ON <连接条件>
内连接

2. 外连接

如果需要在连接中保留某个表的不满足连接条件的元组,可以使用外连接(OUTER JOIN)。外连接分为分为:

  • 左外连接(LEFT OUTER JOIN)查询结果为两个表匹配到的数据,左表特有的数据,右表不存在的数据使用null填充
  • 右外连接(RIGHT OUTER JOIN)查询结果为两个表匹配到的数据,右表特有的数据,左表不存在的数据使用null填充
  • 全连接(FULL JOIN)

外连接的基本格式:
FROM <表1> [LEFT|RIGHT|FULL] [OUTER] JOIN <表2> ON <连接条件>
右连接
左连接

3. 自然连接

自然连接将两个关系组中在相同名称的属性上具有相同的值的行记录进行匹配,并且重复的属性列去掉,这样得到的新的一行将出现在查询结果中,而那些没被匹配的行不出现在结果中。因此自然连接的结果会有数据丢失,这些丢失的数据就是那些没有匹配的数据。

如果关系R与S具有相同的属性组B,且该属性组的值相等时的连接称为自然连接,结果关系的属性集合为R的属性并上S减去属性B的属性集合。
R和S自然连接可记作:R⋈S={t r⌒ts |tr∈R∧ts∈S∧tr[B]=ts[B]}

例如:

举例:

查询每个读者及其借阅图书的情况,要求即使从未借阅过图书,也要看到读者的信息。

--左连接
select Patron.PatronID, Name, Gender, BirthDate, Btype, Department, 
CallNo, LendTime, ReturnTime
from Patron left join Lend on Patron.PatronID = Lend.PatronID;
--右连接
select Patron.PatronID, Name, Gender, BirthDate, Btype, Department, 
CallNo, LendTime, ReturnTime
from Lend right join Patron on Patron.PatronID = Lend.PatronID;

查询结果

SQL左右连接中的on and和on where的区别

在使用left join时,on and和on where条件的区别如下:

  1. on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。
  2. where条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有left join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉,on后的条件用来生成左右表关联的临时表,where后的条件对临时表中的记录进行过滤。

猜你喜欢

转载自blog.csdn.net/UCB001/article/details/103576094