标准答案

  1. INNER JOIN 用于只需要两侧都匹配的结果,适合同时取关联字段或按关联条件过滤。
  2. LEFT JOIN 用于必须保留左表记录,即使右表没有匹配项,例如列出所有用户及其可选资料。
  3. EXISTS 更清楚地表达“至少存在一条关联记录”,且不会因右表多条匹配而把左表行重复展开。
  4. IN 适合与明确的小集合或可去重子查询做成员判断,但要注意 NULL 语义和子查询返回量。
  5. 不要根据“某种写法一定更快”的传言选型,现代优化器常能改写等价表达,关键是语义、索引和行数。

题目解析

JOIN 的一个常见误用是只想判断存在,却把右表字段 JOIN 进来,随后再 DISTINCT 去重。这会制造不必要的中间行。EXISTS 能更直接表达半连接语义,也更不容易漏掉重复问题。

LEFT JOIN 后在 WHERE 中对右表字段加非空条件,会把结果实质变成 INNER JOIN。若要保留无匹配行,应把右表过滤条件放到 JOIN 条件中,或明确处理 NULL。

常见误区

  • 用 LEFT JOIN 后在 WHERE 过滤右表字段,却仍以为会保留没有右表记录的左侧行。
  • 不看重复行来源,靠 DISTINCT 掩盖一对多关联导致的数据膨胀。

作者信息