手写SQL语句执行顺序及结果,看你了解多少

chengqscjh 2009-03-14 03:04:47
有如下测试数据

if object_id('tb') is not null drop table tb
create table tb(F1 varchar(10),id int) ----测试数据
insert tb select 'C',5
insert tb select 'A',1
insert tb select 'A',2
insert tb select 'B',1
insert tb select 'B',4
insert tb select 'B',7
insert tb select 'C',7
insert tb select 'C',5

请手写出如下语句的答案,并对第一条语句的执行顺序和结果进行剖析.

1.select * from tb a where exists(select * from tb where F1=a.F1 and id<a.id)
2.select * from tb a where id in (select id from tb where F1=a.F1 and id<a.id)
3.select distinct * from tb a where not exists(select 1 from tb where F1=a.F1 and id<a.id)


...全文
444 18 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
selectplayer 2009-03-16
  • 打赏
  • 举报
回复
我来学习
chengqscjh 2009-03-16
  • 打赏
  • 举报
回复
从执行计划中就可以看出了,谢谢楼上的各位,对于SQL语句掌握的功力还不够.以后要多来这逛逛了.
zzxap 2009-03-14
  • 打赏
  • 举报
回复
先看执行计划

首先执行表扫描的
ChinaJiaBing 2009-03-14
  • 打赏
  • 举报
回复


先理解他们的用法...
查询计划,dbms帮做的不用管他...
heavilyarmed 2009-03-14
  • 打赏
  • 举报
回复
我去试试
jlj84237485 2009-03-14
  • 打赏
  • 举报
回复
帮顶一下
ws_hgo 2009-03-14
  • 打赏
  • 举报
回复
SQL Select语句完整的执行顺序:

1、from子句组装来自不同数据源的数据;
2、where子句基于指定的条件对记录行进行筛选;
3、group by子句将数据划分为多个分组;
4、使用聚集函数进行计算;
5、使用having子句筛选分组;
6、计算所有的表达式;
7、使用order by对结果集进行排序。

告诉你一个方法怎么看
你选中要执行的sql之后
按执行计划
hui_hui_2007 2009-03-14
  • 打赏
  • 举报
回复
select * from tb a where exists(select * from tb where F1=a.F1 and id<a.id)
别名a对应的表是主查询,完整的tb表对应的是子查询。
现在查询的是,主查询与子查询中f1字段相同,但是主查询id大于子查询id有记录。


故以下记录是满足的,也就是别名a的表所对应的记录
F1 id
---------- -----------
A 2
B 4
B 7
C 7
hui_hui_2007 2009-03-14
  • 打赏
  • 举报
回复
对于第一句,你的查询结果就是别名 A 表的结果呀。
a.id>id
所以查询结果就是id大的。而不是id小的。

  • 打赏
  • 举报
回复
执行结果,自己执行一遍,然后分析下结果不就行了?
百年树人 2009-03-14
  • 打赏
  • 举报
回复
[Quote=引用楼主 chengqscjh 的帖子:]
有如下测试数据

SQL code
if object_id('tb') is not null drop table tb
create table tb(F1 varchar(10),id int) ----测试数据
insert tb select 'C',5
insert tb select 'A',1
insert tb select 'A',2
insert tb select 'B',1
insert tb select 'B',4
insert tb select 'B',7
insert tb select 'C',7
insert tb select 'C',5



请手写出如下语句的答案,并对第一条语句的执行顺序和结果进行剖析.

[/Quote]

可以把主查询和子查询看作是两个集合,比如X,Y,根据条件返回的记录就是X和Y的交集
1:相同的F1时,取X集合的ID大于Y集合的ID,所以是相同的F1除ID最小外的其他所有记录
2:有两个条件,X.id in(select Y.id ...)表示X.ID=Y.ID,但后面有个X.ID<Y.ID,显然这样的记录是不存在的
3:不存在Y集合中相同的F1有Y.ID<X.ID的记录,即X.ID>=Y.ID,当Y的id取最小时,X也只能取最小,所以这个条件是返回相同F1的最小ID的记录
chengqscjh 2009-03-14
  • 打赏
  • 举报
回复
对帖子没修改权限,可惜.我主要是想对第一条语句的执行不时很理解
从查询计划中我能理解到执行步骤,但是我的第一印象结果为:
A 1
B 1
B 4
C 5
-------------------
可结果是

A 2
B 4
B 7
C 7

结果与我想的相反,实在是不理解,可能是我的思路很有问题,特向各位大虾前来请教.主要是想了解语句执行的思路,和我错的地方.
ks_reny 2009-03-14
  • 打赏
  • 举报
回复
關注ing.
ws_hgo 2009-03-14
  • 打赏
  • 举报
回复
1.select * from tb a where exists(select * from tb where F1=a.F1 and id<a.id)

--先执行select * from tb where F1=a.F1 and id<a.id然后执行where exists最后是select * from tb a
凌枫 2009-03-14
  • 打赏
  • 举报
回复
楼上牛人都说很难很复杂,我就不在这里现丑了。
自己实践一下,然后分析一下不就可以了。
ai_li7758521 2009-03-14
  • 打赏
  • 举报
回复
顶个。
htl258_Tony 2009-03-14
  • 打赏
  • 举报
回复
梁老大发话,我也顶
liangCK 2009-03-14
  • 打赏
  • 举报
回复
很难很复杂,拿分走人。

34,838

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