MySQL-JOIN 详解

1、概述

    一个完整的 SQL 语句中会被拆分成多个子句,子句的执行过程会产生虚拟表(vt),但是结果只返回最后一张虚拟表。

2.、JOIN 的执行顺序

    一下是JOIN 查询的通用结构

    

SELECT <row_list>

    FROM <left_table>

        <inner | left | right> JOIN <right_table>

        ON <join condition>

            WHERE <where_condition>

    它的执行顺序如下(SQL 语句里第一被执行的总是FROM子句)

  • FROM: 对左右两张表执行笛卡尔积,产生第一张表 v1。行数为 n * m (n为左表的行数,m为右表的行数)

  • ON: 根据 ON 的条件逐行筛选vt1, 将结果插入 vt2 中。

  • JOIN: 添加外部行,如果指定了 LEFT JOIN(LEFT OUTER JOIN), 则先遍历一遍左表的每一行,其中不在 vt2 的行会被插入到 vt2, 该行的剩余字段将被填充为 NULL, 形成 vt3; 如果指定了 RIGHT JOIN 也是同理。但如果指定的是 INNER JOIN, 则不会添加外部行, 上述插入过程被忽略, vt2=vt3 (所以 INNER JOIN 的过滤条件放在 ON 或 WHERE 里执行结果是没有区别的)

  • WHERE: 对vt3 进行条件过滤,满足条件的行被输出到 vt4

  • SELECT : 取出vt4 的指定字段到 vt5

3、INNER / LEFT / RIGHT /FULL (JOIN)的区别

  • INNER JOIN...ON....: 返回左右表互相匹配的所有行(因为只执行了上文第二步ON 过滤,不执行第三步 添加外部行)

  • LEFT JOIN ... ON ...: 返回左表的所有行,若某些行在右表里没有相应对应的匹配行,则将右表的列在新表中置为 NULL

  • RIGHT JOIN... ON : 返回右表的所有行,若某些行在左表里没有相对应的匹配行,则将左表的列在新表置为 NULL

        FULL JOIN 这在 MySQL 里是不支持的,不过可以通过 LEFT JOIN + UNION + RIGHT JOIN 来实现 FULL JOIN

猜你喜欢

转载自blog.csdn.net/gochenguowei/article/details/81606114