【SQL】详解SQL Server连接(内连接、外连接、交叉连接)

有两个表A和表B。表A结构如下: Aidint;标识种子,主键自增ID Anamevarchar 数据情况

即用select * from A出来的记录情况如下图1所示:

<figcaption> 1:A 表数据 </figcaption>

 

表B结构如下: Bidint;标识种子,主键自增ID Bnameidint 数据情况,即用select * from B出

来的记录情况如下图2所示:

<figcaption> 2:B 表数据 </figcaption>

为了把BidAid加以区分,不让大家有误解,所以把Bid的起始种子设置为100。有SQL基本知识的人都知道,两个表要做连接,就必须有个连接字段,从上表中的数据可以看出,A表中的AidB表中的

Bnameid就是两个连接字段。下图3说明了连接的所有记录集之间的关系:

<figcaption> 3: 连接关系图  </figcaption>

 

现在我们对内连接和外连接一一讲解。 

1.内连接:利用内连接可获取两表的公共部分的记录,即图3的记录集C 语句如下:Select * ,from A JOIN B ,ON A.Aid=B.Bnameid 运行结果如下图4所示:其实select * from A,B where A.Aid=B.BnameidSelect * from A JOIN B ON A.Aid=B.Bnameid的运行结果是一样的。

<figcaption> 4: 内连接数据 </figcaption>

 

 2.外连接:外连接分为两种,一种是左连接(Left JOIN)和右连接(Right JOIN

 (1)左连接Left JOIN):即图3公共部分记录集C+表A记录集A1

 语句如下:select *

from A Left JOIN B

ON A.Aid=B.Bnameid 

运行结果如下图5所示:

<figcaption> 5: 左连接数据      </figcaption>

 

说明:在语句中,A在B的左边,并且是Left Join,所以其运算方式为:A左连接B的记录=3公共部分

记录集C+表A记录集A1

在图3中即记录集C中的存在的Aid为:2 3 6 7 8 

图1中即表A所有记录集A中存在的Aid为:1 2 3 4 5 6 7 8 9  

表A记录集A1中存在的Aid=(图1中即A表中所有Aid)-(图3中即记录集C中存在的Aid),最终得出为:1 4 5 9  

由此得出图5中A左连接B的记录=图3公共部分记录集C+表A记录集A1, 最终得出的结果图5中可以看出Bnameid及Bid非NULL的记录都为图3公共部分记录集C中的记录;Bnameid及Bid为NULL的Aid为1 4 5 9的四笔记录就是表A记录集A1中存在的Aid。

 

 (2)右连接Right JOIN):即图3公共部分记录集C+表B记录集B1

语句如下:select *

from A Right JOIN B

ON A.Aid=B.Bnameid  

运行结果如下图6所示:

<figcaption> 6: 右连接数据  </figcaption>

 

说明: 在语句中,A在B的左边,并且是Right Join,所以其运算方式为:A右连接B的记录=3公共部分记录集C+表B记录集B1 

在图3中即记录集C中的存在的Aid为:2 3 6 7 8  

图2中即表B所有记录集B中存在的Bnameid为:2 3 6 7 8 11  

表B记录集B1中存在的Bnameid=(图2中即B表中所有Bnameid)-(图3中即记录集C中存在的Aid),最终得出为:11  

由此得出图6中A右连接B的记录=图3公共部分记录集C+表B记录集B1, 最终得出的结果图6中可以看出Aid及Aname非NULL的记录都为图3公共部分记录集C中的记录;Aid及Aname为NULL的Aid为11的记录就是表B记录集B1中存在的Bnameid。   

 

全连接

概念:返回左表和右表中的所有行。当某行在另一表中没有匹配行,则另一表中的列返回空值

  1.    select * 
  2.    from  T_student s full join T_class c 
  3.   on s.classId = c.classId

 结果是:

  总结:返回左表和右表中的所有行。

 

交叉连接(CROSS JOIN:也称迪卡尔积

    概念:不带WHERE条件子句,它将会返回被连接的两个表的笛卡尔积,返回结果的行数等于两个表行数的乘积(例如:T_student和T_class,返回4*4=16条记录),如果带where,返回或显示的是匹配的行数

 

2、有where子句,往往会先生成两个表行数乘积的数据表,然后才根据where条件从中选择。

查询结果跟内连接的查询结果是一样。

全部评论

相关推荐

11-11 14:21
西京学院 C++
无敌混子大王:首先一点,不管学校层次怎么样,教育经历放在第一页靠上位置,第一页看不到教育经历,hr基本直接扔掉了
点赞 评论 收藏
分享
10-04 17:25
门头沟学院 Java
snqing:Java已经饱和了,根本不缺人。随便一个2000工资的都200人起投递
点赞 评论 收藏
分享
评论
点赞
收藏
分享
正在热议
# 25届秋招总结 #
440109次浏览 4488人参与
# 春招别灰心,我们一人来一句鼓励 #
41383次浏览 524人参与
# 北方华创开奖 #
107266次浏览 599人参与
# 地方国企笔面经互助 #
7916次浏览 18人参与
# 虾皮求职进展汇总 #
113709次浏览 881人参与
# 实习,投递多份简历没人回复怎么办 #
2453743次浏览 34846人参与
# 阿里云管培生offer #
119706次浏览 2219人参与
# 实习必须要去大厂吗? #
55563次浏览 960人参与
# 同bg的你秋招战况如何? #
75265次浏览 549人参与
# 提前批简历挂麻了怎么办 #
149784次浏览 1977人参与
# 投递实习岗位前的准备 #
1195605次浏览 18546人参与
# 你投递的公司有几家约面了? #
33170次浏览 188人参与
# 双非本科求职如何逆袭 #
661802次浏览 7394人参与
# 机械人春招想让哪家公司来捞你? #
157587次浏览 2267人参与
# 如果公司给你放一天假,你会怎么度过? #
4717次浏览 54人参与
# 如果你有一天可以担任公司的CEO,你会做哪三件事? #
11266次浏览 263人参与
# 发工资后,你做的第一件事是什么 #
12368次浏览 61人参与
# 工作中,努力重要还是选择重要? #
35546次浏览 384人参与
# 参加完秋招的机械人,还参加春招吗? #
20072次浏览 240人参与
# 实习想申请秋招offer,能不能argue薪资 #
39211次浏览 314人参与
# 我的上岸简历长这样 #
451881次浏览 8088人参与
# 非技术岗是怎么找实习的 #
155832次浏览 2120人参与
牛客网
牛客企业服务