很多时候我们在使用 LEFT JOIN ...... ON .... 时, 除了连接两个表的字段条件外,我们往往还需要一些等值或者范围 等等类似的数据筛选条件。
那么对于初学者,往往会犯一个错误,就是 想当然 地 认为, ON 后面的条件是逐一执行的,因为没有了解清楚 ON 后面接条件的规则。
是个什么样的场景?
看实例讲解:
userinfo 表 :
(找兼职的人员名单信息表)
jobinfo表 :
(兼职工作信息及职业要求表)
业务需求:
根据职业要求 给 找兼职的人员 匹配上 目前 可以做的兼职,输出数据条。
例如,李三是一个程序员,他迫于经济压力,不得不向社会低头,想找一些自己能做的兼职。
使用 WHERE
如果我们不用 left join ...... on ... , 仅仅使用 where,那么简单写下sql是:
SELECT *
FROM userinfo AS u ,jobinfo AS j
WHERE u.userProfession=j.professionRequire
AND j.professionRequire='程序员'
查询出来的结果如下:
是我们需要的结果,可以看的,程序员李三能做的兼职有,送外卖或者当保安。
使用 LEFT JOIN ...... ON ......
初学者(罪过)写的SQL :
想当然地把筛选条件 职业要求为 ‘ 程序员’ 直接 拼接在 ON 后面
SELECT *
FROM userinfo AS u
LEFT JOIN
jobinfo AS j
ON u.userProfession=j.professionRequire
AND j.professionRequire='程序员'
这样地拼接筛选条件其实是达不到所想要的效果的,先来看看这样的执行结果:
可以看到查询出来很多我们不想要的数据,为什么会这样?
原因:
因为如果直接把关联表的筛选条件拼接在 ON 后, 执行的顺序其实是:
先将 jobinfo 表 按照筛选条件 professionRequire='程序员' 执行后作为子查询,再执行 LEFT JOIN ...... ON 。
也就是第一步变成了执行 SELECT * FROM jobinfo AS j WHERE j.professionRequire='程序员'
然后再进行连接查询,也就是
整个sql语句其实变成了:
SELECT *
FROM userinfo AS u
LEFT JOIN
(SELECT * FROM jobinfo WHERE jobinfo.professionRequire='程序员') AS j
ON
u.userProfession=j.professionRequire
这样查询出来,显然不是我们想要的结果。
那么我们在使用 LEFT JOIN ...... ON ...... 拼接筛选条件时,我们应该怎么做?
配合 WHERE 使用:
SELECT *
FROM userinfo AS u
LEFT JOIN jobinfo AS j
ON u.userProfession=j.professionRequire
WHERE j.professionRequire='程序员'
结果:
我们把筛选条件配合where去使用, 执行的逻辑就是:
先执行LEFT JOIN ...... ON ...... 先将关联两个表之后的数据查询出来;
再按照 professionRequire='程序员' 条件,进行数据筛选。
所以这是我们想要得到的结果。