JOIN

作者: 禾线子 | 来源:发表于2017-07-24 21:35 被阅读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

    相关文章

      网友评论

          本文标题:JOIN

          本文链接:https://www.haomeiwen.com/subject/pmlukxtx.html