小知识,大挑战!本文正在参与“程序员必备小知识”创作活动
- 常见的表连接方式
MySQL中表的连接方式主要分为内连接和外连接,其中外连接又可以分为左外连接和右外连接
- inner join:内连接,结果取连接两两个表数据的交集
- left [outer] join:左外连接,取两表数据的交集以及左表中独有的数据
- right [outer] join:右外连接,取两表数据的交集以及右表中的独有数据
- INNER JOIN
inner join内连接是根据指定的连接条件,获取两个表的数据交集。
2.1 内连接查询流程
- 首先确定驱动表和被驱动表,mysql会根据内部机制判定结果集小的为驱动表,而不是按照sql的书写顺序,可以使用
explain
命令查看执行计划中的表顺序 - 内连接联合查询时,取出驱动表的一条顺序,然后根据连接条件遍历被驱动表种的所有数据
- 如果被驱动表中有数据满足连接条件,则取出当前数据作为结果表的一条数据;如果遍历完被驱动表没有找到满足连接条件的数据,则抛弃当前驱动表的数据,开始下一条数据。
- 循环遍历驱动表中的所有数据,得到最终联合查询结果集。
2.2 sql语句示例
使用inner join内连接关联用户和客户表信息
1 | sql复制代码select u.name, u.gender, code from user u inner join customer c on u.id = c.userId; |
- LEFT JOIN
left join,即左连接,是以左表为主进行的联合查询,最终结果是根据关联条件取两表交集,再加上左表独有的数据,若右表无对应数据,则相关字段设置为null值。
3.1 左连接查询流程
- 以左表为驱动表,右表为被驱动表
- 从左表中按照顺序取出数据,针对当前数据遍历右表判断是否满足连接条件
- 如果找到满足条件的数据,则将该数据放入结果表中;如果没有满足条件的数据,则返回左表的当前数据,并把右表该行对应的字段赋值为null。
- 选择下一条左表中的数据,继续进行步骤3,直到左表遍历完成后返回结果表。
3.2 sql语句示例
使用左外连接进行联合查询时,最终数据以左表为主,在此基础上进行右表的关联查询。
1 | sql复制代码select u.name, u.gender, code from user u inner left join customer c on u.id = c.userId; |
- RIGHT JOIN
right join,右表连接,是以右表为主进行的联合查询,右表作为驱动表,左表作为被驱动表。
如果将右表连接中的表顺序交换,并将right join换为left join,则是相同的执行结果。实际上,mysql在执行右表连接查询时,就是将其转换成左表连接查询进行的。
1 | sql复制代码select u.name, u.gender, code from customer c inner right join user u on u.id = c.userId; |
- FULL JOIN
full join,全表连接,是将驱动表和被驱动表中的数据取并集返回,没有对应内容时赋值为null。
mysql中没有专门的全表连接关键字,可以使用先left join取左连接,得到结果表r1,再right join 取右连接,得到结果表2,最后使用union将两个结果表合并,自动去除重复数据,得到并集数据。
- on和where的查询条件
- 表连接时的连接条件使用on关键字来表示,on之后可以跟等值等判断条件,满足on后条件的数据会进行对应的关联连接。
- 如果表连接的同时使用了where条件过滤数据,这相当于先将对应表中的数据根据where条件筛选后再进行两表的关联查询。
- 可以使用where关键字可以on关键字定义条件
- 如果表连接不使用关联条件,则结果是两个表的笛卡尔积
本文转载自: 掘金