SQL的一个基础问题,帮我解释一下为什么
create table tb(学号 varchar(15),成绩 int)
insert tb select '20010101 ',38
union all select '20010102 ',57
union all select '20010103 ',81
union all select '20010104 ',95
union all select '20010105 ',36
union all select '20010106 ',42
union all select '20010107 ',33
要得到:
类别 人次
------ -----------
及格 2
不及格 5
这是以前的一个帖子,可以这样写:
select 类别,人次=sum(case 类别 when '及格 ' then 1 when '不及格 ' then 1 end) from
(select 类别=(case when 成绩> =60 then '及格 ' else '不及格 ' end) from tb) a group by 类别
1、第一个from 是跟case 类别 when '及格 ' then 1 when '不及格 ' then 1 end配对的吧?
2、第一个select的from 在哪?或者说这个时候select没跟from一起使用,为什么?
3、‘a group by 类别’中a应该是表的别名吧? 为什么不能去掉a?
xiexie
------解决方案--------------------1、第一个from 是跟case 类别 when '及格 ' then 1 when '不及格 ' then 1 end配对的吧?
不是,是和select的。
2,就是 上面的 from
3,是别名。(select 类别=(case when 成绩> =60 then '及格 ' else '不及格 ' end) from tb)
相当于临时表。
------解决方案--------------------select 类别,count(1) 人次 from (select case when 成绩> =60 then '及格 ' else '不及格 ' end 类别 from tb) aa group by 类别
------解决方案--------------------1、第一个from 是跟case 类别 when '及格 ' then 1 when '不及格 ' then 1 end配对的吧?
沒明白什麼意思! 有select 當然就會有from.
2.第一個的select 有from 的
from (select 类别=(case when 成绩> =60 then '及格 ' else '不及格 ' end) from tb)
3、是別名。這裡SQL語法規定的
------解决方案-------------------- 1.from 用不找和case 配对
2.第一个from 就是与第一个select 对应的,sum(case 类别 when '及格 ' then 1 when '不及格 ' then 1 end) 就相当与一个具体数值,
就是
select 类别,人次=具体数 from 子表 a group by 类
3.(select 类别=(case when 成绩> =60 then '及格 ' else '不及格 ' end) from tb)
相当于一个子表,这个子表是满足括号里查询条件的,因为这属于新产生的表,没有表名,所以别名a 是必要的,这样,前面就可以写成 a. 类别 了
------解决方案--------------------现在看到还是要想想