网站导航网学 原创论文 原创专题 网站设计 最新系统 原创论文 论文降重 发表论文 论文发表 UI设计定制 论文答辩PPT格式排版 期刊发表 论文专题
返回网学首页
网学原创论文
最新论文 推荐专题 热门论文 论文专题
当前位置: 网学 > 设计资源 > 数据库 > 正文

一个项目涉及到的50个Sql语句

论文降重修改服务、格式排版等 获取论文 论文降重及排版 论文发表 相关服务
  1. /* 
  2. 标题:一个项目涉及到的50个Sql语句(整理版) 
  3. 作者:爱新觉罗.毓华(十八年风雨,守得冰山雪莲花开) 
  4. 时间:2010-05-10 
  5. 地点:重庆航天职业学院 
  6. 说明:以下五十个语句都按照测试数据进行过测试,最好每次只单独运行一个语句。 
  7. 问题及描述: 
  8. --1.学生表 
  9. Student(S#,Sname,Sage,Ssex) --S# 学生编号,Sname 学生姓名,Sage 出生年月,Ssex 学生性别 
  10. --2.课程表  
  11. Course(C#,Cname,T#) --C# --课程编号,Cname 课程名称,T# 教师编号 
  12. --3.教师表  
  13. Teacher(T#,Tname) --T# 教师编号,Tname 教师姓名 
  14. --4.成绩表  
  15. SC(S#,C#,score) --S# 学生编号,C# 课程编号,score 分数 
  16. */ 
  17. --创建测试数据 
  18. create table Student(S# varchar(10),Sname nvarchar(10),Sage datetime,Ssex nvarchar(10)) 
  19. insert into Student values('01' , N'赵雷' , '1990-01-01' , N'男'
  20. insert into Student values('02' , N'钱电' , '1990-12-21' , N'男'
  21. insert into Student values('03' , N'孙风' , '1990-05-20' , N'男'
  22. insert into Student values('04' , N'李云' , '1990-08-06' , N'男'
  23. insert into Student values('05' , N'周梅' , '1991-12-01' , N'女'
  24. insert into Student values('06' , N'吴兰' , '1992-03-01' , N'女'
  25. insert into Student values('07' , N'郑竹' , '1989-07-01' , N'女'
  26. insert into Student values('08' , N'王菊' , '1990-01-20' , N'女'
  27. create table Course(C# varchar(10),Cname nvarchar(10),T# varchar(10)) 
  28. insert into Course values('01' , N'语文' , '02'
  29. insert into Course values('02' , N'数学' , '01'
  30. insert into Course values('03' , N'英语' , '03'
  31. create table Teacher(T# varchar(10),Tname nvarchar(10)) 
  32. insert into Teacher values('01' , N'张三'
  33. insert into Teacher values('02' , N'李四'
  34. insert into Teacher values('03' , N'王五'
  35. create table SC(S# varchar(10),C# varchar(10),score decimal(18,1)) 
  36. insert into SC values('01' , '01' , 80) 
  37. insert into SC values('01' , '02' , 90) 
  38. insert into SC values('01' , '03' , 99) 
  39. insert into SC values('02' , '01' , 70) 
  40. insert into SC values('02' , '02' , 60) 
  41. insert into SC values('02' , '03' , 80) 
  42. insert into SC values('03' , '01' , 80) 
  43. insert into SC values('03' , '02' , 80) 
  44. insert into SC values('03' , '03' , 80) 
  45. insert into SC values('04' , '01' , 50) 
  46. insert into SC values('04' , '02' , 30) 
  47. insert into SC values('04' , '03' , 20) 
  48. insert into SC values('05' , '01' , 76) 
  49. insert into SC values('05' , '02' , 87) 
  50. insert into SC values('06' , '01' , 31) 
  51. insert into SC values('06' , '03' , 34) 
  52. insert into SC values('07' , '02' , 89) 
  53. insert into SC values('07' , '03' , 98) 
  54. go 
  55.  
  56. --1、查询"01"课程比"02"课程成绩高的学生的信息及课程分数 
  57. --1.1、查询同时存在"01"课程和"02"课程的情况 
  58. select a.* , b.score [课程'01'的分数],c.score [课程'02'的分数] from Student a , SC b , SC c  
  59. where a.S# = b.S# and a.S# = c.S# and b.C# = '01' and c.C# = '02' and b.score > c.score 
  60. --1.2、查询同时存在"01"课程和"02"课程的情况和存在"01"课程但可能不存在"02"课程的情况(不存在时显示为null)(以下存在相同内容时不再解释) 
  61. select a.* , b.score [课程"01"的分数],c.score [课程"02"的分数] from Student a  
  62. left join SC b on a.S# = b.S# and b.C# = '01' 
  63. left join SC c on a.S# = c.S# and c.C# = '02' 
  64. where b.score > isnull(c.score,0) 
  65.  
  66. --2、查询"01"课程比"02"课程成绩低的学生的信息及课程分数 
  67. --2.1、查询同时存在"01"课程和"02"课程的情况 
  68. select a.* , b.score [课程'01'的分数],c.score [课程'02'的分数] from Student a , SC b , SC c  
  69. where a.S# = b.S# and a.S# = c.S# and b.C# = '01' and c.C# = '02' and b.score < c.score 
  70. --2.2、查询同时存在"01"课程和"02"课程的情况和不存在"01"课程但存在"02"课程的情况 
  71. select a.* , b.score [课程"01"的分数],c.score [课程"02"的分数] from Student a  
  72. left join SC b on a.S# = b.S# and b.C# = '01' 
  73. left join SC c on a.S# = c.S# and c.C# = '02' 
  74. where isnull(b.score,0) < c.score 
  75.  
  76. --3、查询平均成绩大于等于60分的同学的学生编号和学生姓名和平均成绩 
  77. select a.S# , a.Sname , cast(avg(b.score) as decimal(18,2)) avg_score 
  78. from Student a , sc b 
  79. where a.S# = b.S# 
  80. group by a.S# , a.Sname 
  81. having cast(avg(b.score) as decimal(18,2)) >= 60  
  82. order by a.S# 
  83.  
  84. --4、查询平均成绩小于60分的同学的学生编号和学生姓名和平均成绩 
  85. --4.1、查询在sc表存在成绩的学生信息的SQL语句。 
  86. select a.S# , a.Sname , cast(avg(b.score) as decimal(18,2)) avg_score 
  87. from Student a , sc b 
  88. where a.S# = b.S# 
  89. group by a.S# , a.Sname 
  90. having cast(avg(b.score) as decimal(18,2)) < 60  
  91. order by a.S# 
  92. --4.2、查询在sc表中不存在成绩的学生信息的SQL语句。 
  93. select a.S# , a.Sname , isnull(cast(avg(b.score) as decimal(18,2)),0) avg_score 
  94. from Student a left join sc b 
  95. on a.S# = b.S# 
  96. group by a.S# , a.Sname 
  97. having isnull(cast(avg(b.score) as decimal(18,2)),0) < 60  
  98. order by a.S# 
  99.  
  100. --5、查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩 
  101. --5.1、查询所有有成绩的SQL。 
  102. select a.S# [学生编号], a.Sname [学生姓名], count(b.C#) 选课总数, sum(score) [所有课程的总成绩] 
  103. from Student a , SC b  
  104. where a.S# = b.S#  
  105. group by a.S#,a.Sname  
  106. order by a.S# 
  107. --5.2、查询所有(包括有成绩和无成绩)的SQL。 
  108. select a.S# [学生编号], a.Sname [学生姓名], count(b.C#) 选课总数, sum(score) [所有课程的总成绩] 
  109. from Student a left join SC b  
  110. on a.S# = b.S#  
  111. group by a.S#,a.Sname  
  112. order by a.S# 
  113.  
  114. --6、查询"李"姓老师的数量  
  115. --方法1 
  116. select count(Tname) ["李"姓老师的数量] from Teacher where Tname like N'李%' 
  117. --方法2 
  118. select count(Tname) ["李"姓老师的数量] from Teacher where left(Tname,1) = N'李' 
  119. /* 
  120. "李"姓老师的数量    
  121. -----------  
  122. */ 
  123.  
  124. --7、查询学过"张三"老师授课的同学的信息  
  125. select distinct Student.* from Student , SC , Course , Teacher  
  126. where Student.S# = SC.S# and SC.C# = Course.C# and Course.T# = Teacher.T# and Teacher.Tname = N'张三' 
  127. order by Student.S# 
  128.  
  129. --8、查询没学过"张三"老师授课的同学的信息  
  130. select m.* from Student m where S# not in (select distinct SC.S# from SC , Course , Teacher where SC.C# = Course.C# and Course.T# = Teacher.T# and Teacher.Tname = N'张三'order by m.S# 
  131.  
  132. --9、查询学过编号为"01"并且也学过编号为"02"的课程的同学的信息 
  133. --方法1 
  134. select Student.* from Student , SC where Student.S# = SC.S# and SC.C# = '01' and exists (Select 1 from SC SC_2 where SC_2.S# = SC.S# and SC_2.C# = '02'order by Student.S# 
  135. --方法2 
  136. select Student.* from Student , SC where Student.S# = SC.S# and SC.C# = '02' and exists (Select 1 from SC SC_2 where SC_2.S# = SC.S# and SC_2.C# = '01'order by Student.S# 
  137. --方法3 
  138. select m.* from Student m where S# in 
  139.   select S# from 
  140.   ( 
  141.     select distinct S# from SC where C# = '01' 
  142.     union all 
  143.     select distinct S# from SC where C# = '02' 
  144.   ) t group by S# having count(1) = 2  
  145. order by m.S# 
  146.  
  147. --10、查询学过编号为"01"但是没有学过编号为"02"的课程的同学的信息 
  148. --方法1 
  149. select Student.* from Student , SC where Student.S# = SC.S# and SC.C# = '01' and not exists (Select 1 from SC SC_2 where SC_2.S# = SC.S# and SC_2.C# = '02'order by Student.S# 
  150. --方法2 
  151. select Student.* from Student , SC where Student.S# = SC.S# and SC.C# = '01' and Student.S# not in (Select SC_2.S# from SC SC_2 where SC_2.S# = SC.S# and SC_2.C# = '02'order by Student.S# 
  152.  
  153. --11、查询没有学全所有课程的同学的信息  
  154. --11.1、 
  155. select Student.* 
  156. from Student , SC  
  157. where Student.S# = SC.S#  
  158. group by Student.S# , Student.Sname , Student.Sage , Student.Ssex having count(C#) < (select count(C#) from Course)  
  159. --11.2 
  160. select Student.* 
  161. from Student left join SC  
  162. on Student.S# = SC.S#  
  163. group by Student.S# , Student.Sname , Student.Sage , Student.Ssex having count(C#) < (select count(C#) from Course)  
  164.  
  165. --12、查询至少有一门课与学号为"01"的同学所学相同的同学的信息  
  166. select distinct Student.* from Student , SC where Student.S# = SC.S# and SC.C# in (select C# from SC where S# = '01'and Student.S# <> '01' 
  167.  
  168. --13、查询和"01"号的同学学习的课程完全相同的其他同学的信息  
  169. select Student.* from Student where S# in 
  170. (select distinct SC.S# from SC where S# <> '01' and SC.C# in (select distinct C# from SC where S# = '01')  
  171. group by SC.S# having count(1) = (select count(1) from SC where S#='01'))  
  172.  
  173. --14、查询没学过"张三"老师讲授的任一门课程的学生姓名  
  174. select student.* from student where student.S# not in  
  175. (select distinct sc.S# from sc , course , teacher where sc.C# = course.C# and course.T# = teacher.T# and teacher.tname = N'张三'
  176. order by student.S# 
  177.  
  178. --15、查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩  
  179. select student.S# , student.sname , cast(avg(score) as decimal(18,2)) avg_score from student , sc  
  180. where student.S# = SC.S# and student.S# in (select S# from SC where score < 60 group by S# having count(1) >= 2) 
  181. group by student.S# , student.sname 
  182.  
  183. --16、检索"01"课程分数小于60,按分数降序排列的学生信息 
  184. select student.* , sc.C# , sc.score from student , sc  
  185. where student.S# = SC.S# and sc.score < 60 and sc.C# = '01' 
  186. order by sc.score desc   
  187.  
  188. --17、按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩 
  189. --17.1 SQL 2000 静态  
  190. select a.S# 学生编号 , a.Sname 学生姓名 , 
  191.        max(case c.Cname when N'语文' then b.score else null end) [语文], 
  192.        max(case c.Cname when N'数学' then b.score else null end) [数学], 
  193.        max(case c.Cname when N'英语' then b.score else null end) [英语], 
  194.        cast(avg(b.score) as decimal(18,2)) 平均分 
  195. from Student a  
  196. left join SC b on a.S# = b.S# 
  197. left join Course c on b.C# = c.C# 
  198. group by a.S# , a.Sname 
  199. order by 平均分 desc 
  200. --17.2 SQL 2000 动态  
  201. declare @sql nvarchar(4000) 
  202. set @sql = 'select a.S# ' + N'学生编号' + ' , a.Sname ' + N'学生姓名' 
  203. select @sql = @sql + ',max(case c.Cname when N'''+Cname+''' then b.score else null end) ['+Cname+']' 
  204. from (select distinct Cname from Course) as t 
  205. set @sql = @sql + ' , cast(avg(b.score) as decimal(18,2)) ' + N'平均分' + ' from Student a left join SC b on a.S# = b.S# left join Course c on b.C# = c.C# 
  206. group by a.S# , a.Sname order by ' + N'平均分' + ' desc
  207. exec(@sql) 
  208. --17.3 有关sql 2005的动静态写法参见我的文章《普通行列转换(version 2.0)》或《普通行列转换(version 3.0)》。 
  209.  
  210. --18、查询各科成绩最高分、最低分和平均分:以如下形式显示:课程ID,课程name,最高分,最低分,平均分,及格率,中等率,优良率,优秀率 
  211. --及格为>=60,中等为:70-80,优良为:80-90,优秀为:>=90 
  212. --方法1 
  213. select m.C# [课程编号], m.Cname [课程名称],  
  214.   max(n.score) [最高分], 
  215.   min(n.score) [最低分], 
  216.   cast(avg(n.score) as decimal(18,2)) [平均分], 
  217.   cast((select count(1) from SC where C# = m.C# and score >= 60)*100.0 / (select count(1) from SC where C# = m.C#) as decimal(18,2)) [及格率(%)], 
  218.   cast((select count(1) from SC where C# = m.C# and score >= 70 and score < 80 )*100.0 / (select count(1) from SC where C# = m.C#) as decimal(18,2)) [中等率(%)], 
  219.   cast((select count(1) from SC where C# = m.C# and score >= 80 and score < 90 )*100.0 / (select count(1) from SC where C# = m.C#) as decimal(18,2)) [优良率(%)], 
  220.   cast((select count(1) from SC where C# = m.C# and score >= 90)*100.0 / (select count(1) from SC where C# = m.C#) as decimal(18,2)) [优秀率(%)] 
  221. from Course m , SC n 
  222. where m.C# = n.C# 
  223. group by m.C# , m.Cname 
  224. order by m.C# 
  225. --方法2 
  226. select m.C# [课程编号], m.Cname [课程名称],  
  227.   (select max(score) from SC where C# = m.C#) [最高分], 
  228.   (select min(score) from SC where C# = m.C#) [最低分], 
  229.   (select cast(avg(score) as decimal(18,2)) from SC where C# = m.C#) [平均分], 
  230.   cast((select count(1) from SC where C# = m.C# and score >= 60)*100.0 / (select count(1) from SC where C# = m.C#) as decimal(18,2)) [及格率(%)], 
  231.   cast((select count(1) from SC where C# = m.C# and score >= 70 and score < 80 )*100.0 / (select count(1) from SC where C# = m.C#) as decimal(18,2)) [中等率(%)], 
  232.   cast((select count(1) from SC where C# = m.C# and score >= 80 and score < 90 )*100.0 / (select count(1) from SC where C# = m.C#) as decimal(18,2)) [优良率(%)], 
  233.   cast((select count(1) from SC where C# = m.C# and score >= 90)*100.0 / (select count(1) from SC where C# = m.C#) as decimal(18,2)) [优秀率(%)] 
  234. from Course m  
  235. order by m.C# 
  236.  
  237. --19、按各科成绩进行排序,并显示排名 
  238. --19.1 sql 2000用子查询完成 
  239. --Score重复时保留名次空缺 
  240. select t.* , px = (select count(1) from SC where C# = t.C# and score > t.score) + 1 from sc t order by t.c# , px  
  241. --Score重复时合并名次 
  242. select t.* , px = (select count(distinct score) from SC where C# = t.C# and score >= t.score) from sc t order by t.c# , px  
  243. --19.2 sql 2005用rank,DENSE_RANK完成 
  244. --Score重复时保留名次空缺(rank完成) 
  245. select t.* , px = rank() over(partition by c# order by score descfrom sc t order by t.C# , px  
  246. --Score重复时合并名次(DENSE_RANK完成) 
  247. select t.* , px = DENSE_RANK() over(partition by c# order by score descfrom sc t order by t.C# , px  
  248.  
  249. --20、查询学生的总成绩并进行排名 
  250. --20.1 查询学生的总成绩 
  251. select m.S# [学生编号] ,  
  252.        m.Sname [学生姓名] , 
  253.        isnull(sum(score),0) [总成绩] 
  254. from Student m left join SC n on m.S# = n.S#  
  255. group by m.S# , m.Sname 
  256. order by [总成绩] desc 
  257. --20.2 查询学生的总成绩并进行排名,sql 2000用子查询完成,分总分重复时保留名次空缺和不保留名次空缺两种。 
  258. select t1.* , px = (select count(1) from  
  259.   select m.S# [学生编号] ,  
  260.          m.Sname [学生姓名] , 
  261.          isnull(sum(score),0) [总成绩] 
  262.   from Student m left join SC n on m.S# = n.S#  
  263.   group by m.S# , m.Sname 
  264. ) t2 where 总成绩 > t1.总成绩) + 1 from  
  265.   select m.S# [学生编号] ,  
  266.          m.Sname [学生姓名] , 
  267.          isnull(sum(score),0) [总成绩] 
  268.   from Student m left join SC n on m.S# = n.S#  
  269.   group by m.S# , m.Sname 
  270. ) t1 
  271. order by px 
  272.  
  273. select t1.* , px = (select count(distinct 总成绩) from  
  274.   select m.S# [学生编号] ,  
  275.          m.Sname [学生姓名] , 
  276.          isnull(sum(score),0) [总成绩] 
  277.   from Student m left join SC n on m.S# = n.S#  
  278.   group by m.S# , m.Sname 
  279. ) t2 where 总成绩 >= t1.总成绩) from  
  280.   select m.S# [学生编号] ,  
  281.          m.Sname [学生姓名] , 
  282.          isnull(sum(score),0) [总成绩] 
  283.   from Student m left join SC n on m.S# = n.S#  
  284.   group by m.S# , m.Sname 
  285. ) t1 
  286. order by px 
  287. --20.3 查询学生的总成绩并进行排名,sql 2005用rank,DENSE_RANK完成,分总分重复时保留名次空缺和不保留名次空缺两种。 
  288. select t.* , px = rank() over(order by [总成绩] descfrom 
  289.   select m.S# [学生编号] ,  
  290.          m.Sname [学生姓名] , 
  291.          isnull(sum(score),0) [总成绩] 
  292.   from Student m left join SC n on m.S# = n.S#  
  293.   group by m.S# , m.Sname 
  294. ) t 
  295. order by px 
  296.  
  297. select t.* , px = DENSE_RANK() over(order by [总成绩] descfrom 
  298.   select m.S# [学生编号] ,  
  299.          m.Sname [学生姓名] , 
  300.          isnull(sum(score),0) [总成绩] 
  301.   from Student m left join SC n on m.S# = n.S#  
  302.   group by m.S# , m.Sname 
  303. ) t 
  304. order by px 
  305.  
  306. --21、查询不同老师所教不同课程平均分从高到低显示  
  307. select m.T# , m.Tname , cast(avg(o.score) as decimal(18,2)) avg_score 
  308. from Teacher m , Course n , SC o 
  309. where m.T# = n.T# and n.C# = o.C# 
  310. group by m.T# , m.Tname 
  311. order by avg_score desc 
  312.  
  313. --22、查询所有课程的成绩第2名到第3名的学生信息及该课程成绩 
  314. --22.1 sql 2000用子查询完成 
  315. --Score重复时保留名次空缺 
  316. select * from (select t.* , px = (select count(1) from SC where C# = t.C# and score > t.score) + 1 from sc t) m where px between 2 and 3 order by m.c# , m.px  
  317. --Score重复时合并名次 
  318. select * from (select t.* , px = (select count(distinct score) from SC where C# = t.C# and score >= t.score) from sc t) m where px between 2 and 3 order by m.c# , m.px  
  319. --22.2 sql 2005用rank,DENSE_RANK完成 
  320. --Score重复时保留名次空缺(rank完成) 
  321. select * from (select t.* , px = rank() over(partition by c# order by score descfrom sc t) m where px between 2 and 3 order by m.C# , m.px  
  322. --Score重复时合并名次(DENSE_RANK完成) 
  323. select * from (select t.* , px = DENSE_RANK() over(partition by c# order by score descfrom sc t) m where px between 2 and 3 order by m.C# , m.px  
  324.  
  325. --23、统计各科成绩各分数段人数:课程编号,课程名称,[100-85],[85-70],[70-60],[0-60]及所占百分比  
  326. --23.1 统计各科成绩各分数段人数:课程编号,课程名称,[100-85],[85-70],[70-60],[0-60] 
  327. --横向显示 
  328. select Course.C# [课程编号] , Cname as [课程名称] , 
  329.   sum(case when score >= 85 then 1 else 0 end) [85-100], 
  330.   sum(case when score >= 70 and score < 85 then 1 else 0 end) [70-85], 
  331.   sum(case when score >= 60 and score < 70 then 1 else 0 end) [60-70], 
  332.   sum(case when score < 60 then 1 else 0 end) [0-60] 
  333. from sc , Course  
  334. where SC.C# = Course.C#  
  335. group by Course.C# , Course.Cname 
  336. order by Course.C# 
  337. --纵向显示1(显示存在的分数段) 
  338. select m.C# [课程编号] , m.Cname [课程名称] , 分数段 = ( 
  339.   case when n.score >= 85 then '85-100' 
  340.        when n.score >= 70 and n.score < 85 then '70-85' 
  341.        when n.score >= 60 and n.score < 70 then '60-70' 
  342.        else '0-60' 
  343.   end) ,  
  344.   count(1) 数量  
  345. from Course m , sc n 
  346. where m.C# = n.C#  
  347. group by m.C# , m.Cname , ( 
  348.   case when n.score >= 85 then '85-100' 
  349.        when n.score >= 70 and n.score < 85 then '70-85' 
  350.        when n.score >= 60 and n.score < 70 then '60-70' 
  351.        else '0-60' 
  352.   end
  353. order by m.C# , m.Cname , 分数段 
  354. --纵向显示2(显示存在的分数段,不存在的分数段用0显示) 
  355. select m.C# [课程编号] , m.Cname [课程名称] , 分数段 = ( 
  356.   case when n.score >= 85 then '85-100' 
  357.        when n.score >= 70 and n.score < 85 then '70-85' 
  358.        when n.score >= 60 and n.score < 70 then '60-70' 
  359.        else '0-60' 
  360.   end) ,  
  361.   count(1) 数量  
  362. from Course m , sc n 
  363. where m.C# = n.C#  
  364. group by all m.C# , m.Cname , ( 
  365.   case when n.score >= 85 then '85-100' 
  366.        when n.score >= 70 and n.score < 85 then '70-85' 
  367.        when n.score >= 60 and n.score < 70 then '60-70' 
  368.        else '0-60' 
  369.   end
  370. order by m.C# , m.Cname , 分数段 
  371.  
  372. --23.2 统计各科成绩各分数段人数:课程编号,课程名称,[100-85],[85-70],[70-60],[<60]及所占百分比  
  373. --横向显示 
  374. select m.C# 课程编号, m.Cname 课程名称, 
  375.   (select count(1) from SC where C# = m.C# and score < 60) [0-60], 
  376.   cast((select count(1) from SC where C# = m.C# and score < 60)*100.0 / (select count(1) from SC where C# = m.C#) as decimal(18,2)) [百分比(%)], 
  377.   (select count(1) from SC where C# = m.C# and score >= 60 and score < 70) [60-70], 
  378.   cast((select count(1) from SC where C# = m.C# and score >= 60 and score < 70)*100.0 / (select count(1) from SC where C# = m.C#) as decimal(18,2)) [百分比(%)], 
  379.   (select count(1) from SC where C# = m.C# and score >= 70 and score < 85) [70-85], 
  380.   cast((select count(1) from SC where C# = m.C# and score >= 70 and score < 85)*100.0 / (select count(1) from SC where C# = m.C#) as decimal(18,2)) [百分比(%)], 
  381.   (select count(1) from SC where C# = m.C# and score >= 85) [85-100], 
  382.   cast((select count(1) from SC where C# = m.C# and score >= 85)*100.0 / (select count(1) from SC where C# = m.C#) as decimal(18,2)) [百分比(%)] 
  383. from Course m  
  384. order by m.C# 
  385. --纵向显示1(显示存在的分数段) 
  386. select m.C# [课程编号] , m.Cname [课程名称] , 分数段 = ( 
  387.   case when n.score >= 85 then '85-100' 
  388.        when n.score >= 70 and n.score < 85 then '70-85' 
  389.        when n.score >= 60 and n.score < 70 then '60-70' 
  390.        else '0-60' 
  391.   end) ,  
  392.   count(1) 数量 ,   
  393.   cast(count(1) * 100.0 / (select count(1) from sc where C# = m.C#) as decimal(18,2)) [百分比(%)] 
  394. from Course m , sc n 
  395. where m.C# = n.C#  
  396. group by m.C# , m.Cname , ( 
  397.   case when n.score >= 85 then '85-100' 
  398.        when n.score >= 70 and n.score < 85 then '70-85' 
  399.        when n.score >= 60 and n.score < 70 then '60-70' 
  400.        else '0-60' 
  401.   end
  402. order by m.C# , m.Cname , 分数段 
  403. --纵向显示2(显示存在的分数段,不存在的分数段用0显示) 
  404. select m.C# [课程编号] , m.Cname [课程名称] , 分数段 = ( 
  405.   case when n.score >= 85 then '85-100' 
  406.        when n.score >= 70 and n.score < 85 then '70-85' 
  407.        when n.score >= 60 and n.score < 70 then '60-70' 
  408.        else '0-60' 
  409.   end) ,  
  410.   count(1) 数量 ,   
  411.   cast(count(1) * 100.0 / (select count(1) from sc where C# = m.C#) as decimal(18,2)) [百分比(%)] 
  412. from Course m , sc n 
  413. where m.C# = n.C#  
  414. group by all m.C# , m.Cname , ( 
  415.   case when n.score >= 85 then '85-100' 
  416.        when n.score >= 70 and n.score < 85 then '70-85' 
  417.        when n.score >= 60 and n.score < 70 then '60-70' 
  418.        else '0-60' 
  419.   end
  420. order by m.C# , m.Cname , 分数段 
  421.  
  422. --24、查询学生平均成绩及其名次  
  423. --24.1 查询学生的平均成绩并进行排名,sql 2000用子查询完成,分平均成绩重复时保留名次空缺和不保留名次空缺两种。 
  424. select t1.* , px = (select count(1) from  
  425.   select m.S# [学生编号] ,  
  426.          m.Sname [学生姓名] , 
  427.          isnull(cast(avg(score) as decimal(18,2)),0) [平均成绩] 
  428.   from Student m left join SC n on m.S# = n.S#  
  429.   group by m.S# , m.Sname 
  430. ) t2 where 平均成绩 > t1.平均成绩) + 1 from  
  431.   select m.S# [学生编号] ,  
  432.          m.Sname [学生姓名] , 
  433.          isnull(cast(avg(score) as decimal(18,2)),0) [平均成绩] 
  434.   from Student m left join SC n on m.S# = n.S#  
  435.   group by m.S# , m.Sname 
  436. ) t1 
  437. order by px 
  438.  
  439. select t1.* , px = (select count(distinct 平均成绩) from  
  440.   select m.S# [学生编号] ,  
  441.          m.Sname [学生姓名] , 
  442.          isnull(cast(avg(score) as decimal(18,2)),0) [平均成绩] 
  443.   from Student m left join SC n on m.S# = n.S#  
  444.   group by m.S# , m.Sname 
  445. ) t2 where 平均成绩 >= t1.平均成绩) from  
  446.   select m.S# [学生编号] ,  
  447.          m.Sname [学生姓名] , 
  448.          isnull(cast(avg(score) as decimal(18,2)),0) [平均成绩] 
  449.   from Student m left join SC n on m.S# = n.S#  
  450.   group by m.S# , m.Sname 
  451. ) t1 
  452. order by px 
  453. --24.2 查询学生的平均成绩并进行排名,sql 2005用rank,DENSE_RANK完成,分平均成绩重复时保留名次空缺和不保留名次空缺两种。 
  454. select t.* , px = rank() over(order by [平均成绩] descfrom 
  455.   select m.S# [学生编号] ,  
  456.          m.Sname [学生姓名] , 
  457.          isnull(cast(avg(score) as decimal(18,2)),0) [平均成绩] 
  458.   from Student m left join SC n on m.S# = n.S#  
  459.   group by m.S# , m.Sname 
  460. ) t 
  461. order by px 
  462.  
  463. select t.* , px = DENSE_RANK() over(order by [平均成绩] descfrom 
  464.   select m.S# [学生编号] ,  
  465.          m.Sname [学生姓名] , 
  466.          isnull(cast(avg(score) as decimal(18,2)),0) [平均成绩] 
  467.   from Student m left join SC n on m.S# = n.S#  
  468.   group by m.S# , m.Sname 
  469. ) t 
  470. order by px 
  471.    
  472. --25、查询各科成绩前三名的记录 
  473. --25.1 分数重复时保留名次空缺 
  474. select m.* , n.C# , n.score from Student m, SC n where m.S# = n.S# and n.score in  
  475. (select top 3 score from sc where C# = n.C# order by score descorder by n.C# , n.score desc 
  476. --25.2 分数重复时不保留名次空缺,合并名次 
  477. --sql 2000用子查询实现 
  478. select * from (select t.* , px = (select count(distinct score) from SC where C# = t.C# and score >= t.score) from sc t) m where px between 1 and 3 order by m.c# , m.px  
  479. --sql 2005用DENSE_RANK实现 
  480. select * from (select t.* , px = DENSE_RANK() over(partition by c# order by score descfrom sc t) m where px between 1 and 3 order by m.C# , m.px  
  481.  
  482. --26、查询每门课程被选修的学生数  
  483. select c# , count(S#)[学生数] from sc group by C# 
  484.  
  485. --27、查询出只有两门课程的全部学生的学号和姓名  
  486. select Student.S# , Student.Sname 
  487. from Student , SC  
  488. where Student.S# = SC.S#  
  489. group by Student.S# , Student.Sname 
  490. having count(SC.C#) = 2 
  491. order by Student.S# 
  492.   
  493. --28、查询男生、女生人数  
  494. select count(Ssex) as 男生人数 from Student where Ssex = N'男' 
  495. select count(Ssex) as 女生人数 from Student where Ssex = N'女' 
  496. select sum(case when Ssex = N'男' then 1 else 0 end) [男生人数],sum(case when Ssex = N'女' then 1 else 0 end) [女生人数] from student 
  497. select case when Ssex = N'男' then N'男生人数' else N'女生人数' end [男女情况] , count(1) [人数] from student group by case when Ssex = N'男' then N'男生人数' else N'女生人数' end 
  498.  
  499. --29、查询名字中含有"风"字的学生信息 
  500. select * from student where sname like N'%风%' 
  501. select * from student where charindex(N'风' , sname) > 0 
  502.  
  503. --30、查询同名同性学生名单,并统计同名人数  
  504. select Sname [学生姓名], count(*) [人数] from Student group by Sname having count(*) > 1 
  505.   
  506. --31、查询1990年出生的学生名单(注:Student表中Sage列的类型是datetime)  
  507. select * from Student where year(sage) = 1990 
  508. select * from Student where datediff(yy,sage,'1990-01-01') = 0 
  509. select * from Student where datepart(yy,sage) = 1990 
  510. select * from Student where convert(varchar(4),sage,120) = '1990' 
  511.  
  512. --32、查询每门课程的平均成绩,结果按平均成绩降序排列,平均成绩相同时,按课程编号升序排列  
  513. select m.C# , m.Cname , cast(avg(n.score) as decimal(18,2)) avg_score 
  514. from Course m, SC n  
  515. where m.C# = n.C#     
  516. group by m.C# , m.Cname  
  517. order by avg_score desc, m.C# asc 
  518.  
  519. --33、查询平均成绩大于等于85的所有学生的学号、姓名和平均成绩  
  520. select a.S# , a.Sname , cast(avg(b.score) as decimal(18,2)) avg_score 
  521. from Student a , sc b 
  522. where a.S# = b.S# 
  523. group by a.S# , a.Sname 
  524. having cast(avg(b.score) as decimal(18,2)) >= 85  
  525. order by a.S# 
  526.  
  527. --34、查询课程名称为"数学",且分数低于60的学生姓名和分数  
  528. select sname , score 
  529. from Student , SC , Course  
  530. where SC.S# = Student.S# and SC.C# = Course.C# and Course.Cname = N'数学' and score < 60  
  531.  
  532. --35、查询所有学生的课程及分数情况;  
  533. select Student.* , Course.Cname , SC.C# , SC.score   
  534. from Student, SC , Course  
  535. where Student.S# = SC.S# and SC.C# = Course.C#  
  536. order by Student.S# , SC.C# 
  537.  
  538. --36、查询任何一门课程成绩在70分以上的姓名、课程名称和分数;  
  539. select Student.* , Course.Cname , SC.C# , SC.score   
  540. from Student, SC , Course  
  541. where Student.S# = SC.S# and SC.C# = Course.C# and SC.score >= 70  
  542. order by Student.S# , SC.C#  
  543.  
  544. --37、查询不及格的课程 
  545. select Student.* , Course.Cname , SC.C# , SC.score   
  546. from Student, SC , Course  
  547. where Student.S# = SC.S# and SC.C# = Course.C# and SC.score < 60  
  548. order by Student.S# , SC.C#  
  549.  
  550. --38、查询课程编号为01且课程成绩在80分以上的学生的学号和姓名;  
  551. select Student.* , Course.Cname , SC.C# , SC.score   
  552. from Student, SC , Course  
  553. where Student.S# = SC.S# and SC.C# = Course.C# and SC.C# = '01' and SC.score >= 80  
  554. order by Student.S# , SC.C#  
  555.  
  556. --39、求每门课程的学生人数  
  557. select Course.C# , Course.Cname , count(*) [学生人数] 
  558. from Course , SC  
  559. where Course.C# = SC.C# 
  560. group by  Course.C# , Course.Cname 
  561. order by Course.C# , Course.Cname 
  562.  
  563. --40、查询选修"张三"老师所授课程的学生中,成绩最高的学生信息及其成绩 
  564. --40.1 当最高分只有一个时 
  565. select top 1 Student.* , Course.Cname , SC.C# , SC.score   
  566. from Student, SC , Course , Teacher 
  567. where Student.S# = SC.S# and SC.C# = Course.C# and Course.T# = Teacher.T# and Teacher.Tname = N'张三' 
  568. order by SC.score desc 
  569. --40.2 当最高分出现多个时 
  570. select Student.* , Course.Cname , SC.C# , SC.score   
  571. from Student, SC , Course , Teacher 
  572. where Student.S# = SC.S# and SC.C# = Course.C# and Course.T# = Teacher.T# and Teacher.Tname = N'张三' and 
  573. SC.score = (select max(SC.score) from SC , Course , Teacher where SC.C# = Course.C# and Course.T# = Teacher.T# and Teacher.Tname = N'张三'
  574.  
  575. --41、查询不同课程成绩相同的学生的学生编号、课程编号、学生成绩  
  576. --方法1 
  577. select m.* from SC m ,(select C# , score from SC group by C# , score having count(1) > 1) n  
  578. where m.C#= n.C# and m.score = n.score order by m.C# , m.score , m.S# 
  579. --方法2 
  580. select m.* from SC m where exists (select 1 from (select C# , score from SC group by C# , score having count(1) > 1) n  
  581. where m.C#= n.C# and m.score = n.score) order by m.C# , m.score , m.S# 
  582.  
  583. --42、查询每门功成绩最好的前两名  
  584. select t.* from sc t where score in (select top 2 score from sc where C# = T.C# order by score descorder by t.C# , t.score desc 
  585.  
  586. --43、统计每门课程的学生选修人数(超过5人的课程才统计)。要求输出课程号和选修人数,查询结果按人数降序排列,若人数相同,按课程号升序排列   
  587. select Course.C# , Course.Cname , count(*) [学生人数] 
  588. from Course , SC  
  589. where Course.C# = SC.C# 
  590. group by  Course.C# , Course.Cname 
  591. having count(*) >= 5 
  592. order by [学生人数] desc , Course.C#  
  593.  
  594. --44、检索至少选修两门课程的学生学号  
  595. select student.S# , student.Sname  
  596. from student , SC  
  597. where student.S# = SC.S#  
  598. group by student.S# , student.Sname  
  599. having count(1) >= 2 
  600. order by student.S#  
  601.  
  602. --45、查询选修了全部课程的学生信息  
  603. --方法1 根据数量来完成 
  604. select student.* from student where S# in 
  605. (select S# from sc group by S# having count(1) = (select count(1) from course)) 
  606. --方法2 使用双重否定来完成 
  607. select t.* from student t where t.S# not in  
  608.   select distinct m.S# from 
  609.   ( 
  610.     select S# , C# from student , course  
  611.   ) m where not exists (select 1 from sc n where n.S# = m.S# and n.C# = m.C#) 
  612. --方法3 使用双重否定来完成 
  613. select t.* from student t where not exists(select 1 from  
  614.   select distinct m.S# from 
  615.   ( 
  616.     select S# , C# from student , course  
  617.   ) m where not exists (select 1 from sc n where n.S# = m.S# and n.C# = m.C#) 
  618. ) k where k.S# = t.S# 
  619.  
  620. --46、查询各学生的年龄 
  621. --46.1 只按照年份来算 
  622. select * , datediff(yy , sage , getdate()) [年龄] from student 
  623. --46.2 按照出生日期来算,当前月日 < 出生年月的月日则,年龄减一 
  624. select * , case when right(convert(varchar(10),getdate(),120),5) < right(convert(varchar(10),sage,120),5) then datediff(yy , sage , getdate()) - 1 else datediff(yy , sage , getdate()) end [年龄] from student 
  625.  
  626. --47、查询本周过生日的学生 
  627. select * from student where datediff(week,datename(yy,getdate()) + right(convert(varchar(10),sage,120),6),getdate()) = 0 
  628.  
  629. --48、查询下周过生日的学生 
  630. select * from student where datediff(week,datename(yy,getdate()) + right(convert(varchar(10),sage,120),6),getdate()) = -1 
  631.  
  632. --49、查询本月过生日的学生 
  633. select * from student where datediff(mm,datename(yy,getdate()) + right(convert(varchar(10),sage,120),6),getdate()) = 0 
  634.  
  635. --50、查询下月过生日的学生 
  636. select * from student where datediff(mm,datename(yy,getdate()) + right(convert(varchar(10),sage,120),6),getdate()) = -1 
  637.  
  638. drop table  Student,Course,Teacher,SC 
  • 上一篇资讯: 推荐十大企业级数据库
  • 下一篇资讯: SQL2005自动备份
  • 设为首页 | 加入收藏 | 网学首页 | 原创论文 | 计算机原创
    版权所有 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
    Copyright 2008-2020 myeducs.Cn www.myeducs.Cn All Rights Reserved 湘ICP备09003080号 常年法律顾问:王律师