工作中遇见的问题总结
2015-10-27 22:29
92 查看
2015.10.27
来源
今天公司有同事问我一个左外连接sql查询的问题:A left join B on A.ID= B. AID and A.CON = '....' AND B.CON='...........',结果只有B表的过滤条件生效,而A表的过来条件没有生效。对于这个问题,我也没能很好的回答他,同时感觉这个问题比较常见,因此在此记录。
结果
1、对于left join,不管on后面跟什么条件,左边的表都会全部查询出来,如果要对左边的表进行过滤,则把过滤条件放到where后面,即 A left join B on A.ID= B. AID AND B.CON='...........' where A.CON = '....';
2、对于inner join,满足on之后的条件的数据才能够被查询出,条件放在on后面或者where后面结果是一样的;
3、如果A表对B表左外连接后面跟where A.con=XXX的时候,是先用where里面的条件对A表进行数据筛选,再与B表进行连接;而在on后面跟A.con=XXX的时候,此条件不会印象查询出的数据的总条数,只是会将不满足A.con=XXX条件的每行记录来自B表的部分数据置空。此次不易理解,具体底层原理有待深究。
4、如果A表对B表左外连接后面跟where B.con=XXX的时候,和3一样,而在on后面跟and B.con=XXX的时候,会先对B表的数据进行筛选,然后再拿去与A表进行连接查询。
有一个讲得比较好的博客:http://blog.csdn.net/aqszhuaihuai/article/details/6238416。
来源
今天公司有同事问我一个左外连接sql查询的问题:A left join B on A.ID= B. AID and A.CON = '....' AND B.CON='...........',结果只有B表的过滤条件生效,而A表的过来条件没有生效。对于这个问题,我也没能很好的回答他,同时感觉这个问题比较常见,因此在此记录。
结果
1、对于left join,不管on后面跟什么条件,左边的表都会全部查询出来,如果要对左边的表进行过滤,则把过滤条件放到where后面,即 A left join B on A.ID= B. AID AND B.CON='...........' where A.CON = '....';
2、对于inner join,满足on之后的条件的数据才能够被查询出,条件放在on后面或者where后面结果是一样的;
3、如果A表对B表左外连接后面跟where A.con=XXX的时候,是先用where里面的条件对A表进行数据筛选,再与B表进行连接;而在on后面跟A.con=XXX的时候,此条件不会印象查询出的数据的总条数,只是会将不满足A.con=XXX条件的每行记录来自B表的部分数据置空。此次不易理解,具体底层原理有待深究。
4、如果A表对B表左外连接后面跟where B.con=XXX的时候,和3一样,而在on后面跟and B.con=XXX的时候,会先对B表的数据进行筛选,然后再拿去与A表进行连接查询。
有一个讲得比较好的博客:http://blog.csdn.net/aqszhuaihuai/article/details/6238416。
相关文章推荐
- SQL中GROUP BY、HAVING操作
- LoadRunner参数化详解
- iOS轻量级多线程实现
- EC读书笔记系列之3:条款5、条款6、条款7
- html5笔记
- XCode中#pragma的使用
- disk management
- 5.变址寄存器-ESI和EDI寄存器与其用途
- HDFS架构和分布式文件系统
- SQL语句优化技术分析
- HDU4607(最大直径 树DP)
- CC2640 SimpleBLEPeripheral例程-2
- python 装饰器
- python初学--day1
- 字符串操作函数的实现
- LightOJ - 1004 Monkey Banana Problem(DP)
- UVA - 11375-Matches-dp+高精度
- ListView (加载、删除) 动画
- 目录和文件管理
- cocos3.x版本下载