文档章节

简单解析MySQL中的join语法

一片枫叶ing
 一片枫叶ing
发布于 2017/08/15 11:40
字数 828
阅读 219
收藏 0

#程序员薪资揭榜#你做程序员几年了?月薪多少?发量还在么?>>>

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是如何利用索引的

        

    

© 著作权归作者所有

一片枫叶ing
粉丝 2
博文 16
码字总数 14603
作品 0
成都
私信 提问
加载中

评论(0)

为什么 EXISTS(NOT EXIST) 与 JOIN(LEFT JOIN) 的性能会比 IN(NOT IN) 好

前言 网络上有大量的资料提及将 IN 改成 JOIN 或者 exist,然后修改完成之后确实变快了,可是为什么会变快呢?IN、EXIST、JOIN 在 MySQL 中的实现逻辑如何理解呢?本文也是比较粗浅的做一些介...

osc_nmvhliqx
2018/09/16
2
0
探索MySQL源代码–sql历险记

本文从一个select语句的执行过程出发, 遍历MySQL的多个几子系统. 先放图一张, 按图索骥开始我们的历险. 当客户端连接上MySQL服务端之后,发出请求之前,服务端的线程是阻塞在docommand(sql/p...

笨笨熊
2011/03/09
720
0
sharding-sphere之SQL解析select

以mysql为例,先看一下sql的写法: 官网地址:请点击我 sql关联查询的格式如下: 结果集合并: sql的解析过程如官方文档sql写法解析过程一直,流程图如下: 举个例子:以mysql的查询sql为例,看看...

一滴水的坚持
2018/06/14
0
0
WEEK12:Mysql and ORM

关系数据库管理系统(RDBMS) 特点 数据以表格的形式出现 每行为各种记录名称 每列为记录名称所对应的数据域 许多的行和列组成一张表单 若干的表单组成database 术语 数据库: 数据库是一些关...

osc_6xz9lafx
2019/07/07
2
0
美团开源 SQL 优化工具 SQLAdvisor,与内部版本保持一致

SQLAdvisor 是由美团点评公司北京 DBA 团队开发维护的 SQL 优化工具:输入SQL,输出索引优化建议,现已开源。 它基于 MySQL 原生词法解析,再结合 SQL 中的 where 条件以及字段选择度、聚合条...

王练
2017/03/10
1.3W
30

没有更多内容

加载失败,请刷新页面

加载更多

redhat AS5.5在telnet时报错“Unencrypted connection refused. Goodbye解决

解决Linux5在telnet时报错“Unencrypted connection refused. Goodbye.” Redhat 5.5环境,今天在远程telnet时,居然报错如下: Unencrypted connection refused. Goodbye. 解决方法: 1)将...

osc_cgllnrkd
29分钟前
18
0
如何在电脑上实现音频变速?音频变速软件哪个值得下载

如何在电脑上实现音频变速?大家在网络上有没有刷到一些音频变速的视频?就是播放的声音速度不正常,会偏快或偏慢,这样别人就听不出说话人原本的音质了。如果你对音频变速也感兴趣,那可以仔...

深蓝月上
30分钟前
14
0
Paxos算法

Paxos算法是一种基于消息传递具有高度容错性的一种算法,解决的问题为在一个异步通信的分布式系统中,如何就某一个值(决议)达成一致。 Paxos算法中有三种角色:Proposer、Acceptor、Learn...

魍宂庞
30分钟前
12
0
Linux学习之路-Linux- If 及 case【9】---20171219

if 语句-条件选择 if 是一个shell的关键字 [root@Centos6app]#type ifif is a shell keyword if 选择执行 if 可以嵌套使用 用法 if COMMANDS; then COMMANDS; [ elif COMMANDS; t......

osc_q5urtsdm
30分钟前
16
0
编译安装mysql5.6以上版本报错解决

查看官网安装说明: http://dev.mysql.com/doc/refman/5.6/en/binary-installation.html 一、编译安装 shell> groupadd mysql shell> useradd -r -g mysql mysql shell> cd /usr/local shel......

osc_34b9n45c
31分钟前
14
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部