1、内联接(典型的联接运算,使用像 =  或 <> 之类的比较运算符)。包括相等联接和自然联接。

内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行。例如,检索 students和courses表中学生标识号相同的所有行。

2、外联接。外联接可以是左向外联接、右向外联接或完整外部联接。

在 FROM子句中指定外联接时,可以由下列几组关键字中的一组指定:

1)LEFT  JOIN或LEFT OUTER JOIN

左向外联接的结果集包括  LEFT OUTER子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值。

2)RIGHT  JOIN 或 RIGHT  OUTER  JOIN

右向外联接是左向外联接的反向联接。将返回右表的所有行。如果右表的某行在左表中没有匹配行,则将为左表返回空值。

3)FULL  JOIN 或 FULL OUTER JOIN

完整外部联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。

3、交叉联接

交叉联接返回左表中的所有行,左表中的每一行与右表中的所有行组合。交叉联接也称作笛卡尔积。

FROM 子句中的表或视图可通过内联接或完整外部联接按任意顺序指定;但是,用左或右向外联接指定表或视图时,表或视图的顺序很重要。有关使用左或右向外联接排列表的更多信息,请参见使用外联接。

例子:

-------------------------------------------------

  1. a表 id name b表 id job parent_id
  2. 1 张3 1 23 1
  3. 2 李四 2 34 2
  4. 3 王武 3 34 4
  5. a.id同parent_id 存在关系

--------------------------------------------------

1) 内连接

  1. select a.*,b.* from a inner join b on a.id=b.parent_id
  2. 结果是
  3. 1 张3 1 23 1
  4. 2 李四 2 34 2

2)左连接

  1. select a.*,b.* from a left join b on a.id=b.parent_id
  2. 结果是
  3. 1 张3 1 23 1
  4. 2 李四 2 34 2
  5. 3 王武 null

3) 右连接

  1. select a.*,b.* from a right join b on a.id=b.parent_id
  2. 结果是
  3. 1 张3 1 23 1
  4. 2 李四 2 34 2
  5. null 3 34 4

4) 完全连接

  1. select a.*,b.* from a full join b on a.id=b.parent_id
  2. 结果是
  3. 1 张3 1 23 1
  4. 2 李四 2 34 2
  5. null    3 34 4
  6. 3 王武 null

--------------------------------------------------------------------------------------------

一、交叉连接(CROSS JOIN)

交叉连接(CROSS JOIN):有两种,显式的和隐式的,不带ON子句,返回的是两表的乘积,也叫笛卡尔积(没有条件的inner join)。

例如:下面的语句1和语句2的结果是相同的。

语句1:隐式的交叉连接,没有CROSS JOIN。

  1. SELECT O.ID, O.ORDER_NUMBER, C.ID, C.NAME
  2. FROM ORDERS O , CUSTOMERS C
  3. WHERE O.ID=1;

语句2:显式的交叉连接,使用CROSS JOIN。

  1. SELECT O.ID,O.ORDER_NUMBER,C.ID,
  2. C.NAME
  3. FROM ORDERS O CROSS JOIN CUSTOMERS C
  4. WHERE O.ID=1;

语句1和语句2的结果是相同的,查询结果如下:

二、内连接(INNER JOIN)

内连接(INNER JOIN):有两种,显式的和隐式的,返回连接表中符合连接条件和查询条件的数据行。(所谓的链接表就是数据库在做查询形成的中间表)。

例如:下面的语句3和语句4的结果是相同的。

语句3:隐式的内连接,没有INNER JOIN,形成的中间表为两个表的笛卡尔积。

  1. SELECT O.ID,O.ORDER_NUMBER,C.ID,C.NAME
  2. FROM CUSTOMERS C,ORDERS O
  3. WHERE C.ID=O.CUSTOMER_ID;

语句4:显示的内连接,一般称为内连接,有INNER JOIN,形成的中间表为两个表经过ON条件过滤后的笛卡尔积。

  1. SELECT O.ID,O.ORDER_NUMBER,C.ID,C.NAME
  2. FROM CUSTOMERS C INNER JOIN ORDERS O ON C.ID=O.CUSTOMER_ID;

语句3和语句4的查询结果:

