|
|
|
|
Blog信息
|
blog名称:四裤全输的小窝~~ 日志总数:178 评论数量:699 留言数量:198 访问次数:1151520 建立时间:2005年10月29日 | |
|
|
|
|
 |
|
|
|
|
[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 »
|