[本站首页] [管理页面] [写新日志] [退出]

朝为田舍郎,暮登天子堂,将相本无种,男儿当自强。
首页(178) Hibernate(10) JAVA(19) Web(15) Struts(7) 口水(9) Ides(18) 其它(51) AJAX(6) database(29) 
Blog信息

blog名称:四裤全输的小窝~~
日志总数:178
评论数量:699
留言数量:198
访问次数:1151520
建立时间:2005年10月29日

Blog内搜索



日志更新

谷歌地图定位偏移解决方法
【转】利用Windows内置的命令作端口
WIN2003服务器安全加固方案
[转]sql server 日期比较、日
MediaCoder 一般参数设置
[转]VMware中创建共享磁盘阵列的方
缓解vss共享文件夹的安全隐患问题(转)
Delphi 中调用JavaScript
微软的官方方法:延长Windows Se
cxGrid 过滤 排序后 取选中记录的

最新评论

回复:谷歌地图定位偏移解决方法
回复:谷歌地图定位偏移解决方法
回复:WIN2003服务器安全加固方案
回复:cxGrid 过滤 排序后 取选中
回复:TreeView 父节点 子节点 
回复:[转]Oracle Instead
回复:DWR 官方下载地址
ugg  boots
回复:cxGrid 过滤 排序后 取选中
回复:DWR 官方下载地址

友情链接

biglin's Blog
NoisyRam's Blog
Stone's Blog
Kevin 的小家
『知』治通鉴

留言板




[database]简单SQL语句,你知道它的运行结果吗?(欢迎讨论!)
文章收藏,  网上资源,  软件技术,  电脑与网络 四裤全输 发表于 2006/9/27 17:11:59

有两表a和b,前两字段完全相同:(id int,name varchar(10)...),都有下面的数据(当然还有其它字段,这里不列出来了):id          name       ----------- ---------- 1           a          2           b          3           c          以下的查询语句,你知道它的运行结果吗?:1.select * from a left join b on a.id=b.id where a.id=12.select * from a left join b on a.id=b.id and a.id=13.select * from a left join b on a.id=b.id and b.id=14.select * from a left join b on a.id=1大家把你认为的结果帖出来一下吧.看看大家对JOIN理解很对不?? 转自:http://community.csdn.net/Expert/topic/5042/5042110.xml?temp=.5917475


阅读全文(2527) | 回复(1) | 编辑 | 精华

回复:简单SQL语句,你知道它的运行结果吗?(欢迎讨论!)
文章收藏,  网上资源,  软件技术,  电脑与网络 四裤全输发表评论于2006/9/27 17:15:17

