JOIN

INNER JOIN(内连接,或等值连接): 获取两个表中字段匹配关系的记录。INNER JOIN 中的 INNER 可省略。 LEFT JOIN(左连接): 获取左表所有记录,即使右表没有对应匹配的记录。 RIGHT JOIN(右连接): 与 LEFT JOIN 相反,用于获取右表所有记录,即使左表没有对应匹配的记录。

笛卡尔乘积

举例:假设 A 表有 20 条记录,B 表有 30 条记录,则二者关联后的笛卡尔积共 20 * 30 = 600 条记录。也就是说 A 表中的每条记录都会与 B 表的所有记录关联一次,三种关联方式实际上就是对“笛卡尔积”的处理方式不同。

驱动表与被驱动表 当使用 LEFT JOIN 时,左表是驱动表,右表是被驱动表。 当使用 RIGHT JOIN 时,右表是驱动表,左表是被驱动表。 当使用 INNER JOIN 时,mysql 会选择数据量小的表作为驱动表,大表作为被驱动表。

on 和 where 条件

在探索 on 和 where 条件有何不同时,我们需要先明确几个概念:

LEFT JOIN:LEFT JOIN 会返回左表中的所有行,即使在右表中没有匹配的行。 临时表:数据库在通过连接两张或者多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户。

无论我们在 on 条件语句中增加 左表的条件 或 右表的条件,还是都不加,最终的结果都是五条数据,即左表的全部数据。 但是右表的数据却不同,具体如下:

左表右表条件都不加:右表返回所有左表关联的数据。 左表增加条件g.goods_name = 'T恤1' :右表只返回 与满足该条件的左表数据 关联的数据。 右表增加条件c.category_name = 'T恤' :右表只返回满足该条件,并且和左表有关联的数据。

on 条件结论

on 条件是生成临时表的条件,所以不管 on 中的条件是否为真,都会返回左表中的所有记录。

on 条件会过滤右表数据,无论 on 中的条件是左表的条件还是右表的条件,都是用来过滤右表的数据的。满足条件并且有关联的数据才会写入临时表,不然值为 NULL。

where 条件结论

where 条件是在临时表生成好了之后,再对临时表进行过滤的条件。这时已经没有 LEFT JOIN 的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。

总结

on 是在生成临时表的时候使用的条件,不管on的条件是否起到作用,都会返回左表所有的行。 where 则是在生成临时表之后使用的条件,此时已经不管是否使用了 LEFT JOIN 了,只要条件不为真的行,全部过滤掉。 (INNER | LEFT | RIGHT) JOIN 会生成临时表,该临时表为左表,所以我们在写 JOIN 语句的时候应该选择数据量较小的表作为驱动表。

参考博客

https://juejin.cn/post/6854573222302597134

Copyright © TaoQZ 2019 all right reserved,powered by Gitbook作者联系方式:taoqingzhou@gmail.com 修订时间: 2024-11-19 17:25:44

results matching ""

    No results matching ""

    results matching ""

      No results matching ""