数据库的左连接、右连接和全连接用法

62次阅读
没有评论

共计 4027 个字符,预计需要花费 11 分钟才能阅读完成。

这篇文章主要讲解了“数据库的左连接、右连接和全连接用法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着丸趣 TV 小编的思路慢慢深入,一起来研究和学习“数据库的左连接、右连接和全连接用法”吧!

连接可以在 SELECT  语句的 FROM 子句或 WHERE 子句中建立,似是而非在 FROM 子句中指出连接时有助于将连接操作与 WHERE 子句中的搜索条件区分开来。所以,在 Transact-SQL 中推荐使用这种方法。 

SQL-92 标准所定义的 FROM 子句的连接语法格式为: 

FROM join_table join_type join_table 
[ON (join_condition)] 

其中 join_table 指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一个表操作的连接又称做自连接。join_type  指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接 (INNER JOIN) 使用比较运算符进行表间某 (些) 列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。 

外连接分为左外连接 (LEFT OUTER JOIN 或 LEFT JOIN)、右外连接(RIGHT OUTER JOIN 或 RIGHT JOIN) 和全外连接 (FULL OUTER JOIN 或 FULL JOIN) 三种。与内连接不同的是,外连接不只列出与连接条件相匹配的行,而是列出左表 (左外连接时)、右表(右外连接时) 或两个表 (全外连接时) 中所有符合搜索条件的数据行。 

交叉连接 (CROSS JOIN) 没有 WHERE  子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 

连接操作中的 ON (join_condition)  子句指出连接条件,它由被连接表中的列和比较运算符、逻辑运算符等构成。 

无论哪种连接都不能对 text、ntext 和 image 数据类型列进行直接连接,但可以对这三种列进行间接连接。例如: 

SELECT p1.pub_id,p2.pub_id,p1.pr_info 
FROM pub_info AS p1 INNER JOIN pub_info AS p2 
ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info) 

(一)内连接  

内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分三种: 

1、等值连接:在连接条件中使用等于号 (=) 运算符比较被连接列的列值,其查询结果中列出被连接表中的所有列,包括其中的重复列。 

2、不等连接:  在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些运算符包括、=、=、、!、! 和。 

3、自然连接:在连接条件中使用等于 (=) 运算符比较被连接列的列值,但它使用选择列表指出查询结果集合中所包括的列,并删除连接表中的重复列。 

例,下面使用等值连接列出 authors 和 publishers 表中位于同一城市的作者和出版社: 

SELECT * 
FROM authors AS a INNER JOIN publishers AS p 
ON a.city=p.city 

又如使用自然连接,在选择列表中删除 authors  和 publishers  表中重复列(city 和 state): 

SELECT a.*,p.pub_id,p.pub_name,p.country 
FROM authors AS a INNER JOIN publishers AS p 
ON a.city=p.city 

(二)外连接  

内连接时,返回查询结果集合中的仅是符合查询条件 ( WHERE  搜索条件或  HAVING  条件) 和连接条件的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表 (左外连接时)、右表(右外连接时) 或两个边接表 (全外连接) 中的所有数据行。 

如下面使用左外连接将论坛内容和作者信息连接起来: 

SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b 
ON a.username=b.username 

下面使用全外连接将 city 表中的所有作者以及 user 表中的所有作者,以及他们所在的城市: 

SELECT a.*,b.* 
FROM city as a FULL OUTER JOIN user as b 
ON a.username=b.username 

(三)交叉连接  

交叉连接不带 WHERE  子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 

例,titles 表中有 6 类图书,而 publishers 表中有 8 家出版社,则下列交叉连接检索到的记录数将等于 6 *8=48 行。 

SELECT type,pub_name 
FROM titles CROSS JOIN publishers 
ORDER BY type

