简单解析MySQL中的join语法
2017-08-15 00:00
155 查看
摘要: 最近写了很多join连接,都有点晕头转向了,把他梳理一遍
join语法严格来说只有三种连接方式,它们分别是内连接、左连接和右连接
假如现在有两张表A和B ,有数据
+----+-----------+------+--------+
| id | name | id | name |
| 1 | Pirate | 2 | Pirate |
| 2 | Monkey | NULL | NULL |
| 3 | Ninja | 4 | Ninja |
| 4 | Spaghetti | NULL | NULL |
+----+-----------+------+--------+
1.内连接:INNER JOIN 也可以说是等值连接,取得两个表中存在连接匹配关系的记录。简单点说就是取得两个表的交集。
例如语句select * from A inner join B on A.name = B.name,用文氏图展现则为
2.左(外)连接:LEFT JOIN(LEFT OUTER JOIN ) 例如语句:select * from A left join B on A.name = B.name (等价于select * from A left outer join B on A.name = B.name , 但是MySQL中推荐使用第一种) 则其表示从左表(A)产生一套完整的记录,与匹配的记录(右表(B)),用文氏图表现为
但是这里还有几种情况,例如语句:select * from A left join B on A.name = B.name where B.id is null ,用文氏图展示
例如语句:SELECT * FROM A LEFT JOIN B ON A.name = B.name WHERE B.id IS NULL union SELECT * FROM A right JOIN B ON A.name = B.name WHERE A.id IS NULL; 可以求差集,用文氏图展示
3.右(外)连接:RIGHT(OUTER ) JOIN 例如语句 select * from A right join B on A.name = B.name(取得B表的所有内容) 用文氏图展示
例如语句 select * from A right join B on A.name = B.name where A.id is null(只取得排除交集后B表的内容) 用文氏图展示
4.MySQL中不支持full join 但是可以用union来取得所有的数据
5.cross join:交叉连接,得到的结果是两个表的乘积,即笛卡尔积(这个我们不常用,所有这里不做讨论)
6.部分优化技巧: 尽量用inner join.避免 LEFT JOIN(RIGHT JOIN) 和 NULL.
on与where的执行顺序:ON 条件(“A LEFT JOIN B ON 条件表达式”中的ON)用来决定如何从 B 表中检索数据行。如果 B 表中没有任何一行数据匹配 ON 的条件,将会额外生成一行所有列为 NULL 的数据,在匹配阶段 WHERE 子句的条件都不会被使用。仅在匹配阶段完成以后,WHERE 子句条件才会被使用。它将从匹配阶段产生的数据中检索过滤。所以尽可能满足ON的条件,而少用Where的条件
尽量避免子查询,而用join(参考博客 mysql的exists与inner join 和 not exists与 left join 性能差别惊人)
straight_join实现强制多表的载入顺序,从左到右,如:
...A straight_join B on A.name = B.name
straight_join完全等同于inner join 只不过,join语法是根据“哪个表的结果集小,就以哪个表为
驱动表”来决定谁先载入的,而straight_join 会强制选择其左边的表先载入。往往我们在分析mysql处理性能时,如(Explain),如果发现mysql在载入顺序不合理的情况下,可以
使用这个语句,但往往mysql能够自动的分析并处理好。
7.其他查询优化,请参考
MySQL查询优化
比较全面的MySQL优化参考(下篇)
10分钟让你明白MySQL是如何利用索引的
join语法严格来说只有三种连接方式,它们分别是内连接、左连接和右连接
假如现在有两张表A和B ,有数据
+----+-----------+------+--------+
| id | name | id | name |
| 1 | Pirate | 2 | Pirate |
| 2 | Monkey | NULL | NULL |
| 3 | Ninja | 4 | Ninja |
| 4 | Spaghetti | NULL | NULL |
+----+-----------+------+--------+
1.内连接:INNER JOIN 也可以说是等值连接,取得两个表中存在连接匹配关系的记录。简单点说就是取得两个表的交集。
例如语句select * from A inner join B on A.name = B.name,用文氏图展现则为
2.左(外)连接:LEFT JOIN(LEFT OUTER JOIN ) 例如语句:select * from A left join B on A.name = B.name (等价于select * from A left outer join B on A.name = B.name , 但是MySQL中推荐使用第一种) 则其表示从左表(A)产生一套完整的记录,与匹配的记录(右表(B)),用文氏图表现为
但是这里还有几种情况,例如语句:select * from A left join B on A.name = B.name where B.id is null ,用文氏图展示
例如语句:SELECT * FROM A LEFT JOIN B ON A.name = B.name WHERE B.id IS NULL union SELECT * FROM A right JOIN B ON A.name = B.name WHERE A.id IS NULL; 可以求差集,用文氏图展示
3.右(外)连接:RIGHT(OUTER ) JOIN 例如语句 select * from A right join B on A.name = B.name(取得B表的所有内容) 用文氏图展示
例如语句 select * from A right join B on A.name = B.name where A.id is null(只取得排除交集后B表的内容) 用文氏图展示
4.MySQL中不支持full join 但是可以用union来取得所有的数据
5.cross join:交叉连接,得到的结果是两个表的乘积,即笛卡尔积(这个我们不常用,所有这里不做讨论)
6.部分优化技巧: 尽量用inner join.避免 LEFT JOIN(RIGHT JOIN) 和 NULL.
on与where的执行顺序:ON 条件(“A LEFT JOIN B ON 条件表达式”中的ON)用来决定如何从 B 表中检索数据行。如果 B 表中没有任何一行数据匹配 ON 的条件,将会额外生成一行所有列为 NULL 的数据,在匹配阶段 WHERE 子句的条件都不会被使用。仅在匹配阶段完成以后,WHERE 子句条件才会被使用。它将从匹配阶段产生的数据中检索过滤。所以尽可能满足ON的条件,而少用Where的条件
尽量避免子查询,而用join(参考博客 mysql的exists与inner join 和 not exists与 left join 性能差别惊人)
straight_join实现强制多表的载入顺序,从左到右,如:
...A straight_join B on A.name = B.name
straight_join完全等同于inner join 只不过,join语法是根据“哪个表的结果集小,就以哪个表为
驱动表”来决定谁先载入的,而straight_join 会强制选择其左边的表先载入。往往我们在分析mysql处理性能时,如(Explain),如果发现mysql在载入顺序不合理的情况下,可以
使用这个语句,但往往mysql能够自动的分析并处理好。
7.其他查询优化,请参考
MySQL查询优化
比较全面的MySQL优化参考(下篇)
10分钟让你明白MySQL是如何利用索引的
相关文章推荐
- 【MySQL】mysql join语法解析与性能分析
- Mysql Join语法解析与性能分析
- Mysql join语法解析与性能分析
- mysql join语法解析
- Mysql Join语法解析与性能分析--通过集合来看join
- Mysql Join语法解析与性能分析
- Mysql Join语法解析与性能分析
- Mysql Join语法解析与性能分析详解
- Mysql Join语法解析与性能分析
- Mysql Join语法解析与性能分析
- Mysql Join语法解析与性能分析
- Mysql Join语法解析与性能分析
- Mysql Join语法解析与性能分析
- Mysql Join语法解析与性能分析
- Mysql Join语法解析与性能分析
- MySQL grant 语法的详细解析
- MySQL的一些简单语法(5)-视图
- MySQL优化之——简单语法
- MySQL的联结(Join)语法
- MySQL grant 语法的详细解析