MySql别犯糊涂了!LEFTJOIN的ON后接上筛选条件,多个条
件会出事!
很多时候我们在使⽤  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  ......  先将关联两个表之后的数据查询出来;sql left join 多表连接
再按照 professionRequire='程序员'  条件,进⾏数据筛选。
所以这是我们想要得到的结果。
这是⼀个使⽤ LEFT JOIN 的 ON  初学者很容易犯的错误,⼤家稍微注意点。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。