介绍了表连接,更确切的说是 inner joins 內连接. 
內连接仅选出两张表中互相匹配的记录.因此,这会导致有时我们需要的记录没有包含进来。 
为更好的理解这个概念,我们介绍两个表作演示。苏格兰议会中的政党表 (party) 和议员表(msp)。 

party(Code,Name,Leader) 
Code:  政党代码  
Name:  政党名称  
Leader:  政党领袖  

msp(Name,Party,Constituency) 
Name:  议员名  
Party:  议员所在政党代码  
Constituency:  选区  

在介绍左连接、右连接和全连接前,有一个数据库中重要的概念要介绍一下,即空值(NULL)。 

有时表中,更确切的说是某些字段值,可能会出现空值,  这是因为这个数据不知道是什么值或根本就不存在。 
空值不等同于字符串中的空格,也不是数字类型的 0。因此,判断某个字段值是否为空值时不能使用 =, 这些  
判断符。必需有专用的短语:IS NULL  来选出有空值字段的记录,同理,可用  IS NOT NULL  选出不包含空值的记录。 

例如:下面的语句选出了没有领导者的政党。(不要奇怪,苏格兰议会中确实存在这样的政党) 

SELECT code, name FROM party 
WHERE leader IS NULL 

又如:一个议员被开除出党,看看他是谁。(即该议员的政党为空值) 

SELECT name FROM msp 
WHERE party IS NULL 

好了,让我们言归正传,看看什么叫左连接、右连接和全连接。 

A left join(左连接)包含所有的左边表中的记录甚至是右边表中没有和它匹配的记录。 
同理,也存在着相同道理的  right join(右连接),即包含所有的右边表中的记录甚至是左边表中没有和它匹配的记录。 
而 full join(全连接)顾名思义,左右表中所有记录都会选出来。 

讲到这里,有人可能要问,到底什么叫:包含所有的左边表中的记录甚至是右边表中没有和它匹配的记录。 
Ok, 我们来看一个实例: 

SELECT msp.name, party.name 
FROM msp JOIN party ON party=code 

这个是我们上一节所学的 Join(注意:也叫 inner join),这个语句的本意是列出所有议员的名字和他所属政党。 
你可以在 http://sqlzoo.cn/4.htm  亲自执行一下该语句,看看结果是什么。 

很遗憾,我们发现该查询的结果少了两个议员:Canavan MSP, Dennis。为什么,因为这两个议员不属于任  
和政党,即他们的政党字段 (Party) 为空值。那么为什么不属于任何政党就查不出来了?这是因为空值在  
作怪。因为议员表中政党字段 (Party) 的空值在政党表中找不到对应的记录作匹配,即  
FROM msp JOIN party ON party=code 没有把该记录连接起来,而是过滤出去了。 
在该短语中,msp 在 Join 的左边,所有称为左表。party 在 Join 的右边,所有称为右表。 

Ok, 现在再看看这句话,“包含所有的左边表中的记录甚至是右边表中没有和它匹配的记录”, 
意思应该很明白了吧。执行下面这个语句,那两个没有政党的议员就漏不了了。 

SELECT msp.name, party.name 
FROM msp LEFT JOIN party ON party=code 

关于右连接, 看看这个查询就明白了: 

SELECT msp.name, party.name 
FROM msp RIGHT JOIN party ON msp.party=party.code 

这个查询的结果列出所有的议员和政党,包含没有议员的政党,但不包含没有政党的议员。 

那么既要包含没有议员的政党,又要包含没有政党的议员该怎么办呢,对了,全连接(full join)。 

SELECT msp.name, party.name 
FROM msp FULL JOIN party ON msp.party=party.code
当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行查询。

感谢各位的阅读,以上就是“数据库的左连接、右连接和全连接用法”的内容了,经过本文的学习后,相信大家对数据库的左连接、右连接和全连接用法这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是丸趣 TV,丸趣 TV 小编将为大家推送更多相关知识点的文章,欢迎关注!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-07-28发表,共计4027字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)