Student(S#,Sname,Sage,Ssex) 学生表  
Course(C#,Cname,T#) 课程表  
SC(S#,C#,score) 成绩表  
Teacher(T#,Tname) 教师表1.按平均成绩从高到低显示所有学生的“数据库”、“企业管理”、“英语”三门的课程成绩,按如下形式显示: 学生ID,,数据库,企业管理,英语,有效课程数,有效平均分
SELECT stuid as 学生ID
,(SELECT point FROM score WHERE score.stuid=t.stuid AND couid=1) AS 数据库
,(SELECT point FROM score WHERE score.stuid=t.stuid AND couid=2) AS 企业管理
,(SELECT point FROM score WHERE score.stuid=t.stuid AND couid=3) AS 英语
,COUNT(*) AS 有效课程数, AVG(t.point) AS 平均成绩
FROM score AS t 
GROUP BY stuid
  为什么不可以把里面的三个“select point from score”中的三个score换成后面起的别名t??
完整的执行顺序是怎样的呢?

解决方案 »

  1.   

       各位没明白我的意思哦,我是说子查询语句里面WHERE score.stuid=t.stuid 这里都可以访问后面起的别名t,为什么
    SELECT point FROM score 里的score却不能用t代替?
    SELECT stuid as 学生ID
    ,(SELECT point FROM score WHERE score.stuid=t.stuid AND couid=1) AS 数据库
    ,(SELECT point FROM score WHERE score.stuid=t.stuid AND couid=2) AS 企业管理
    ,(SELECT point FROM score WHERE score.stuid=t.stuid AND couid=3) AS 英语
    ,COUNT(*) AS 有效课程数, AVG(t.point) AS 平均成绩
    FROM score AS t 
    GROUP BY stuid
      

  2.   

    各位没明白我的意思哦,我是说子查询语句里面WHERE score.stuid=t.stuid 这里都可以访问后面起的别名t,为什么
    SELECT point FROM score 里的score却不能用t代替?
    SELECT stuid as 学生ID
    ,(SELECT point FROM score WHERE score.stuid=t.stuid AND couid=1) AS 数据库
    ,(SELECT point FROM score WHERE score.stuid=t.stuid AND couid=2) AS 企业管理
    ,(SELECT point FROM score WHERE score.stuid=t.stuid AND couid=3) AS 英语
    ,COUNT(*) AS 有效课程数, AVG(t.point) AS 平均成绩
    FROM score AS t  
    GROUP BY stuid
      

  3.   

    你需要了解一下:select 字段名1,字段名2 from table_name group by 字段名1 order by 字段名1
    这条SQL的执行顺序:
    #1. 先是FROM中的表连接
    #2. 结果进行GROUP BY 
    #3. 过滤字段,根据SELECT 中的字段 --到这步时,t表是已有的,在SELECT中引用它是没有问题的。
    #4. 排序
    具体的解释可看一下:SQL SERVER 2005技术内幕。
      

  4.   

    --为什么不可以把里面的三个“select point from score”中的三个score换成后面起的别名t
    --"select point from score" 中的score和t是引用2个不同的表. 你也可以写成这样:
    --SELECT point FROM score WHERE stuid=t.stuid AND couid=1
    --自己捉摸一下吧,基础.
      

  5.   

    Microsoft_SQL_Server_2005技术内幕:T-SQL查询一书中有详细的分析,建议楼主看看
      

  6.   

    后面的t ,是把表当成一个视图来看(或者你可以干脆把它看成是内容完全一样的另一个表),而子查询里,是将该查询中的数据与那个视图中的数据进行对比.
    比如:
    select * from tb t where not exists(select 1 from tb where class=a.class and col>t.col)
    条件中的比较,是找出与当前查询扫描到的行是否满足条件,即没有类别相同且col大于扫描行的col的,这样,查询出来的就是该class中最大的了.
      

  7.   

        一直都没得到问题的答案,估计都没明白我的意思哦,应该是我描述的不清楚,这里换个问法,如下:
    Student(S#,Sname,Sage,Ssex) 学生表   
    Course(C#,Cname,T#) 课程表   
    SC(S#,C#,score) 成绩表   
    Teacher(T#,Tname) 教师表1.按平均成绩从高到低显示所有学生的“英语”这门课的课程成绩
    SELECT stuid as 学生ID
    ,(SELECT point FROM score WHERE score.stuid=t.stuid AND couid=3) AS 英语
    , AVG(t.point) AS 平均成绩
    FROM score AS t 
    GROUP BY stuid
    请问是上面查询语句中的"FROM score AS t"先执行?还是"FROM score WHERE score.stuid=t.stuid"先执行呢?
    如果是"FROM score WHERE score.stuid=t.stuid"先执行那么里面的t是后来才给的别名为什么现在就可以用,而如果"FROM score AS t"先执行,那么为什么"FROM score WHERE score.stuid=t.stuid" 中的第一个score无法用t代替??用t代替进去就报错。
      

  8.   

    Student(S#,Sname,Sage,Ssex) 学生表   
    Course(C#,Cname,T#) 课程表   
    SC(S#,C#,score) 成绩表   
    Teacher(T#,Tname) 教师表1.按平均成绩从高到低显示所有学生的“英语”这门课的课程成绩SELECT stuid as 学生ID
    ,(SELECT point FROM score WHERE score.stuid=t.stuid AND couid=3) AS 英语
    ,COUNT(*) AS 有效课程数, AVG(t.point) AS 平均成绩
    FROM score AS t 
    GROUP BY stuid
    上面的是正确的写法,问题是,为什么不能把“(SELECT point FROM score WHERE score.stuid=t.stuid AND couid=3)”里面的第一个score用别名t代替??