扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
本文主要介绍 SQL 标准中定义的各种连接的意义和区别,例如,交叉连接( CROSS JOIN )、内连接( INNER JOIN )、外连接( OUTER JOIN )、自然连接( NATURAL JOIN )等,并结合例子讲解这些连接在 MySQL 中的语法和表现。
创新互联建站-成都网站建设公司,专注成都做网站、成都网站建设、成都外贸网站建设、网站营销推广,国际域名空间,虚拟空间,网站托管运营有关企业网站制作方案、改版、费用等问题,请联系创新互联建站。
从网上的资料看, JOIN 更多翻译为连接,本文中凡是出现中文“连接”的地方都是指 JOIN 。
本文中用到的所有例子涉及两张表—— customers 用户表和 orders 订单表,其中订单表中的 cust_id 字段表示用户的唯一 ID,也就是用户表的主键 cust_id 。两张表的数据如下:
注:两张表都经过了简化,实际业务中这两张表肯定还包括其他字段。
英文维基百科 JOIN 词条 对连接的定义如下:
翻译过来就是,“连接可以根据一张(自连接)或多张表中的共同值将这些表的列数据合并为一个新的结果集,标准 SQL 定义了五种连接:内连接、左外连接、右外连接、全外连接和交叉连接。”
也就是说,连接是 SQL 标准中定义的一种组合多张表的方式,当然一张表自身也可以和自身组合,称为自连接。连接后得到的结果集的每一列其实都来自用于连接的多张表,不同的连接类型只是区分了这些列具体从哪张表里来,列里填充的是什么数据。
其实英文维基百科的 JOIN 词条已经把各种连接的类型解释地非常清楚了,非常值得去看一下。
我们来看一下 SQL 标准中定义的各种连接类型,理解各种连接最好的方法就是把需要连接的表想象成集合,并画出可以反映集合的交与并的情况的图——韦恩图,例如下图就画出了 SQL 中定义的几种主要连接。
请先仔细查看一下图中的内容,你可以从中归纳出几种连接类型呢?
虽然图中画了 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 表自连接的例子再来说明一下自然连接,语句如下:
因为是自连接,因此必须使用 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远程连接数据库有两种方法,具体如下:
改表法。 在localhost登入mysql后,更改 "MySql" 数据库中的 "User" 表里的 "Host"选项,将"localhost"对应的值改为"%",具体代码如图所示:
2.授权法。 若MyUser想要使用mypassword(用户密码)从任何主机连接到mysql服务器则可以使用此方法,具体步骤如下图所示。
3.按照上述改法,保存后重启即可生效。
拓展资料:
数据库(Database)是按照数据结构来组织、存储和管理数据的仓库,它产生于距今六十多年前,随着信息技术和市场的发展,特别是二十世纪九十年代以后,数据管理不再仅仅是存储和管理数据,而转变成用户所需要的各种数据管理的方式。
2.数据库有很多种类型,从最简单的存储有各种数据的表格到能够进行海量数据存储的大型数据库系统都在各个方面得到了广泛的应用。
3.在信息化社会,充分有效地管理和利用各类信息资源,是进行科学研究和决策管理的前提条件数据库技术是管理信息系统、办公自动化系统、决策支持系统等各类信息系统的核心部分,是进行科学研究和决策管理的重要技术手段。
4.数据库是一个单位或是一个应用领域的通用数据处理系统,它存储的是属于企业和事业部门、团体和个人的有关数据的集合。数据库中的数据是从全局观点出发建立的,按一定的数据模型进行组织、描述和存储。
5.其结构基于数据间的自然联系,从而可提供一切必要的存取路径,且数据不再针对某一应用,而是面向全组织,具有整体的结构化特征。
参考资料:数据库_百度百科
一、指代不同
1、JOIN:用于根据两个或多个表中的列之间的关系,从这些表中查询数据。
2、INNER JOIN :组合两个表中的记录,只要在公共字段之中有相符的值。
二、特点不同
1、JOIN:每个主键的值都是唯一的。这样做的目的是在不重复每个表中的所有数据的情况下,把表间的数据交叉捆绑在一起。
2、INNER JOIN :只要在这两个表的公共字段之中有相符值,内部联接将组合两个表中的记录。
三、规定不同
1、JOIN:如果表中有至少一个匹配,则返回行。
2、INNER JOIN :被联接的字段的名称。若不是由数字构成的,则这些字段必须为相同的数据类型并包含同类数据,但无须具有相同的名称。
参考资料来源:百度百科-INNER JOIN
参考资料来源:百度百科-SQL语句大全
哎。你好渊博啊。
我给你讲下几种链接的含义:
1、自然连接 select * a join b on a.id=b.id 含义:用a表的id与b表的id进行匹配,匹配上的记录显示,而那些匹配不上的,不论是a还是b表的记录都不显示。
2、外连接:左连接,右链接
左链接:select * a left join b on a.id=b.id 含义:用a表的id与b表的id进行匹配,匹配上的记录显示,而那些匹配不上的,保留a表全部的未匹配记录,但b表的未匹配记录不被显示。
右链接:select * a right join b on a.id=b.id 含义:用a表的id与b表的id进行匹配,匹配上的记录显示,而那些匹配不上的,保留b表未匹配的记录,但a表的未匹配记录不被显示。
3、全关联:select * a full 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条记录。
你看看这个:
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
多表查询
SELECT * FROM a,b WHERE a.val = b.val;
连接查询
SELECT * FROM a LEFT JOIN b ON a.val = b.val;
重点:其实两种都是连接查询
多表查询即自然连接查询,如下
SELECT * FROM a join b WHERE a.val = b.val;
自然连接查询:默认使用主键进行连接,且不能改变(即不需要on关键字),可通过where子句进行条件筛选,这也是和其他连接查询最大的不同
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流