如何使用mysql left join onn and查询

温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
阅读(1660)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
loftPermalink:'',
id:'fks_',
blogTitle:'left join加上where条件的困惑',
blogAbstract:'left join的困惑:一旦加上where条件,则显示的结果等于inner join\n\n将where 换成 and& \n\n用where 是先连接然后再筛选&& \n用and 是先筛选再连接\n\n数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户。\n\n&&&&& 在使用left jion时,on和where条件的区别如下:\n\n1、 on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。\n\n2、where条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有left join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。\n',
blogTag:'leftjoin,rightjoin,where',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:0,
publishTime:8,
permalink:'blog/static/',
commentCount:0,
mainCommentCount:0,
recommendCount:0,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:true,
hostIntro:'',
hmcon:'1',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}博客访问: 9958
博文数量: 2
注册时间:
ITPUB论坛APP
ITPUB论坛APP
APP发帖 享双倍积分
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: Oracle
今天遇到一个求某月所有天数的统计结果,如果某日的结果是0也需要显示出来,即:
一开始我用的左连接,用on做为两表关联条件,用where作为过滤条件,但是发现0的数据根本不显示,后来把where关键字去掉,把过滤条件都放到on里,问题解决,网上一搜,找到了答案:
数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户。
在使用left jion时,on和where条件的区别如下:
1、on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。
2、where条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有left
join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。
假设有两张表:
表1 tab1:
表2 tab2:
1、select * form tab1 left join tab2 on (tab1.size
= tab2.size) where tab2.name='AAA'
2、select * form tab1 left join tab2 on
(tab1.size = tab2.size and tab2.name='AAA')
第一条SQL的过程:
tab1.size = tab2.size
2、再对中间表过滤
where 条件:
tab2.name='AAA'
第二条SQL的过程:
tab1.size = tab2.size
and tab2.name='AAA'
(条件不为真也会返回左表中的记录)
其实以上结果的关键原因就是left join,right join,full
join的特殊性,不管on上的条件是否为真都会返回left或right表中的记录,full则具有left和right的特性的并集。 而inner
jion没这个特殊性,则条件放在on中和where中,返回的结果集是相同的。
阅读(6974) | 评论(0) | 转发(0) |
上一篇:没有了
相关热门文章
给主人留下些什么吧!~~
请登录后评论。博客访问: 284921
博文数量: 107
博客积分: 1552
博客等级: 上尉
技术积分: 1091
注册时间:
专注于大规模运维场景运维工具解决方案。欢迎有这方面兴趣的朋友跟我联系。
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: Mysql/postgreSQL
一、遇到的场景1> Table A left join Table B on Condition and ...2> Table A left join Table B on Condition where ...二、举个实例创建两个表及相关的内容如下CREATE TABLE `product` (&&`pid` int(4) NOT NULL auto_increment,&&`pname` char(20) default NULL,&&`pcode` char(20) default NULL,&&PRIMARY KEY
(`pid`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;CREATE TABLE `sales_detail` (&&`aid` int(4) NOT NULL auto_increment,&&`pcode` char(20) default NULL,&&`saletime` date default NULL,&&PRIMARY KEY
(`aid`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;INSERT INTO `product` VALUES ('1', 'A', 'AC');INSERT INTO `product` VALUES ('2', 'B', 'DE');INSERT INTO `product` VALUES ('3', 'C', 'XXX');INSERT INTO `sales_detail` VALUES ('1', 'AC', '');INSERT INTO `sales_detail` VALUES ('2', 'DE', '');INSERT INTO `sales_detail` VALUES ('3', 'AC', '');INSERT INTO `sales_detail` VALUES ('4', 'AC', '');left join里面带and的查询SELECT p.pname,p.pcode,s.saletime from product as p left join sales_detail as s on (s.pcode=p.pcode) and s.saletime in ('','');查出来的结果:+-------+-------+------------+| pname | pcode | saletime & |+-------+-------+------------+| A & & | AC & &|
|| A & & | AC & &|
|| A & & | AC & &|
|| B & & | DE & &| NULL & & & || C & & | XXX & | NULL & & & |+-------+-------+------------+直接where条件查询SELECT p.pname,p.pcode,s.saletime from product as p left join sales_detail as s on (s.pcode=p.pcode) where s.saletime in ('','');查询出来的结果+-------+-------+------------+| pname | pcode | saletime & |+-------+-------+------------+| A & & | AC & &|
|| A & & | AC & &|
|| A & & | AC & &|
|+-------+-------+------------+结论:on中的条件关联,一表数据不满足条件时会显示空值。where则输出两表完全满足条件数据。我的理解:left join里面的条件:会以左表的基准数据,凡左表出现的数据均要出现,然后再进行join右表,只要关联上的就需要查出来,如果相应的字段没有值或不符合条件的话就置为NULL。SELECT p.pname,p.pcode,s.saletime from product as p left join sales_detail as s on (s.pcode=p.pcode) ;光左连接的话显示的内容如下+-------+-------+------------+| pname | pcode | saletime & |+-------+-------+------------+| A & & | AC & &|
|| A & & | AC & &|
|| A & & | AC & &|
|| B & & | DE & &|
| &这里面有值| C & & | XXX & | NULL & & & | &这里面没有值+-------+-------+------------+有值但是不符合条件的话就置为NULL。如果没有值肯定为NULL如果是where条件的话就肯定是要满足才行。应用场景:比如有个主表,那以主表为基准去显示数据可以考虑left join的方式处理
阅读(7895) | 评论(0) | 转发(0) |
相关热门文章
给主人留下些什么吧!~~
请登录后评论。您的位置: >
SQL join中on与where区别
学习标签:
本文导读:数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户。例如在使用left jion时,on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录;where条件是在临时表生成好后,再对临时表进行过滤的条件。
on、where、having的区别
1、on、where、having这三个都可以加条件的子句中,on是最先执行,where次之,having最后。有时候如果这先后顺序不影响中间结果的话,那最终结果是相同的。但因为on是先把不符合条件的记录过滤后才进行统计,它就可以减少中间运算要处理的数据,按理说应该速度是最快的。
2、where应该比having快点的,因为它过滤数据后才进行sum,所以having是最慢的。但也不是说having没用,因为有时在步骤3还没出来都不知道那个记录才符合要求时,就要用having了。
3、在两个表联接时才用on的,所以在一个表的时候,就剩下where跟having比较了。在这单表查询统计的情况下,如果要过滤的条件没有涉及到要计算字段,那它们的结果是一样的,只是where可以使用rushmore技术,而having就不能,在速度上后者要慢。
4、如果要涉及到计算的字段,就表示在没计算之前,这个字段的值是不确定的,根据上篇写的工作流程,where的作用时间是在计算之前就完成的,而having就是在计算后才起作用的,所以在这种情况下,两者的结果会不同。
5、在多表联接查询时,on比where更早起作用。系统首先根据各个表之间的联接条件,把多个表合成一个临时表后,再由where进行过滤,然后再计算,计算完后再由having进行过滤。由此可见,要想过滤条件起到正确的作用,首先要明白这个条件应该在什幺时候起作用,然后再决定放在那里
1、假设有两张表:
size& &name
10&&& &AAA
20&&& &BBB
20& && CCC
1、select * form tab1 left join tab2 on (tab1.size = tab2.size) where tab2.name=&AAA&
2、select * form tab1 left join tab2 on (tab1.size = tab2.size and tab2.name=&AAA&)
第一条SQL的过程:
<span style="color: #、中间表on条件: tab1.size = tab2.size
&tab1.id&& tab1.size&& tab2.size&& tab2.name
&1& 10& 10& AAA
& 2& 20& 20 BBB
& 2 20 20 CCC
& 3 30 (null) (null)
<span style="color: #、再对中间表过滤where 条件:tab2.name=&AAA&
tab1.id&& tab1.size& &tab2.size&& tab2.name
1 & 10 &10 & AAA
第二条SQL的过程
中间表on条件: tab1.size = tab2.size and tab2.name=&AAA&(条件不为真也会返回左表中的记录)
tab1.id tab1.size tab2.size tab2.name
1& 10& 10& AAA
2& 20 &(null) &(null)
3& 30& (null) &(null)
2、实例2详细说明
SQL语句如下:
LEFT JOIN 表2 ON 表1.id = 表2.id AND 表2.Name != &#39;ff&#39;
WHERE 表1.NAME != &#39;aa&#39;
步骤1:返回笛卡尔积(SELECT * FROM 表1 CROSS JOIN 表2)
步骤2:应用ON筛选器(当前的条件为 表1.id = 表2.id AND 表2.Name != &#39;ff&#39;)
步骤3:添加外部行
这一步只对OUTER JOIN起作用,如果是LEFT JOIN会以左边的表为保留表,如果是RIGHT JOIN会以右边的表为保留表。所谓外部行是指,保留表中的行。即使第二步的ON过滤掉了一些行,在这一步,会根据保留表添加第二步过滤掉的行。当前的例子,不存在这种情况。
步骤4.应用WHERE筛选器(当前是Name != &aa&)过滤前三步所生成虚拟表的数据。
1、如果SQL用的是Left Join ,On后面的条件对Left的表没有作用,只对Right的表有过滤作用,Where语句可以对Left的表有过滤作用
2、如果SQL用的是Right Join ,On后面的条件对Right的表没有作用,只对Left的表有过滤作用,Where语句可以对Right的表有过滤作用
您可能感兴趣
一月好评排行榜left join on and与left join on where的区别
left join on and与left join on where的区别
在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户。&
在使用left jion时,on和where条件的区别如下:&
1、on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。&
2、where条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有left join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。
假设有两张表:&
表1 tab1:&
表2 tab2:&
size name&
1、select * form tab1 left join tab2 on (tab1.size = tab2.size) where tab2.name=&AAA&
2、select * form tab1 left join tab2 on (tab1.size = tab2.size and tab2.name=&AAA&)
第一条SQL的过程:&
1、中间表 on条件:
tab1.size = tab2.size
2、再对中间表过滤where 条件:
tab2.name=&AAA&
第二条SQL的过程:&
1、中间表 on条件:&
tab1.size = tab2.size and tab2.name=&AAA&
(条件不为真也会返回左表中的记录)
其实以上结果的关键原因就是left join、right join、full join的特殊性,不管on上的条件是否为真都会返回left或right表中的记录,full则具有left和right的特性的并集。而inner jion没这个特殊性,则条件放在on中和where中,返回的结果集是相同的。&}

我要回帖

更多关于 left join on 子查询 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信