Bootstrap

【MySQL】ON与WHERE的区别(临时表)

先说区别后举例

核心概念:临时表

  • “临时表”,这是理解 JOIN 操作的关键。数据库在执行 JOIN 时,确实会生成一个中间的、逻辑上的结果集(你可以把它想象成一个临时表),然后在这个结果集上进行后续操作。
  • 性能: 创建和维护临时表会消耗一定的资源,例如内存和磁盘 I/O。对于大型表和复杂的查询,临时表可能会影响查询性能。
  • 优化: 优化查询语句(例如使用索引、减少 JOIN 的表数量等)可以帮助减少或避免临时表的使用,从而提高查询性能。
  • 生命周期:
    • 会话级临时表: 如果临时表是在执行查询时创建的,它们通常是“会话级”的。这意味着当当前数据库连接(会话)结束时,这些临时表会自动被删除。
      • 会话的概念:简单来说就是mysql -u -p登录开始 到 exit结束
    • 查询结束: 在大多数情况下,一旦查询执行完毕,MySQL 也会立即删除该查询所使用的临时表。
  • 查询是否创建了临时表:EXPLAIN命令
  • EXPLAIN SELECT * FROM table1 LEFT JOIN table2 ON table1.id = table2.table1_id;
    

ON 条件的作用

  • 连接阶段筛选: ON 条件的作用是在 连接过程 中,用来 匹配两张表 的行。
  • 保证左表完整性: 对于 LEFT JOIN 来说,最重要的特点是:即使右表没有匹配的行,左表的行 仍然会保留 在结果集中。此时,右表对应的列会填充 NULL 值。
  • 决定哪些行被匹配: ON 条件决定哪些右表的行应该和左表的行进行 匹配,并放入临时的结果集中。
  • 不改变左表结果: 即使 ON 条件不为真 (例如 ON t1.id = t2.id 时,t2 表中没有匹配 t1 表 id 的行),LEFT JOIN 仍然会保留左表 t1 的行,只是把 t2 表的列都置为 NULL

WHERE 条件的作用

  • 结果筛选: WHERE 条件是在 临时表生成后,用来 过滤最终结果集 的条件。
  • 不保证左表完整性: 如果 WHERE 条件不满足,则会导致 整行被过滤掉,无论这行是否来源于左表。 这意味着,LEFT JOIN 的 “保留左表所有行” 的特性可能被破坏,相当于将其变成了 INNER JOIN
  • 在所有匹配完成后过滤: WHERE 条件作用于已经完成连接操作的临时表上。

示例

解法应该是左外连接

SELECT p.FirstName, p.LastName, a.City, a.State
  FROM Person AS p LEFT JOIN Address AS a
    ON p.PersonId = a.PersonId;

 

;