table teacher
tid name
1 tom
2 jack
table student
id name tid
1 lily 1
2 kite 1
我想找到所有tom教的学生列表
select
t.name,
s.id,
s.name
from
teacher t left join student s on (t.tid = s.tid and t.tid=1)
看上去貌似很对
结果:
tom 1 lily
tom 2 kite
jack null null
你会发现多了一条 jack null null 的记录,这也是对left join 工作原理不了解的缘故了。
改成这样结果就对了
select
t.name,
s.id,
s.name
from
teacher t left join student s on (t.tid = s.tid)
where
t.tid = 1
我们可以想象left join 是这样工作的
从左表(teacher表)读出一条,选出所有与on匹配的右表(student表)纪录(n条)进行连接,形成n条纪录(包括重复的行)
如果右边没有与on条件匹配的表,那连接的字段都是null.