• 主页
  • 基础类
  • 应用实例
  • 新技术前沿

菜鸟学习子查询,学习到exists子查询-------------疯了

sshgame1 2014-01-03 02:35:37
建立了两张数据表,一张数据表命名为programinfo(有2行记录),另一张数据表命名为typeinfo(有2行记录)
有下列查询语句:
select * from programinfo
where exists(select * from typeinfo where programinfo.programtype=typeinfo.id)

请问是如下的执行过程吗:
系统执行到第一行的select,会将第一行的programinfo数据表加载进内存,
取出programinfo数据表的第一个记录(假设为A),然后进入exists后的子查询语句:
(select * from typeinfo where programinfo.programtype=typeinfo.id)
,在这个子查询语句里,
首先取出typeinfo的第一个数据(假设为a),并将A的programtype 与a的id进行比较
然后取出typeinfo的第二个数据(假设为b),并将A的programtype 与b的id进行比较
根据比较结果,决定是否输出外表中的A

取出programinfo数据表的第二个记录(假设为B),然后进入exists后的子查询语句:
(select * from typeinfo where programinfo.programtype=typeinfo.id)
,在这个子查询语句里,
首先取出typeinfo的第一个数据(假设为a),并将B的programtype 与a的id进行比较
然后取出typeinfo的第二个数据(假设为b),并将B的programtype 与b的id进行比较
根据比较结果,决定是否输出外表中的B

至此:执行完毕。

请问过程是这样吗?谢谢大师!

...全文
132 点赞 收藏 5
写回复
5 条回复
orochiheart 2014年01月04日
EXISTS用于检查子查询是否至少会返回一行数据,该子查询实际上并不返回任何数据,而是返回值True或False 也就是说 exists(内容XXX)中,内容XXX返回来的结果连一行数据都没有的话,则where语句等同于 where 1=2 参考:http://www.cnblogs.com/netserver/archive/2008/12/25/1362615.html
回复 点赞
阳泉酒家小当家 2014年01月03日
引用 3 楼 u013344315 的回复:
[quote=引用 1 楼 yupeigu 的回复:] 大致是这样的,不过有一个不一样: 在这个子查询语句里, 首先取出typeinfo的第一个数据(假设为a),并将A的programtype 与a的id进行比较 然后取出typeinfo的第二个数据(假设为b),并将A的programtype 与b的id进行比较 根据比较结果,决定是否输出外表中的A 就是,如果在typeinfo中的任何一个数据,比如就是你上面的a吧,如果将A的programtype 与a的id进行比较,有相同的,那么,接下去,就不再比较了。 因为exists这个是只存在的意思,也就是programtype中的某条记录的id值,只要存在于typeinfo中就可以, 比如:programtype的值 = 1 可能typeinfo表中的id = 1的的记录有2条,比如a 和b,那么只要取出a,然后把id和programtype比较,如果是相同的,那么就不会再次取出b了,因为programtype = 1的在typeinfo中exists的。
大师好人那!我想追问一下: 假设 数据表programinfo有4条记录: ____________ | programtye| | 10 | | 20 | | 30 | | 40 | |___________| 假设现在取出的programinfo表里的记录是30,“扫描typeinfo时,如果遇到一致的了”是指 从typeinfo中逐条取出记录,如果遇到只与30一致的(而不是与10 20 30 40一致吧)[/quote] 对的,只要遇到与30一致的,就可以
回复 点赞
sshgame1 2014年01月03日
引用 1 楼 yupeigu 的回复:
大致是这样的,不过有一个不一样: 在这个子查询语句里, 首先取出typeinfo的第一个数据(假设为a),并将A的programtype 与a的id进行比较 然后取出typeinfo的第二个数据(假设为b),并将A的programtype 与b的id进行比较 根据比较结果,决定是否输出外表中的A 就是,如果在typeinfo中的任何一个数据,比如就是你上面的a吧,如果将A的programtype 与a的id进行比较,有相同的,那么,接下去,就不再比较了。 因为exists这个是只存在的意思,也就是programtype中的某条记录的id值,只要存在于typeinfo中就可以, 比如:programtype的值 = 1 可能typeinfo表中的id = 1的的记录有2条,比如a 和b,那么只要取出a,然后把id和programtype比较,如果是相同的,那么就不会再次取出b了,因为programtype = 1的在typeinfo中exists的。
大师好人那!我想追问一下: 假设 数据表programinfo有4条记录: ____________ | programtye| | 10 | | 20 | | 30 | | 40 | |___________| 假设现在取出的programinfo表里的记录是30,“扫描typeinfo时,如果遇到一致的了”是指 从typeinfo中逐条取出记录,如果遇到只与30一致的(而不是与10 20 30 40一致吧)
回复 点赞
daishaodong 2014年01月03日
exists一般会在一个语句中出现2个同a表,并与其他b表比较后,得到符合条件的a表的记录 。
回复 点赞
阳泉酒家小当家 2014年01月03日
大致是这样的,不过有一个不一样: 在这个子查询语句里, 首先取出typeinfo的第一个数据(假设为a),并将A的programtype 与a的id进行比较 然后取出typeinfo的第二个数据(假设为b),并将A的programtype 与b的id进行比较 根据比较结果,决定是否输出外表中的A 就是,如果在typeinfo中的任何一个数据,比如就是你上面的a吧,如果将A的programtype 与a的id进行比较,有相同的,那么,接下去,就不再比较了。 因为exists这个是只存在的意思,也就是programtype中的某条记录的id值,只要存在于typeinfo中就可以, 比如:programtype的值 = 1 可能typeinfo表中的id = 1的的记录有2条,比如a 和b,那么只要取出a,然后把id和programtype比较,如果是相同的,那么就不会再次取出b了,因为programtype = 1的在typeinfo中exists的。
回复 点赞
发动态
发帖子
MS-SQL Server
创建于2007-09-28

1.4w+

社区成员

25.3w+

社区内容

MS-SQL Server相关内容讨论专区
社区公告
暂无公告