本文中用到的所有例子涉及两张表——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游标和存储过程是什么 mysql游标表名为变量
- 如何使用cmd命令行提示符登录mysql服务器 cmd中登陆mysql
- mysql怎么设置时区 mysql时间显示设置
- 招聘要精通mysql
- mysql 65535 8192 限制 mysql限制资源使用
- mysql有topn
- mysql协议包解析 mysqlicp协议
- mysql子查询和连接查询 mysql子查询插入
- Mysql使用索引查询 mysql使用round
- 客户端无法连接到异速联服务器 客户端无法连接mongodb
