SQL的各种连接(cross join、inner join、full join)的用法理解

SQL的各种连接(cross join、inner join、full join)的用法理解

SQL中的连接可以分为内连接,外连接,以及交叉连接 。

1. 交叉连接CROSS JOIN

如果不带WHERE条件子句,它将会返回被连接的两个表的笛卡尔积,返回结果的行数等于两个表行数的乘积;

举例,下列A、B、C 执行结果相同,但是效率不一样:

A:SELECT * FROM table1 CROSS JOIN table2

B:SELECT * FROM table1,table2

 

C:select * from table1 a inner join table2 b

A:select a.*,b.* from table1 a,table2 b where a.id=b.id

B:select * from table1 a cross join table2 b where a.id=b.id (注:cross join后加条件只能用where,不能用on)

C:select * from table1 a inner join table2 b on a.id=b.id

一般不建议使用方法A和B,因为如果有WHERE子句的话,往往会先生成两个表行数乘积的行的数据表然后才根据WHERE条件从中选择。 

因此,如果两个需要求交际的表太大,将会非常非常慢,不建议使用。

2. 内连接INNER JOIN

两边表同时符合条件的组合

如果仅仅使用

SELECT * FROM table1 INNER JOIN table2

内连接如果没有指定连接条件的话,和笛卡尔积的交叉连接结果一样,但是不同于笛卡尔积的地方是,没有笛卡尔积那么复杂要先生成行数乘积的数据表,内连接的效率要高于笛卡尔积的交叉连接。

但是通常情况下,使用INNER JOIN需要指定连接条件。

 

***************关于等值连接和自然连接

等值连接(=号应用于连接条件, 不会去除重复的列)

自然连接(会去除重复的列)

数据库的连接运算都是自然连接,因为不允许有重复的行(元组)存在。

例如:

SELECT * FROM table1 AS a INNER JOIN table2 AS b on a.column=b.column

3. 外连接OUTER JOIN

指定条件的内连接,仅仅返回符合连接条件的条目。

外连接则不同,返回的结果不仅包含符合连接条件的行,而且包括左表(左外连接时), 右表(右连接时)或者两边连接(全外连接时)的所有数据行。

1)左外连接LEFT [OUTER] JOIN

显示符合条件的数据行,同时显示左边数据表不符合条件的数据行,右边没有对应的条目显示NULL

例如

SELECT * FROM table1 AS a LEFT [OUTER] JOIN ON a.column=b.column

2)右外连接RIGHT [OUTER] JOIN

显示符合条件的数据行,同时显示右边数据表不符合条件的数据行,左边没有对应的条目显示NULL

例如

SELECT * FROM table1 AS a RIGHT [OUTER] JOIN ON a.column=b.column

3)全外连接full [outer] join

显示符合条件的数据行,同时显示左右不符合条件的数据行,相应的左右两边显示NULL,即显示左连接、右连接和内连接的并集

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/113602.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 从零开始学习UCOSII操作系统4–任务管理

    从零开始学习UCOSII操作系统4–任务管理从零开始学习UCOSII操作系统4–任务管理1、重讲任务(1)任务可以是一个无限的循环,也可以在一次执行完毕后被删除。这里需要注意的是,任务的代码并不是真正的删除了,而是UCOSII不再理会该任务代码,所以该任务代码不会再执行。(2)建立任务,OSTaskCreate()如果想让UCOSII管理用户的任务,必须先建立任务,可以通过将任务的地址(函数名)和其他参数传递到

    2022年5月24日
    44
  • idea2021永久激活码【中文破解版】

    (idea2021永久激活码)本文适用于JetBrains家族所有ide,包括IntelliJidea,phpstorm,webstorm,pycharm,datagrip等。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html…

    2022年3月30日
    198
  • idea2021.8激活码【永久激活】[通俗易懂]

    (idea2021.8激活码)2021最新分享一个能用的的激活码出来,希望能帮到需要激活的朋友。目前这个是能用的,但是用的人多了之后也会失效,会不定时更新的,大家持续关注此网站~IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html…

    2022年3月22日
    61
  • oracle number整数,Oracle number类型的语法和用法

    oracle number整数,Oracle number类型的语法和用法Oraclenumber类型的语法很简单,就是:number(p,s)p,s都是可选的,假如都不填,p默认为38,s默认为-48~127。1.精度(precision),或总位数。默认情况下,精度为38位,取值范围是1~38之间。也可以用字符*表示38。2.小数位置(scale),或小数点右边的位数。小数位数的合法值为-48~127,其默认值取决于是否指定了精度。如果没有知道精度,小数位数则默…

    2022年7月24日
    16
  • DataX使用指南

    DataX使用指南简介DataX是阿里巴巴集团内被广泛使用的离线数据同步工具/平台,实现包括MySQL、Oracle、HDFS、Hive、OceanBase、HBase、OTS、ODPS等各种异构数据源之间高效的数据同步功能。DataX采用了框架+插件的模式,目前已开源,代码托管在github。DataX安装部署及小试1.下载压缩包:下载页面地址:https://github.com/a…

    2022年5月16日
    52
  • matlab如何批量读取图片_nu(n)*nu(n)卷积

    matlab如何批量读取图片_nu(n)*nu(n)卷积有一张RGB的图像,我们要在这个图像的周围加上填充元素,使得这个图像不会再卷积操作后导致边缘信息丢失和图像尺寸的减小。为此,我们需要padding操作,numpy库中对这个进行了封装numpy.pad()函数:对一个一维数组来说:但是我们的图像至少是二维的(灰度图),我们要在这样的格式下进行填充,就需要理解到图像在空间位置上的脑补图:在参数传递中,我们只需要计算…

    2022年8月13日
    5

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号