文章目录
- 一、内连接
- 二、外连接
- 2.1 左外连接
- 2.2 右外连接
- 三、总结
写在前面
在MySQL中join操作被称为连接,作用是能连接多个表的数据(通过连接条件),从多个表中获取数据合并在一起作为结果集返回给客户端。即使用连接查询一条SQL搞定需求。
- 多表操作是实际开发时经常遇到的解决问题的方案
- 多表操作能够在数据库层就实现大量数据的组合或者筛选
在写sql查询的时候,用的最多的就是where条件查询,这种查询也叫内连查询inner join,当然还有外连查询outer join,左外连接,右外连接查询,常用在多对多关系中,那他们区别和联系是什么呢?
用于本文档演示的数据表准备
- 建表语句
CREATE TABLE `a_table` (
`a_id` int(11) NOT NULL,
`a_name` varchar(10) DEFAULT NULL,
`a_blogs` varchar(10) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
CREATE TABLE `b_table` (
`a_id` int(11) NOT NULL,
`a_blogs` varchar(10) DEFAULT NULL,
`a_url` varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
- 表测试数据
一、内连接
连接结果仅包含符合连接条件的行组合起来作为结果集,参与连接的两个表都应该符合连接条件使用关键词:INNER JOIN 连接多张表
也就是返回两个表的交集(阴影)部分,如下图所示:
内连接查询结果:
- 从左表中取出每一条记录,去右表中与所有的记录进行匹配;
- 匹配必须是某个条件是左表中与右表中相同,才会保留结果,否则不保留;
内连接关键字:
inner join on
内连接基本语法:
左表 [inner] join 右表 on 左表.字段 = 右表.字段;
内连接演示:
- sql语句
select * from a_table a inner join b_table b on a.a_blogs = b.b_blogs;
- 执行结果
内连接注意事项:
- 1、on 表示连接条件;条件字段代表相同的业务含义(即两个表中的某个字段是一样的业务含义)
- 2、内连接可以没有连接条件,没有on之后的内容,这时候系统会保留所有结果(笛卡尔集)
- 3、内连接可以使用where 代替 on,通常不用where,因为where没有on效率高
on指匹配到第一条成功的就结束,其他不匹配;若没有,不进行匹配,而where会一直匹配,进行判断
- 4、通常使用字段别名,表别名在查询数据的时候,不同表有同名字段,这时候需要加上表名才能区分,而若表名太长,使用表别名若不想使用默认的字段名 可以通过[as] 设置字段别名
二、外连接
2.1 左外连接
左(外)连接,左表(a_table)的记录将会全部表示出来,而右表(b_table)只会显示符合搜索条件的记录。右表记录不足的地方均为NULL,如下图所示:
左外连接查询结果:
- 以第一张表为基表 进行相关查询,取出里面的所有记录,然后每条与另外一张表进行连接,
- 第一张表的内容不管能不能匹配上条件,最终都会保留;
- 第二张表能匹配,正确保留,不能匹配其他表的字段都置空null。
左外连接关键字:
LEFT JOIN ON
LEFT OUTER JOIN ON
left join 是 left outer join 的简写,它的全称是左外连接,是外连接中的一种。
左外连接基本语法:
左表 left join 右表 on 左表.字段 = 右表.字段;
左外连接演示:
- sql语句
select * from a_table a left join b_table b on a.a_blogs = b.b_blogs;
- 执行结果
2.2 右外连接
与左(外)连接相反,右(外)连接,左表(a_table)只会显示符合搜索条件的记录,而右表(b_table)的记录将会全部表示出来。左表记录不足的地方均为NULL,如下图所示:
右外连接查询结果:
- 以第二张表为基表 进行相关查询,取出里面的所有记录,然后每条与另外一张表进行连接,
- 第二张表的内容不管能不能匹配上条件,最终都会保留;
- 第一张表能匹配,正确保留,不能匹配其他表的字段都置空null。
右外连接关键字:
RIGHT JOIN ON
RIGHT OUTER JOIN ON
right join 是 right outer join 的简写,它的全称是右外连接,是外连接中的一种。
右外连接基本语法:
左表 RIGHT JOIN 右表 on 左表.字段 = 右表.字段;
右外连接演示:
- sql语句
select * from a_table a right outer join b_table b on a.a_blogs = b.b_blogs;
- 执行结果
三、总结
-
内连接:指连接结果仅包含符合连接条件的行,参与连接的两个表都应该符合连接条件。
-
外连接:连接结果不仅包含符合连接条件的行同时也包含自身不符合条件的行。包括左外连接、右外连接和全外连接。
-
左外连接:左边表数据行全部保留,右边表保留符合连接条件的行。
-
右外连接:右边表数据行全部保留,左边表保留符合连接条件的行。
-
全外连接:左外连接 union 右外连接,Mysql 中暂不支持。