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??
完整的执行顺序是怎样的呢?
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??
完整的执行顺序是怎样的呢?
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
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
这条SQL的执行顺序:
#1. 先是FROM中的表连接
#2. 结果进行GROUP BY
#3. 过滤字段,根据SELECT 中的字段 --到这步时,t表是已有的,在SELECT中引用它是没有问题的。
#4. 排序
具体的解释可看一下:SQL SERVER 2005技术内幕。
--"select point from score" 中的score和t是引用2个不同的表. 你也可以写成这样:
--SELECT point FROM score WHERE stuid=t.stuid AND couid=1
--自己捉摸一下吧,基础.
比如:
select * from tb t where not exists(select 1 from tb where class=a.class and col>t.col)
条件中的比较,是找出与当前查询扫描到的行是否满足条件,即没有类别相同且col大于扫描行的col的,这样,查询出来的就是该class中最大的了.
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代替进去就报错。
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代替??