三、外连接(OUTER JOIN):外连不但返回符合连接和查询条件的数据行,还返回不符合条件的一些行。外连接分三类:左外连接(LEFT OUTER JOIN)、右外连接(RIGHT OUTER JOIN)和全外连接(FULL OUTER JOIN)。

三者的共同点是都返回符合连接条件和查询条件(即:内连接)的数据行。不同点如下:

左外连接还返回左表中不符合连接条件单符合查询条件的数据行。

右外连接还返回右表中不符合连接条件单符合查询条件的数据行。

全外连接还返回左表中不符合连接条件单符合查询条件的数据行,并且还返回右表中不符合连接条件单符合查询条件的数据行。全外连接实际是上左外连接和右外连接的数学合集(去掉重复),即“全外=左外 UNION 右外”。

说明:左表就是在“(LEFT OUTER JOIN)”关键字左边的表。右表当然就是右边的了。在三种类型的外连接中,OUTER 关键字是可省略的。

下面举例说明:

语句5:左外连接(LEFT OUTER JOIN)

  1. SELECT O.ID,O.ORDER_NUMBER,O.CUSTOMER_ID,C.ID,C.NAME
  2. FROM ORDERS O LEFT OUTER JOIN CUSTOMERS C ON C.ID=O.CUSTOMER_ID;

语句6:右外连接(RIGHT OUTER JOIN)

  1. SELECT O.ID,O.ORDER_NUMBER,O.CUSTOMER_ID,C.ID,C.NAME
  2. FROM ORDERS O RIGHT OUTER JOIN CUSTOMERS C ON C.ID=O.CUSTOMER_ID;

注意:WHERE条件放在ON后面查询的结果是不一样的。例如:

语句7:WHERE条件独立。

  1. SELECT O.ID,O.ORDER_NUMBER,O.CUSTOMER_ID,C.ID,C.NAME
  2. FROM ORDERS O LEFT OUTER JOIN CUSTOMERS C ON C.ID=O.CUSTOMER_ID
  3. WHERE O.ORDER_NUMBER<>'MIKE_ORDER001';

语句8:将语句7中的WHERE条件放到ON后面。

  1. SELECT O.ID,O.ORDER_NUMBER,O.CUSTOMER_ID,C.ID,C.NAME
  2. FROM ORDERS O LEFT OUTER JOIN CUSTOMERS C ON C.ID=O.CUSTOMER_ID AND O.ORDER_NUMBER<>'MIKE_ORDER001';

从语句7和语句8查询的结果来看,显然是不相同的,语句8显示的结果是难以理解的。因此,推荐在写连接查询的时候,ON后面只跟连接条件,而对中间表限制的条件都写到WHERE子句中。

语句9:全外连接(FULL OUTER JOIN)。

  1. SELECT O.ID,O.ORDER_NUMBER,O.CUSTOMER_ID,C.ID,C.NAME
  2. FROM ORDERS O FULL OUTER JOIN CUSTOMERS C ON C.ID=O.CUSTOMER_ID;

注意:MySQL是不支持全外的连接的,这里给出的写法适合Oracle和DB2。但是可以通过左外和右外求合集来获取全外连接的查询结果。下图是上面SQL在Oracle下执行的结果:

语句10:左外和右外的合集,实际上查询结果和语句9是相同的。

  1. SELECT O.ID,O.ORDER_NUMBER,O.CUSTOMER_ID,C.ID,C.NAME
  2. FROM ORDERS O LEFT OUTER JOIN CUSTOMERS C ON C.ID=O.CUSTOMER_ID
  3. UNION
  4. SELECT O.ID,O.ORDER_NUMBER,O.CUSTOMER_ID,C.ID,C.NAME
  5. FROM ORDERS O RIGHT OUTER JOIN CUSTOMERS C ON C.ID=O.CUSTOMER_ID;
-- from: http://www.shuchengxian.com/Article/info/id/168.html

