请帮我解析这条语句:select a.id,a.departID,c.role_id from a,b,c where a.username='A' and a.pwd='A' and a.departID=b.id and a.id*=c.user_id 就是数据库执行该语句的过程,where关键字后的多个条件,数据库如何判断与解析。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 如果是sqlserver,查看一下show plans 如何查看?怎么用show plan?能够将过程一个个显示出来?我是用sql server2000 这个是由SQL SERVER内部进行处理的,应该是看不到的。 就这样假设:数据库第一步干什么,第二步干什么,几个判断条件如何执行,关键就是where后面那些条件如何执行的。 在查询分析器中按CTRL+K,然后执行该语句,会以图形方式显示执行计划 sql server --> query Anlayzer 应该是这样:1、对A表扫描过滤:where a.username='A' and a.pwd='A'2、A与B联接:a.departID=b.id 3、第二步的结果再与C外联接:a.id*=c.user_id *=是外連接相當於left outer join 最好不要用*=,MS说以后会不支持此用法.最好还是用left outer join. 反正FROM后面的表是最先进行扫描的连接条件,查看一下执行计划 我也有同样问题,很巧合,我分别用同样的例子执行后,"="没有结果,"*="有结果,这个用例大致这样,在a,b表中有数据,但是在c表中没有数据,"="情况下,查不出结果,"*="情况下,有结果,但是第三个字段值为"null"。不过,我还是不大清楚外连接是什么意思? 实际上我对这条语句的疑问在于:a.id与c.userid关联,a.departid与b.id关联,在a表中id是关键字嘛,唯一的,符合条件的话,因该只有一条记录查出,但是结果可以有多条记录。所以我想知道数据库是如何执行这条语句的。 你给出的3个表,据我分析,a表应该是用户表,b表是部门表,c表是权限表。如果使用“*=”的话,是左外连接,数据库先将a表的记录都取出来,进行hash排序,然后从c表中取出跟a表匹配的记录,如果没有就填上NULL,最后将结果返回,a表的所有记录都在里面。但如果是用“=”,数据库将两个表的记录进行笛卡儿积,然后从中取出符合指定条件的,由于你的c表为空,笛卡儿积的结果就是一个空记录集,所以不可能有记录返回。对于你的第二个问题,更好解释:如果b表的id有多个相同的,或c表userid有多个相同的,那么得到的记录就可能有多个a.id。可以模拟一下系统的处理情况,假设表a和b的记录分别为:a.id a.departid1 12 2b.id b.other1 b11 b2先建立笛卡儿积,如下:a.id a.departid b.id b.other1 1 1 b11 1 1 b22 2 1 b12 2 1 b2然后去掉不符合条件a.departid = b.id的记录3和4,得到的记录中就会有两条a.id一样的记录如果是左连接,结果是:a.id a.departid b.id b.other1 1 1 b11 1 1 b22 2 null null也会出现同样情况。不知这样的解释你是否明白?(另,数据库实际处理时,会有各种优化策略) 内联接:A.ID=B.ID 或inner join 是说只返回两个表中ID相同的记录.左联接:A.ID*=B.ID 或left outer join ,意思就是说两个表中ID相同的,及A表中的ID在B表中没有的都要返回到结果集中.右联接:A.ID=*B.ID 或right outer join,意思就是说两个表中ID相同的,及B表中的ID在A表中没有的都要返回到结果集中. 先过滤where a.username='A' and a.pwd='A' 再求笛卡尔集合 连接的问题已被icevi兄像写书一样的写的很详细了。 各位都回答的这么详细了,没分拿了。:) *= 和 left outer join 是不一样的,在null值处理上有差别,不过好像sql server2000又相同的了,不过*=不是sql 92的语法,我认为不要用它。bluepower2008(蓝色力量)说"如果使用“*=”的话,是左外连接,数据库先将a表的记录都取出来,进行hash排序"这句话是不准确的,我相信不是,我过我也说不准,最好用查询分析器试一下。 有关SQL数据库的一个小点。。。。 这条SQL怎么写? 求助啊啊啊啊啊啊~~~~~ 请问如何查询表中的第三条记录? 急!!!存储过程的返回的结果集为什么会自动关闭呢???? win 7旗舰版怎样安装sql server2008? mssql转mysql 关于数据表分区的问题。表分区真的会加快查询度吗? 字符数据类型(varchar)太小受限,如何解决?帮忙啊!谢谢! 用存储过程为什么得不到想要的结果 请大家帮我分析一下这个表如何设计?高分相送 还有比CSDN更火的软件技术论坛吗?在哪里?
那些条件如何执行的。
1、对A表扫描过滤:where a.username='A' and a.pwd='A'
2、A与B联接:a.departID=b.id
3、第二步的结果再与C外联接:a.id*=c.user_id
left outer join
如果使用“*=”的话,是左外连接,数据库先将a表的记录都取出来,进行hash排序,然后从c表中取出跟a表匹配的记录,如果没有就填上NULL,最后将结果返回,a表的所有记录都在里面。
但如果是用“=”,数据库将两个表的记录进行笛卡儿积,然后从中取出符合指定条件的,由于你的c表为空,笛卡儿积的结果就是一个空记录集,所以不可能有记录返回。
对于你的第二个问题,更好解释:如果b表的id有多个相同的,或c表userid有多个相同的,那么得到的记录就可能有多个a.id。可以模拟一下系统的处理情况,假设表a和b的记录分别为:
a.id a.departid
1 1
2 2
b.id b.other
1 b1
1 b2
先建立笛卡儿积,如下:
a.id a.departid b.id b.other
1 1 1 b1
1 1 1 b2
2 2 1 b1
2 2 1 b2
然后去掉不符合条件a.departid = b.id的记录3和4,得到的记录中就会有两条a.id一样的记录
如果是左连接,结果是:
a.id a.departid b.id b.other
1 1 1 b1
1 1 1 b2
2 2 null null
也会出现同样情况。
不知这样的解释你是否明白?(另,数据库实际处理时,会有各种优化策略)
左联接:A.ID*=B.ID 或left outer join ,意思就是说两个表中ID相同的,及A表中的ID在B表中没有的都要返回到结果集中.
右联接:A.ID=*B.ID 或right outer join,意思就是说两个表中ID相同的,及B表中的ID在A表中没有的都要返回到结果集中.
再求笛卡尔集合