JOIN

2017-07-24  本文已影响0人  禾线子

1.语法结构

... FROM table1 INNER|LEFT|RIGHT JOIN table2 on condition

组成 含义
table1 左表
table2 右表
INNER JOIN 获取两个表中存在连接匹配关系的记录
LEFT JOIN 获取左表完全记录,即使右表并无对应匹配记录
RIGHT JOIN 与 LEFT JOIN 相反

2.原始表

左表(join_a).jpg 右表(join_b).jpg

3.INNER JOIN

基础INNER JOIN.jpg

INNER JOIN 是基于条件两张表的交集。在不指定条件(ON)的时候,得到的是两张表的笛卡尔积(即两张表所有的组合可能)。
可以看到,join_a 表中 id 为 1的记录出现了两次,这是因为在 join_b 表中有两个 name 为 Alice 的记录。
同时,可以看到,在 ON 条件的时候,name 字段加了引号,这应该就是 MySql 对语句中出现的特殊字符的处理吧。
然后,可以使用示例中的小技巧为结果增加行号。但奇怪的是,* 必须在@num := @num + 1 AS NUMBER 前面, 如果 * 在后面就会报错。
INNER JOIN 中可以使用 AND。

SET @num = 0;

SELECT
    *, @num := @num + 1 AS NUMBER
FROM
    join_a
INNER JOIN join_b ON join_a.`name` = join_b.`name`
AND join_a.id = join_b.id
INNER JOIN + AND.jpg

4.LEFT JOIN

LEFT JOIN,(或 LEFT OUTER JOIN,在Mysql中两者等价,推荐使用 LEFT JOIN)左连接从左表产生一套完整的记录,与匹配的记录(右表) 。如果没有匹配,右侧将包含 NULL。

基础 LEFT JOIN.jpg

LEFT JOIN 还可以通过 WHERE 来模拟 INNER JOIN。

SELECT
   *
FROM
   join_a
LEFT JOIN join_b ON join_b.`name` = join_a.`name`
WHERE
   join_b.id IS NOT NULL
LEFT JOIN + WHERE 模拟 INNER JOIN.jpg

LEFT JOIN + RIGHT JOIN 求差集。

SELECT
    *
FROM
    join_a
LEFT JOIN join_b ON join_a.`name` = join_b.`name`
WHERE
    join_b.id IS NULL
UNION
    SELECT
        *
    FROM
        join_a
    RIGHT JOIN join_b ON join_a.`name` = join_b.`name`
    WHERE
        join_a.id IS NULL
求差集.jpg

5.RIGHT JOIN

参见 LEFT JOIN。

6.STRAIGHT JOIN

STRAIGHT JOIN 完全等同于 INNER JOIN 只不过,JOIN 语法是根据“哪个表的结果集小,就以哪个表为驱动表”来决定谁先载入的,而 STRAIGHT JOIN 会强制选择其左边的表先载入。
往往我们在分析 MySql 处理性能时,如(Explain),如果发现MySql 在载入顺序不合理的情况下,可以使用这个语句,但往往mysql能够自动的分析并处理好。

7.参考资料

MySql Join语法解析与性能分析
MySQL优化的奇技淫巧之STRAIGHT_JOIN

上一篇下一篇

猜你喜欢

热点阅读