mysql中left join设置条件在on与where时的用法区别分析
本文实例讲述了mysql中leftjoin设置条件在on与where时的用法区别。分享给大家供大家参考,具体如下:
一、首先我们准备两张表来进行测试。
CREATETABLE`a`( `id`int(11)unsignedNOTNULLAUTO_INCREMENTCOMMENT'ID', `name`varchar(32)DEFAULT''COMMENT'名称', PRIMARYKEY(`id`) )ENGINE=InnoDBDEFAULTCHARSET=utf8; CREATETABLE`b`( `id`int(11)unsignedNOTNULLAUTO_INCREMENTCOMMENT'ID', `a_id`int(11)DEFAULT'0'COMMENT'a表ID', `name`varchar(32)DEFAULT''COMMENT'名称', PRIMARYKEY(`id`) )ENGINE=InnoDBDEFAULTCHARSET=utf8;
两个表的数据如图所示:
运行下面左连接查询:
select*fromaleftjoinbona.id=b.a_id;
我们分别在on和where后面加上条件,看看执行结果是否相同。
select*fromaleftjoinbona.id=b.a_idandb.id>3;
select*fromaleftjoinbona.id=b.a_idwhereb.id>3;
上面的两条语句,条件我们设置的是一样的都是b.id>3,为什么显示结果不同。
sql语句查询的关键字顺序一般为from>where>groupby>having>orderby
leftjoin在from范围,on条件会先对leftjoin的右表进行筛选,筛选完后的结果where再进行筛选。
多个leftjoin会生成一张临时表,on条件是对leftjoin右表进行条件过滤,where条件针对最后生成的临时表进行过滤。
所以:
b.id>3的条件如果写在on后面,则是先对右边表(关联表)进行筛选,得出符合条件的行,然后主表leftjoin,返回主表所有的行,右边表没匹配上的用null表示。
b.id>3的条件如果写在where后面,则是先主表leftjoin右边表(关联表),返回所有的行,然后where条件再对结果进行筛选。
注意:on后面的条件是针对右边的表(关联表),对主表没什么作用。
select*fromaleftjoinbona.id=b.a_idanda.id>3;
我们在on后面添加了对主表的条件a.id>3,不过主表的数据仍然全部显示出来了,但是影响了右边表(关联表)的显示。
如果想要对主表进行筛选,应该把条件写在where后。
select*fromaleftjoinbona.id=b.a_idwherea.id>3;
更多关于MySQL相关内容感兴趣的读者可查看本站专题:《MySQL查询技巧大全》、《MySQL常用函数大汇总》、《MySQL日志操作技巧大全》、《MySQL事务操作技巧汇总》、《MySQL存储过程技巧大全》及《MySQL数据库锁相关技巧汇总》
希望本文所述对大家MySQL数据库计有所帮助。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。