连接可以在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 
当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行查询。

数据库 左连接 右连接 全连接用法小结相关推荐

  1. mysql a左外连接b b左外连接c_数据库中的 内连接,外连接(左连接,左外连接,右连接,右外连接),全连接,交叉连接...

    数据库的连接类型:内连接,外连接,全连接 ,交叉连接 作用:连接是关系数据库的特点,数据的关联查询用到 多表连接 提高查询效率 前段时间面试被问到数据库的内连接和外连接的问题,进过一番周折的无师自通, ...

  2. 【MySQL】MySQL 的连接(内、左、右、全)

    一.表 的连 结 1.目的:减少数据的冗余 2.核心:分类 ***连接时至少要两张表,连接主要有内连接(inner join).左外连接(left outer join).右外连接(right out ...

  3. SQL中的连接(左、右、内连接)

    目录 左连接(LEFT JOIN或LEFT OUTER JOIN): 右连接(RIGHT JOIN或RIGHT OUTER JOIN): 内连接(INNER JOIN也叫等值连接): 全连接(FULL ...

  4. MySQL sql99语法—左(右)外连接

    应用场景:用于查询一个表中有,另一个表中没有的记录. 特点: 外连接的查询结果为主表中的所有记录,如果从表中有和他匹配的,则显示匹配的值,如果从表中没有,则显示 null. 外连接查询结果 = 内连接 ...

  5. linux 网络端口全连接扫描,端口全连接扫描程序(Linux, socket):TCP的connect方式...

    TCP建立连接需要使用三次握手协议.在Linux下的socket API,服务器使用socket, bind, listen, accept的过程打开并且监听端口,客户端使用socket,bind(可 ...

  6. 单连接算法与全连接算法

    https://blog.csdn.net/tyh70537/article/details/76768802

  7. 图解MySQL 内连接、外连接、左连接、右连接、全连接……太多了

    用两个表(a_table.b_table),关联字段a_table.a_id和b_table.b_id来演示一下MySQL的内连接.外连接( 左(外)连接.右(外)连接.全(外)连接). MySQL版 ...

  8. <MySQL>内连接、左连接、右连接和全连接

    文章目录 1.内连接 2.左连接 3.右连接 4.全连接 假设现在有这么两张表a,b: a表: b表: 那么两张表中,id相同的有b.c.d三行 1.内连接 内连接的关键字是inner join,把条 ...

  9. SQL 左外连接,右外连接,全连接,内连

    SQL 左外连接,右外连接,全连接,内连接       连接条件可在FROM或WHERE子句中指定,建议在FROM子句中指定连接条件.WHERE和HAVING子句也可以包含搜索条件,以进一步筛选连接条 ...

  10. MySQL数据库基础(多表关联查询、内外全连接、复合条件查询、子查询)

    文章目录 一.笛卡尔积查询 二.内.外.全连接查询 三.复合条件查询 四.子查询 五.EXIST判断 本篇文章主要介绍MySQL里的多表关联查询,其中包括了笛卡尔积查询.内连接查询.外连接查询.全连接 ...

最新文章

  1. Silverlight初级教程-开发工具
  2. 阿里云 Serverless 事件总线 EventBridge 重磅发布
  3. 1091 N-自守数
  4. sublime3 ctl+b无效
  5. hadoop的限制/不足
  6. JEECG Excel 实体类
  7. Fragment生命周期及其使用
  8. MYSQL_BIND结构体_bindColumn、bindParam与bindValue的区别
  9. 百度搜索引擎关键字URL采集爬虫优化行业定投方案高效获得行业流量-笔记篇
  10. [置顶] Jquery学习总结(二) jquery选择器详解
  11. [Java] - 项目中的防止同用户异地登录问题
  12. 清华大学 计算机系 研究生导师,清华大学计算机科学与技术系研究生导师简介-胡事民...
  13. java中word转pdf/word转图片/word转html/html转word等操作
  14. edg击败we视频_lpl2018春季赛2月4日WEvsEDG比赛视频:EDG2:1击败WE
  15. web前端开发是什么?
  16. 实现PPT演示的"非全屏播放"效果
  17. 如何系统学习领域驱动设计(DDD)?
  18. 机器自动翻译古文拼音 - 十大宋词 - 青玉案 凌波不过横塘路 贺铸
  19. document.referrer之隐藏来源
  20. iframe 、frameset 、frame的区别

热门文章

  1. map评价吗 voc数据集可以用coco_目标检测评价指标(mAP)
  2. matlab遗传算法RGV,基于遗传算法的RGV智能车动态调度
  3. 阿里达摩院做 AI 这两年
  4. 单细胞测序分析 batch effect 消除工具测评
  5. 童诗白模电--功率放大电路
  6. MATLAB卷积运算解释(conv、conv2、convn)
  7. 用Windows自带的程序打开一个Txt文件
  8. 学习日记11--常微分方程数值解法
  9. ESP8266_Linux环境搭建
  10. Binary Tree 非递归遍历模板小结(经典!)