标准答案
- INNER JOIN 用于只需要两侧都匹配的结果,适合同时取关联字段或按关联条件过滤。
- LEFT JOIN 用于必须保留左表记录,即使右表没有匹配项,例如列出所有用户及其可选资料。
- EXISTS 更清楚地表达“至少存在一条关联记录”,且不会因右表多条匹配而把左表行重复展开。
- IN 适合与明确的小集合或可去重子查询做成员判断,但要注意 NULL 语义和子查询返回量。
- 不要根据“某种写法一定更快”的传言选型,现代优化器常能改写等价表达,关键是语义、索引和行数。
题目解析
JOIN 的一个常见误用是只想判断存在,却把右表字段 JOIN 进来,随后再 DISTINCT 去重。这会制造不必要的中间行。EXISTS 能更直接表达半连接语义,也更不容易漏掉重复问题。
LEFT JOIN 后在 WHERE 中对右表字段加非空条件,会把结果实质变成 INNER JOIN。若要保留无匹配行,应把右表过滤条件放到 JOIN 条件中,或明确处理 NULL。
常见误区
- 用 LEFT JOIN 后在 WHERE 过滤右表字段,却仍以为会保留没有右表记录的左侧行。
- 不看重复行来源,靠 DISTINCT 掩盖一对多关联导致的数据膨胀。