MySQLleftjoin连表查询时右边的表添加过滤条件
查询班级下⾯所有符合条件的学⽣:
表结构:
班级表: 学⽣表:
1、长写错误SQL:select c.*,s.* from class c left join student s on c.id = s.class_id
where c.deleted = 0 and s.deleted =0
返回结果:
2、正确的SQL:select c.*,s.* from class c left join student s on c.id = s.class_id and s.deleted =0 where c.deleted = 0
返回结果 :
MySQL查询处理的每⼀个阶段
FORM: 对FROM的左边的表和右边的表计算笛卡尔积。产⽣虚表VT1
ON: 对虚表VT1进⾏ON筛选,只有那些符合<join-condition>的⾏才会被记录在虚表VT2中。
sql left join 多表连接JOIN: 如果指定了OUTER JOIN(⽐如left join、 right join),那么保留表中未匹配的⾏就会作为外部⾏添加到虚拟表VT2中,产⽣虚拟表VT3, rug from⼦句中包含两个以上的表的话,那么就会对上⼀个join连接产⽣的结果VT3和下⼀个表重复执⾏步骤1~3这三个步骤,⼀直到处理完所有的表为⽌。
WHERE: 对虚拟表VT3进⾏WHERE条件过滤。只有符合<where-condition>的记录才会被插⼊到虚拟表VT4中。
GROUP BY: 根据group by⼦句中的列,对VT4中的记录进⾏分组操作,产⽣VT5.
CUBE | ROLLUP: 对表VT5进⾏cube或者rollup操作,产⽣表VT6.
HAVING: 对虚拟表VT6应⽤having过滤,只有符合<having-condition>的记录才会被 插⼊到虚拟表VT7中。
SELECT: 执⾏select操作,选择指定的列,插⼊到虚拟表VT8中。
DISTINCT: 对VT8中的记录进⾏去重。产⽣虚拟表VT9.
ORDER BY: 将虚拟表VT9中的记录按照<order_by_list>进⾏排序操作,产⽣虚拟表VT10.
LIMIT:取出指定⾏的记录,产⽣虚拟表VT11, 并将结果返回。
join使⽤图⽰(图⽚来⾃⽹络)
注意:
1、left join 连表查询的时候,是先执⾏ on 进⾏过滤,然后在连表。
2、on后⾯可以跟多个 and(对学⽣表筛选条件)
3、⼀直以为left join后跟and 条件不⽣效,原来 left join后跟 student 表条件是⽣效的,恰巧这种筛选很多时候是⾮常必要的,left join 后⾯筛选class表⽤ where, 筛选student表⼀定不要⽤where。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论