连接(Join)本质上是:
根据键,把不同档案柜里的记录对上号。
先看关系图:
districts 1 --- n citizens 1 --- n permits 1 --- n permit_events查某个区的市民及其有效通行证:
SELECT
c.citizen_id,
c.full_name,
d.name AS district_name,
p.permit_id,
p.permit_type,
p.status
FROM citizens c
JOIN districts d
ON d.district_id = c.district_id
LEFT JOIN permits p
ON p.citizen_id = c.citizen_id
AND p.status = 'active'
WHERE c.status = 'active';这里:
JOIN/INNER JOIN:两边都能对上的才保留LEFT JOIN:左边全保留,右边对不上就补NULL
可以把它理解成:
先拿市民档案
再去行政区档案柜查所属区
再去通行证档案柜查有没有有效证
查不到证,也保留这个市民一个常见错误是把过滤条件放错地方。
比如 LEFT JOIN 时,如果把右表条件误写到 WHERE,很容易把“没匹配到右表”的左侧行也过滤掉,结果看起来像突然变成了 INNER JOIN。