SQL联合查询inner join、outer join和cross join的区别详解

作者:CODETC 时间:2024-01-14 21:33:41 

对于开发使用到数据库的应用,免不了就要使用联合查询,SQL中常用的联合查询有inner join、outer join和cross join;这三者的区别很多人都应该不是很清楚,包括我自己,下面我们一起来看看,如果你使用join连表,缺陷的情况下是inner join,另外,开发中使用的left join和right join属于outer join,而outer join还包括full join.下面我通过图案让大家认识它们的区别。

现有两张表,Table A 是左边的表。Table B 是右边的表。其各有四条记录,其中有两条记录name是相同的:

SQL联合查询inner join、outer join和cross join的区别详解

1.INNER JOIN 产生的结果是AB的交集


SELECT * FROM TableA INNER JOIN TableB ON TableA.name = TableB.name

SQL联合查询inner join、outer join和cross join的区别详解

2.LEFT [OUTER] JOIN 产生表A的完全集,而B表中匹配的则有值,没有匹配的则以null值取代。


SELECT * FROM TableA LEFT OUTER JOIN TableB ON TableA.name = TableB.name

SQL联合查询inner join、outer join和cross join的区别详解

3.RIGHT [OUTER] JOIN 产生表B的完全集,而A表中匹配的则有值,没有匹配的则以null值取代。


SELECT * FROM TableA RIGHT OUTER JOIN TableB ON TableA.name = TableB.name

图示如left join类似。

4.FULL [OUTER] JOIN 产生A和B的并集。对于没有匹配的记录,则会以null做为值。


SELECT * FROM TableA FULL OUTER JOIN TableB ON TableA.name = TableB.name

你可以通过is NULL将没有匹配的值找出来:


SELECT * FROM TableA FULL OUTER JOIN TableB ON TableA.name = TableB.name
WHERE TableA.id IS null OR TableB.id IS null

SQL联合查询inner join、outer join和cross join的区别详解

5. CROSS JOIN 把表A和表B的数据进行一个N*M的组合,即笛卡尔积。如本例会产生4*4=16条记录,在开发过程中我们肯定是要过滤数据,所以这种很少用。


SELECT * FROM TableA CROSS JOIN TableB

通过上面的比对,相信大家对inner join、outer join和cross join的区别已一目了然了。

补充

为什么最好用join?因为用“,”做表连接的话,A,B表直接产生笛卡尔积,然后在用where筛选结果。但是join连接,A,B表连接的时候就会根据on后面的条件筛选,然后在根据where条件筛选结果

按照sql标准CROSS JOIN是笛卡尔积。但对于mysql来说,CROSS JOIN 相当于 INNER JOIN。

来源:http://www.codetc.com/article-138-1.html

标签:sql,innerjoin,outerjoin,crossjoin,联合查询,区别
0
投稿

猜你喜欢

  • 10个糟糕的IE Bug及其修复

    2010-05-13 16:26:00
  • Vue.js实现微信过渡动画左右切换效果

    2023-07-02 17:03:10
  • Python实现光速定位并提取两个文件的不同之处

    2023-11-01 10:42:25
  • Django分页器的用法详解

    2021-04-20 21:54:14
  • Python中字符串对象语法分享

    2022-04-19 14:48:34
  • Python 实现大整数乘法算法的示例代码

    2022-07-07 02:57:54
  • python实现ftp文件传输功能

    2023-04-21 13:20:16
  • 哈工大自然语言处理工具箱之ltp在windows10下的安装使用教程

    2022-02-23 04:17:19
  • Linux如何添加mysql系统环境变量

    2024-01-24 16:27:54
  • oracle中commit之后进行数据回滚的方法

    2024-01-25 01:00:53
  • python使用xmlrpclib模块实现对百度google的ping功能

    2023-05-06 19:02:21
  • Python使用pycharm导入pymysql教程

    2024-01-17 22:47:49
  • asp 防盗链代码(彻底屏蔽迅雷,旋风,快车下载站内资源)

    2011-02-26 10:46:00
  • 举例详解Python中的split()函数的使用方法

    2021-06-23 07:26:49
  • python os.listdir()乱码解决方案

    2021-09-20 02:52:42
  • jQuery Ajax全解析

    2024-04-09 19:45:00
  • 解决mysql数据库数据迁移达梦数据乱码问题

    2024-01-27 07:40:12
  • Vim中查找替换及正则表达式的使用详解

    2023-11-06 11:42:44
  • python实点云分割k-means(sklearn)详解

    2023-11-06 20:36:03
  • MYSQL5.6.33数据库主从(Master/Slave)同步安装与配置详解(Master-Linux Slave-windows7)

    2024-01-17 00:23:34
  • asp之家 网络编程 m.aspxhome.com