贴点高手的解释.zjcxc(邹建) ( ) 信誉:673    Blog  2006-9-22 21:41:29  得分: 0      left join 嘛, 无非是左边表为基础, 扫描右边表匹配的记录 先是左边表的第1条记录1    a   按条件 a.id=1, 来扫描右边表的记录对于右边表的每条记录, 显然 a.id=1 这个条件都是成立的, 所以第1条记录匹配后的结果是: 1      a       1        a1      a       2        b1      a       3        c ---------------------------------------------然后再扫描第2条记录2     b对于条件 a.id=1, 在边表中没有与之匹配的记录, 所以右边表为NULL因此第2条记录匹配的结果为2      b       NULL        NULL ----------------------------------------------第3条记录与第2条记录一样, 匹配的结果是3      c       NULL        NULL ---------------------------------------因此最终结果是5条记录1      a       1        a1      a       2        b1      a       3        c2      b       null     null3      c       null     null  ww3347(新来的) ( ) 信誉:104    Blog  2006-9-22 22:27:38  得分: 0      现学现用一下:)----------------------------left join 嘛, 无非是左边表为基础, 扫描右边表匹配的记录 先是左边表的第1条记录1    a   按条件 a.id=b.id and b.id=1, 来扫描右边表的记录对于右边表, 显然只有第一条满足条件,所以第1条记录匹配后的结果是: 1      a       1        a---------------------------------------------然后再扫描第2条记录2     b对于条件 a.id=b.id and b.id=1, 在右边表中没有与之匹配的记录, 所以右边表为NULL因此第2条记录匹配的结果为2      b       NULL        NULL----------------------------------------------第3条记录与第2条记录一样, 匹配的结果是3      c       NULL        NULL---------------------------------------因此最终结果是3条记录1      a       1        a2      b       null     null3      c       null     nullselect * from a left join b on 1=1的話,應該就可以理解了結果是,on a.id=1,而沒有和b.id掛勾,所以保留a.id=1的三條紀錄,而a.id=2&3的部份應該就只有join null,保留1條了1 a 1 a1 a 2 b 1 a 3 c2 b 1 a 2 b 2 b2 b 3 c3 c 1 a 3 c 2 b 3 c 3 c----------------------只是可能没表述清楚,可以分步骤来解释left join1、首先列出笛卡尔乘积1 a 1 a1 a 2 b 1 a 3 c2 b 1 a 2 b 2 b2 b 3 c3 c 1 a 3 c 2 b 3 c 3 c 2、把on条件不符合的右边的内容变成null1 a 1 a1 a 2 b 1 a 3 c2 b null null 2 b null null2 b null null3 c null null3 c null null3 c null null 3、去掉重复1 a 1 a1 a 2 b 1 a 3 c2 b null null 3 c null null 4、再去掉where条件不符合的,就是结果(这里的例子没有where条件,所以结果不变,大家自己可以加条件测试下)1 a 1 a1 a 2 b 1 a 3 c2 b null null 3 c null null应该这样解释(第二问题) 1、首先列出笛卡尔乘积1 a 1 a1 a 2 b 1 a 3 c2 b 1 a 2 b 2 b2 b 3 c3 c 1 a 3 c 2 b 3 c 3 c 2、对每个左边的纪录,看有没有符合on条件的,如果有,保留符合条件的,去掉不符合条件的,如果没有,保留左边和右边是null的一条纪录1 a 1 a        --符合,保留1 a 2 b        --不符合,有第一条符合,删除1 a 3 c        --不符合,有第一条符合,删除2 b 1 a        2 b 2 b2 b 3 c        --2的都不符合,删除,添加null的记录    2  b  null null3 c 1 a 3 c 2 b 3 c 3 c        --3的都不符合,删除,添加null的记录    3  c  null null 结果:1 a 1 a      2 b null null  3 c null null  3、再去掉where条件不符合的,就是结果(这里的例子没有where条件,所以结果不变,大家自己可以加条件测试下)1 a 1 a2 b null null 3 c null nullzjcxc(邹建) ( ) 信誉:673    Blog  2006-9-24 21:07:04  得分: 0  对于其后的where条件,是对整个left join后产生的结果集进行筛选这个仅用于你在理解的时候, 如何去确定结果.  不代表sql实际执行使用的算法的先后, 如果真的要考虑那么多, 那就还要考虑索引, 还要考虑两表联接的联接方式(合并联接/哈希联接/循环连接)等等.所以楼上不要把理解和实际执行的算法划等号. pbsql(风云) ( ) 信誉:138    Blog  2006-9-23 15:18:18  得分: 0      这下解释对了:) 对于left join的on条件:用左边的记录去匹配右边的每条记录,匹配条件就是on里的条件,若右边有满足条件的记录,则取出来,若没有匹配的记录,则给个null值 对于其后的where条件,是对整个left join后产生的结果集进行筛选,所以条件放在on里和where里是完全不同的意思,切记!!!


个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除

» 1 »

发表评论:
昵称:
密码:
主页:
标题:
验证码:  (不区分大小写,请仔细填写,输错需重写评论内容!)
站点首页 | 联系我们 | 博客注册 | 博客登陆

Sponsored By W3CHINA
W3CHINA Blog 0.8 Processed in 0.047 second(s), page refreshed 144759932 times.
《全国人大常委会关于维护互联网安全的决定》  《计算机信息网络国际联网安全保护管理办法》
苏ICP备05006046号