zhang_meixia
2015-04-29 13:48
采纳率: 44.4%
浏览 2.4k

SQL语句如何执行的(student学生表与SC成绩表)

Student 是学生表;SC是学生成绩表。
如Stuent表数据如下:
S# Sname Sage Ssex
01 赵雷 1990-01-01 00:00:00.000 男
02 钱电 1990-12-21 00:00:00.000 男
03 孙风 1990-05-20 00:00:00.000 男
04 李云 1990-08-06 00:00:00.000 男
05 周梅 1991-12-01 00:00:00.000 女
06 吴兰 1992-03-01 00:00:00.000 女
07 郑竹 1989-07-01 00:00:00.000 女
08 王菊 1990-01-20 00:00:00.000 女

SC表数据如下:
S# C# Score (其中C#表示某一课程编号)
01 01 80.0
01 02 90.0
01 03 99.0
02 01 70.0
02 02 60.0
02 03 80.0
03 01 80.0
03 02 80.0
03 03 80.0
04 01 50.0
04 02 30.0
04 03 20.0
05 01 76.0
05 02 87.0
06 01 31.0
06 03 34.0
07 02 89.0
07 03 98.0

我想知道下面的SQL语句是如何执行的?
select s.*,sc1.Score [课程'01'分数],sc2.Score [课程'02'分数]from dbo.Student s, SC sc1, SC sc2
where s.S#=sc1.S# and s.S#=sc2.S# and sc1.C#='01' and sc2.C#='02' and sc1.Score > sc2.Score

到底是下面哪种执行步骤呢?它们三者之间有什么不同吗,会产生什么不同的结果?
可能执行步骤一:
1. 把stuent、sc1、sc2按S#依次内连接
2. 在Step1中得到的一张大表进行筛选,符合sc1.C#='01' and sc2.C#='02'条件的筛选出来,得到最终结果

可能执行步骤二:
1. 把sc1中的数据按sc1.C#='01'先筛选出符合条件的记录,得到一张结果表如A
2. 把sc2中的数据按sc2.C#='02'先筛选出符合条件的记录,得到一张结果表如B
3. 再把stuent、step1中的A表、step2中的B表按s#内连接,得到最终的结果

可能执行步骤三:
1. 将student、sc1按s#及sc1.C#='01'的条件进行内连接,得到结果A
2. 将step中的结果A与sc2按s#及sc2.C#='02'的条件进行内连接,得到最终的结果
即类似于下面的执行SQL语句:
select a.*,b.Score[课程'01'分数],c.Score[课程'02'分数] from Student a
join SC b on a.S#=b.S# and b.C#='01'
join SC c on a.S#=c.S# and c.C#='02'
where b.Score < c.Score

谁能告诉我,到底是按哪种方式进行连接的,这三种方式有什么区别?

  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

3条回答 默认 最新

  • devmiao 2015-04-29 13:51

    连接的优先级高,先连接,后执行where

    打赏 评论
  • jing_Trista 2015-04-30 07:32

    先连接,后执行where

    打赏 评论
  • WorldMobile 2015-04-30 07:39

    如果是oracle的话,可以使用Toad,看到执行计划,非常清楚

    打赏 评论

相关推荐 更多相似问题