深入理解MySQL的外连接、内连接、交叉连接相关推荐

  1. Mysql中外连接,内连接,左连接,右连接的区别

    养成习惯,先赞后看!!! 目录 1. 前言 2. 外连接 2.1左连接 2.2右连接 3. 内连接 1. 前言 相信大家一定都做过多表的连表查询,并且这其中的查询方式也比较多样. 可能主要就是下面这几 ...

  2. SQL语法 自然连接 外连接 内连接

    文章目录 笛卡尔积 连接 内连接 自连接 自然连接 外连接 左外连接 右外连接 区分连接 自然连接 内连接 内连接.外连接 on 和 where 条件过滤的区别 参考链接 笛卡尔积 结果集数目为多个表 ...

  3. 简单的mysql左链接_简单谈谈mysql左连接内连接

    前言 最近忙着开发x省冷链追溯系统,天天干到晚上十一点多才回到家,周末也加班,没啥时间写博客,闲下来再好好写写 业务: sql语句统计出入库数据. 问题:只统计了X端入库单. 原因: 没有发现X端的数 ...

  4. MySQL什么用于左连接_简单谈谈mysql左连接内连接

    前言 最近忙着开发x省冷链追溯系统,天天干到晚上十一点多才回到家,周末也加班,没啥时间写博客,闲下来再好好写写 业务: sql语句统计出入库数据. 问题:只统计了X端入库单. 原因: 没有发现X端的数 ...

  5. mysql 三个表内连接查询_MySQL5.5多表之连接查询

    连接查询 关系型数据库管理系统中,通常将每个实体的所有信息存放在一张表中,当查询数据时,通过连接操作查询多个表中的实体信息,当两个或多个表中存在相同意义的字段时,便可以通过这些字段对不同的表进行连接查 ...

  6. mysql 交叉连接的用法_深入理解MySQL的外连接、内连接、交叉连接

    1.内联接(典型的联接运算,使用像 =  或 <> 之类的比较运算符).包括相等联接和自然联接. 内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行.例如,检索 students和 ...

  7. MySQL为什么要使用内连接而不用外连接

    MySQL内连接获取的数据量比外连接的要少,所以尽量使用内连接.

  8. MySql连接——内连接、外连接(左连接、右连接、全连接)

    1. 内联接 使用比较运算符根据每个表共有的列的值匹配两个表中的行 2. 外联接 1)左联接 left join /left outer join 右表无匹配的时候,行为null,左表的行保留 2)右 ...

  9. MySQL--多表连接(内连接、外连接、交叉连接--笛卡尔积)

    @toc      更多关于数据库知识请加关注哟~~.若需联系博主请私信或者加博主联系方式:      QQ:3327908431      微信:ZDSL1542334210 前言:MySQL一系列 ...

最新文章

  1. Maven的配置以及Eclipse的设置
  2. RAID-5 恢复技术
  3. 金融贷款逾期的模型构建6——特征选择
  4. android string 转成json对象_Android开发:生成桌面快捷方式是这样做的
  5. android 按比例缩放,Android postScale不按比例缩放
  6. vue项目工程中npm run dev 到底做了什么
  7. rust语法丑陋_抛出异常–缓慢而丑陋
  8. shell基础--1
  9. codeforces 676C (尺取法)
  10. 计算机教室戴尔电脑网络同传,如何进入和使用网络同传功能
  11. 已经通过CMMI/CMM3级评估的企业名单
  12. 双向循环链表讲解及实现
  13. antd 实现pdf 预览_react 的pdf预览插件应用
  14. 一则“亿万富翁给妻子捐5亿美元科研经费”的八卦,引发科研筹钱难的思考
  15. SpringbootJPA分页 PageRequest过时
  16. bat文件如何调用另一个bat文件
  17. 2021年P气瓶充装新版试题及P气瓶充装证考试
  18. 工作组可以看到计算机 但是无法访问,Win7中工作组计算机无法访问解决技巧
  19. Flink常用算子Transformation介绍
  20. 程序员有多喜欢树莓派?这7个开发套件让他们爱不释手!

热门文章

  1. web工程中spring+ibatis的单元测试--转载
  2. Java NIO类库Selector机制解析--转
  3. 遍历查询ldap服务器用户
  4. 以太坊联合创始人发明了新语言叫板Vyper,主链之后语言将引领新一轮大战?...
  5. Caffe部署中的几个train-test-solver-prototxt-deploy等说明二
  6. 深入理解分布式技术 - ZooKeeper数据一致性解读
  7. Spring MVC-使用Spring Tool Suite IDE搭建Spring MVC开发环境
  8. Spring-AOP 自动创建代理之AnnotationAwareAspectJAutoProxyCreator
  9. 基础JavaScript_Day02
  10. IP地址中的网络地址和主机地址分别是什么意思?怎么计算的呢?