mysql自然连接怎么用 mysql自连接语法

MySQL 中的各种 JOIN 本文主要介绍 SQL 标准中定义mysql自然连接怎么用的各种连接的意义和区别 , 例如 , 交叉连接( CROSS JOIN )、内连接( INNER JOIN )、外连接( OUTER JOIN )、自然连接( NATURAL JOIN )等,并结合例子讲解这些连接在 MySQL 中的语法和表现 。
从网上的资料看,JOIN更多翻译为连接 , 本文中凡是出现中文“连接”的地方都是指JOIN。
本文中用到的所有例子涉及两张表——customers用户表和orders订单表,其中订单表中的cust_id字段表示用户的唯一 ID,也就是用户表的主键cust_id。两张表的数据如下mysql自然连接怎么用:
注:两张表都经过mysql自然连接怎么用了简化,实际业务中这两张表肯定还包括其mysql自然连接怎么用他字段 。
英文维基百科JOIN词条 对连接的定义如下:
翻译过来就是,“连接可以根据一张(自连接)或多张表中的共同值将这些表的列数据合并为一个新的结果集,标准 SQL 定义了五种连接:内连接、左外连接、右外连接、全外连接和交叉连接 。”
也就是说 , 连接是 SQL 标准中定义的一种组合多张表的方式,当然一张表自身也可以和自身组合,称为自连接 。连接后得到的结果集的每一列其实都来自用于连接的多张表 , 不同的连接类型只是区分了这些列具体从哪张表里来 , 列里填充的是什么数据 。
其实英文维基百科的JOIN词条已经把各种连接的类型解释地非常清楚了,非常值得去看一下 。
我们来看一下 SQL 标准中定义的各种连接类型,理解各种连接最好的方法就是把需要连接的表想象成集合 , 并画出可以反映集合的交与并的情况的图——韦恩图,例如下图就画出了 SQL 中定义的几种主要连接 。
请先仔细查看一下图中的内容,mysql自然连接怎么用你可以从中归纳出几种连接类型呢?
虽然图中画了 7 种集合的交并情况,但是总结起来,主要是两种连接类型在起作用——内连接( INNER JOIN )和外连接( OUTER JOIN ),其中外连接又分为了左外连接( LEFT OUTER JOIN )、右外连接( RIGHT OUTER JOIN )和全外连接( FULL OUTER JOIN ) 。
下面先简单介绍一下 SQL 标准中各种连接的定义 , 然后在「MySQL 中的连接」一节再用例子来演示 MySQL 中支持的各种连接 。
连接既然是用来合并多张表的,那么要定义一个连接就必须指定需要连接的表,并指定可选的连接条件 。例如 , 一个典型的 SQL 连接语句如下:
我们用表 A 和表 B 指代需要连接的两张表 , 经过 内连接 后得到的结果集 仅 包含所有满足 连接条件 的数据;而经过 外连接 后得到的数据集 不仅 包含满足 连接条件 的数据,还包含其他数据,具体的差别是:
在上面「SQL 标准定义的主要连接」一图中并没有列出交叉连接 , 交叉连接会对连接的两张表做笛卡尔积,也就是连接后的数据集中的行是由第一张表中的每一行与第二张表中的每一行配对而成的,而不管它们 逻辑上 是否可以搭配在一起 。假设交叉连接的两张表分别有 m 和 n 行数据,那么交叉连接后的数据集就包含 m 乘以 n 行数据 。
连接根据连接的条件不同,又可以区分为等值连接和非等值连接,「SQL 标准定义的主要连接」图中画出的连接的连接条件都是比较两个字段是否相等,它们都是等值连接 。
自然连接是等值连接的一种特殊形式,自然连接会自动选取需要连接的两张表中字段名相同的 所有 列做相等比较,而不需要再指定连接条件了 。
注:以下内容全部基于 MySQL 5.7 版本,所有例子只保证在 MySQL 5.7 上是可以正确执行的 。
MySQL 中支持的连接类型和关键字如下:
上面的表示方法摘自 MySQL 5.7 版本 官方文档 , 其中|表示两者皆可出现, []表示的是可选的 , {}表示的是必选的 , 例如NATURAL LEFT JOIN和NATURAL JOIN都是合法的 。
可以看到,除了全外连接( FULL OUTER JOIN )以外, MySQL 基本支持了 SQL 标准中定义的各种连接 。在 MySQL 中全外连接可以通过UNION合并的方式做到,当然前提是你知道自己为什么需要这么做,具体参见: Full Out Join in MySQL。
MySQL 语法中还支持一个并不在 SQL 标准中的STRAIGHT_JOIN ,它在 表现上 和内连接或者交叉连接并无区别,只是一种给 MySQL 优化器的一个提示,STRAIGHT_JOIN提示 MySQL 按照语句中表的顺序加载表,只有在你明确清楚 MySQL 服务器对你的JOIN语句做了负优化的时候才可能用到它 。
还有一点需要说明的是 , 根据 官方文档 ,在 MySQL 中 , JOIN 、 CROSS JOIN和INNER JOIN实现的功能是一致的 , 它们在语法上是等价的 。从语义上来说, CROSS JOIN特指无条件的连接(没有指定ON条件的JOIN或者没有指定WHERE连接条件的多表SELECT ),INNER JOIN特指有条件的连接(指定了ON条件的JOIN或者指定了WHERE连接条件的多表SELECT ) 。当然,如果你非要写... CROSS JOIN ... ON ...这样的语法,也是可以执行的,虽然写着交叉连接 , 实际上执行的是内连接 。
下面我们就用例子来看一看 MySQL 中支持的几种连接的例子 。
注:下面的例子都没有指定ORDER BY子句,返回结果的顺序可能会因为数据插入顺序的不同而略有不同 。
MySQL 的交叉连接或内连接有两种写法,一种是使用JOIN并用ON或者USING 子句指定连接条件的写法,一种是普通的SELECT多表,并且用WHERE子句指定连接的键的写法 。
下面的例子是一个交叉连接:
上面的写法等价于:
当然,第二种写法中如果将CROSS JOIN替换成JOIN或者INNER JOIN也是可以正确执行的 。上面两条语句的执行结果如下:
可以看到共返回了 30 行结果,是两张表的笛卡尔积 。
一个内连接的例子如下:
上面的写法等价于:
在连接条件比较的字段相同的情况下,还可以改用USING关键字,上面的写法等价于:
上面三条语句的返回结果如下:
可以看到只返回了符合连接条件customers.cust_id = orders.cust_id的 6 行结果 , 结果的含义是所有有订单的用户和他们的订单 。
左外连接和右外连接的例子如下,其中的OUTER关键字可以省略:
其中右外连接的返回与内连接的返回是一致的(思考一下为什么),左外连接的返回结果如下:
可以看到一共返回了 8 行数据,其中最后两行数据对应的order_id的值为NULL,结果的含义是所有用户的订单,不管这些用户是否已经有订单存在了 。
根据前面介绍的自然连接的定义,自然连接会自动用参与连接的两张表中 字段名相同 的列做等值比较,由于例子中的customers和orders表只有一列名称相同,我们可以用自然连接的语法写一个与上面的内连接的例子表现行为一样的语句如下:
可以看到,使用自然连接就不能再用ON子句指定连接条件了 , 因为这完全是多余的 。
当然 , 自然连接同样支持左外连接和右外连接 。
下面用一个customers表自连接的例子再来说明一下自然连接,语句如下:
【mysql自然连接怎么用 mysql自连接语法】 因为是自连接,因此必须使用AS指定别名,否则 MySQL 无法区分“两个”customers表 , 运行的结果如下:
可以看到结果集和customers表完全一致,大家可以思考一下为什么结果是这样的 。
文章之前也提到了,MySQL 还支持一种 SQL 标准中没有定义的“方言” , STRAIGHT_JOIN,STRAIGHT_JOIN支持带ON子句的内连接和不带ON子句的交叉连接,我们来看一个STRAIGHT_JOIN版本的内连接的例子:
返回结果与前面内连接的例子是一致的 , 如下:
STRAIGHT_JOIN的表现和JOIN是完全一致的 , 它只是一种给 MySQL 优化器的提示,使得 MySQL 始终按照语句中表的顺序读取表(上面的例子中,MySQL 在执行时一定会先读取customers表,再读取orders表),而不会做改变读取表的顺序的优化 。关于 MySQL 优化器的话题这里不做展开,需要说明的是除非你非常清楚你在做什么,否则不推荐直接使用STRAIGHT_JOIN。
你能理解上面的语句是在检索什么数据吗?
本文主要介绍了 SQL 标准里定义的各种连接的概念 , 以及 MySQL 中的实现,并通过各种例子来介绍了这些连接的区别 。这些连接不一定都能在实际开发中用到,但是做到心中有知识也还是很有必要的 。
那么,现在再回忆一下,什么是内连接、外连接、自连接、等值连接和自然连接?他们的区别是什么?
最后,给大家留一个思考题,为什么 MySQL 中没有左外连接或者右外连接版本的STRAIGHT_JOIN ?
求MySQL 中JOIN 的详细用法1. Nested-Loop Join 翻译过来就是嵌套循环连接,简称 NLJ 。
这种是 MySQL 里最简单、最容易理解的表关联算法 。
比如,拿语句 select * from p1 join p2 using(r1) 来说,
先从表 p1 里拿出来一条记录 ROW1,完了再用 ROW1 遍历表 p2 里的每一条记录,并且字段 r1 来做匹配是否相同 , 以便输出;再次循环刚才的过程,直到两表的记录数对比完成为止 。
2. Block Nested-Loop Join , 块嵌套循环,简称 BNLJ
那 BNLJ 比 NLJ 来说,中间多了一块 BUFFER 来缓存外表的对应记录从而减少了外表的循环次数,也就减少了内表的匹配次数 。还是那上面的例子来说,假设 join_buffer_size 刚好能容纳外表的对应 JOIN KEY 记录,那对表 p2 匹配次数就由 1000 次减少到 1 次,性能直接提升了 1000 倍 。
3. 最近 MySQL 8.0.18 发布,终于推出了新的 JOIN 算法 — HASH JOIN 。
MySQL 的 HASH JOIN 也是用了 JOIN BUFFER 来做缓存,但是和 BNLJ 不同的是,它在 JOIN BUFFER 中以外表为基础建立一张哈希表,内表通过哈希算法来跟哈希表进行匹配,hash join 也就是进一步减少内表的匹配次数 。当然官方并没有说明详细的算法描述 , 以上仅代表个人臆想 。那还是针对以上的 SQL,我们来看下执行计划 。
mysql 里面JOIN 和 INNER JOIN 区别是什么一、指代不同
1、JOIN:用于根据两个或多个表中的列之间的关系,从这些表中查询数据 。
2、INNER JOIN :组合两个表中的记录,只要在公共字段之中有相符的值 。
二、特点不同
1、JOIN:每个主键的值都是唯一的 。这样做的目的是在不重复每个表中的所有数据的情况下,把表间的数据交叉捆绑在一起 。
2、INNER JOIN :只要在这两个表的公共字段之中有相符值,内部联接将组合两个表中的记录 。
三、规定不同
1、JOIN:如果表中有至少一个匹配,则返回行 。
2、INNER JOIN :被联接的字段的名称 。若不是由数字构成的,则这些字段必须为相同的数据类型并包含同类数据,但无须具有相同的名称 。
参考资料来源:百度百科-INNER JOIN
参考资料来源:百度百科-SQL语句大全
sql语句中natural怎么用?你看看这个:
natural
--
1)两个关系(左关系和友关系)中所有具有相同的名称的属性的值要相等 。
2)natural
总是出现在
join语句前面
3)natural的结果关系中,相同名称的属性只会出现一次
4)natural的结果关系中,属性的排列顺序总是按照左关系优先的原则 。
5)
MySQL中 , natural
join不能使用on指定其他查询条件
on--
1)on
用在join语句后面
2)on
后面采用关系1.属性a=关系2.属性b
的谓词语法
连接分类
关系间的连接分为内连接(inner
join)和外连接(outer
join) 。
外连接又可分为:left
outer
join,right
outer
join和full
outer
join 。
内连接计算方法:
如果不加条件将会产生笛卡尔积;
如果有连接条件,按照下一节"连接条件"的规则进行运算,符合条件的元组放入结果关系中 。
left
outer
join
计算过程:
1)计算相同连接条件下的内连接,将符合条件的元组放入结果关系中;
2)如果左关系中有元组不符合条件 , 将之放入结果关系中,余下的用NULL补足
right
outer
join
计算过程:
1)计算相同连接条件下的内连接,将符合条件的元组放入结果关系中;
2)如果右关系中有元组不符合条件,将之放入结果关系中,余下的用NULL补足
full
outer
join
1)计算相同连接条件下的内连接,将符合条件的元组放入结果关系中;
2)如果左、右关系中有元组不符合条件 , 将之放入结果关系中,余下的用NULL补足
as用来修改连接后结果关系的关系名称以及属性名称 。
连接条件
关系之间的连接是可以有条件的 , 外连接必须要加条件,内连接如果不加条件将会产生笛卡尔积 。
有哪些连接条件呢?
natural
--
1)两个关系(左关系和友关系)中所有具有相同的名称的属性的值要相等 。
2)natural
总是出现在
join语句前面
3)natural的结果关系中 , 相同名称的属性只会出现一次
4)natural的结果关系中,属性的排列顺序总是按照左关系优先的原则 。
5)
MySQL中 , natural
join不能使用on指定其他查询条件
on--
1)on
用在join语句后面
2)on
后面采用关系1.属性a=关系2.属性b
的谓词语法
using--
1)和natural类似,只是显式指定了属性名称
2)如果using也指定了所有相同名称的属性,那么和natural相同
MySQL
MySQL中,natural
join和
left
outer
join不能在同时使用 , 可以先将natural
join语句做成一个view,然后再使用left
outer
join
join
默认为inner
join
MySQL中几个关于连接表的问题哎 。你好渊博啊 。
我给你讲下几种链接的含义:
1、自然连接 select * ajoin b on a.id=b.id含义:用a表的id与b表的id进行匹配,匹配上的记录显示,而那些匹配不上的 , 不论是a还是b表的记录都不显示 。
2、外连接:左连接,右链接
左链接:select * aleft join b on a.id=b.id含义:用a表的id与b表的id进行匹配,匹配上的记录显示 , 而那些匹配不上的,保留a表全部的未匹配记录,但b表的未匹配记录不被显示 。
右链接:select * aright join b on a.id=b.id含义:用a表的id与b表的id进行匹配,匹配上的记录显示,而那些匹配不上的 , 保留b表未匹配的记录 , 但a表的未匹配记录不被显示 。
3、全关联:select * afull join b on a.id=b.id含义:用a表的id与b表的id进行匹配,匹配上的记录显示 , 而那些匹配不上的,保留a表和b表全部的未匹配记录 。
4、笛卡尔积:select * a ,b含义:就是用a表的每一条记录都和b表的全部数据组合 。假设a表10条,b表100条,会将a表每一条的记录都和b表的100条进行组合,最终生成10*100条记录 。
mysql自然连接怎么用的介绍就聊到这里吧 , 感谢你花时间阅读本站内容,更多关于mysql自连接语法、mysql自然连接怎么用的信息别忘了在本站进行查找喔 。

    推荐阅读