SQL Server 50道查询训练题,学生Student表

Posted scholars

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL Server 50道查询训练题,学生Student表相关的知识,希望对你有一定的参考价值。

下面这个是题目所用到的数据库!

首先你需要在你的SQL Sever数据库中创建[TestDb]这个数据库,接下来下面这个代码。直接复制在数据库里运行就好了!

技术分享图片
 1 USE [TestDb]
 2 GO
 3 /****** Object:  Table [dbo].[Course]    Script Date: 2018/4/28 17:36:10 ******/
 4 SET ANSI_NULLS ON
 5 GO
 6 SET QUOTED_IDENTIFIER ON
 7 GO
 8 SET ANSI_PADDING ON
 9 GO
10 CREATE TABLE [dbo].[Course](
11     [Cid] [varchar](10) NULL,
12     [Cname] [nvarchar](10) NULL,
13     [Tid] [varchar](10) NULL
14 ) ON [PRIMARY]
15 
16 GO
17 SET ANSI_PADDING OFF
18 GO
19 /****** Object:  Table [dbo].[SC]    Script Date: 2018/4/28 17:36:10 ******/
20 SET ANSI_NULLS ON
21 GO
22 SET QUOTED_IDENTIFIER ON
23 GO
24 SET ANSI_PADDING ON
25 GO
26 CREATE TABLE [dbo].[SC](
27     [Sid] [varchar](10) NULL,
28     [Cid] [varchar](10) NULL,
29     [score] [decimal](18, 1) NULL
30 ) ON [PRIMARY]
31 
32 GO
33 SET ANSI_PADDING OFF
34 GO
35 /****** Object:  Table [dbo].[Student]    Script Date: 2018/4/28 17:36:10 ******/
36 SET ANSI_NULLS ON
37 GO
38 SET QUOTED_IDENTIFIER ON
39 GO
40 SET ANSI_PADDING ON
41 GO
42 CREATE TABLE [dbo].[Student](
43     [Sid] [varchar](10) NULL,
44     [Sname] [nvarchar](10) NULL,
45     [Sage] [datetime] NULL,
46     [Ssex] [nvarchar](10) NULL
47 ) ON [PRIMARY]
48 
49 GO
50 SET ANSI_PADDING OFF
51 GO
52 /****** Object:  Table [dbo].[Teacher]    Script Date: 2018/4/28 17:36:10 ******/
53 SET ANSI_NULLS ON
54 GO
55 SET QUOTED_IDENTIFIER ON
56 GO
57 SET ANSI_PADDING ON
58 GO
59 CREATE TABLE [dbo].[Teacher](
60     [Tid] [varchar](10) NULL,
61     [Tname] [nvarchar](10) NULL
62 ) ON [PRIMARY]
63 
64 GO
65 SET ANSI_PADDING OFF
66 GO
67 INSERT [dbo].[Course] ([Cid], [Cname], [Tid]) VALUES (N01, N语文, N02)
68 INSERT [dbo].[Course] ([Cid], [Cname], [Tid]) VALUES (N02, N数学, N01)
69 INSERT [dbo].[Course] ([Cid], [Cname], [Tid]) VALUES (N03, N英语, N03)
70 INSERT [dbo].[SC] ([Sid], [Cid], [score]) VALUES (N01, N01, CAST(80.0 AS Decimal(18, 1)))
71 INSERT [dbo].[SC] ([Sid], [Cid], [score]) VALUES (N01, N02, CAST(90.0 AS Decimal(18, 1)))
72 INSERT [dbo].[SC] ([Sid], [Cid], [score]) VALUES (N01, N03, CAST(99.0 AS Decimal(18, 1)))
73 INSERT [dbo].[SC] ([Sid], [Cid], [score]) VALUES (N02, N01, CAST(70.0 AS Decimal(18, 1)))
74 INSERT [dbo].[SC] ([Sid], [Cid], [score]) VALUES (N02, N02, CAST(60.0 AS Decimal(18, 1)))
75 INSERT [dbo].[SC] ([Sid], [Cid], [score]) VALUES (N02, N03, CAST(80.0 AS Decimal(18, 1)))
76 INSERT [dbo].[SC] ([Sid], [Cid], [score]) VALUES (N03, N01, CAST(80.0 AS Decimal(18, 1)))
77 INSERT [dbo].[SC] ([Sid], [Cid], [score]) VALUES (N03, N02, CAST(80.0 AS Decimal(18, 1)))
78 INSERT [dbo].[SC] ([Sid], [Cid], [score]) VALUES (N03, N03, CAST(80.0 AS Decimal(18, 1)))
79 INSERT [dbo].[SC] ([Sid], [Cid], [score]) VALUES (N04, N01, CAST(50.0 AS Decimal(18, 1)))
80 INSERT [dbo].[SC] ([Sid], [Cid], [score]) VALUES (N04, N02, CAST(30.0 AS Decimal(18, 1)))
81 INSERT [dbo].[SC] ([Sid], [Cid], [score]) VALUES (N04, N03, CAST(20.0 AS Decimal(18, 1)))
82 INSERT [dbo].[SC] ([Sid], [Cid], [score]) VALUES (N05, N01, CAST(76.0 AS Decimal(18, 1)))
83 INSERT [dbo].[SC] ([Sid], [Cid], [score]) VALUES (N05, N02, CAST(87.0 AS Decimal(18, 1)))
84 INSERT [dbo].[SC] ([Sid], [Cid], [score]) VALUES (N06, N01, CAST(31.0 AS Decimal(18, 1)))
85 INSERT [dbo].[SC] ([Sid], [Cid], [score]) VALUES (N06, N03, CAST(34.0 AS Decimal(18, 1)))
86 INSERT [dbo].[SC] ([Sid], [Cid], [score]) VALUES (N07, N02, CAST(89.0 AS Decimal(18, 1)))
87 INSERT [dbo].[SC] ([Sid], [Cid], [score]) VALUES (N07, N03, CAST(98.0 AS Decimal(18, 1)))
88 INSERT [dbo].[Student] ([Sid], [Sname], [Sage], [Ssex]) VALUES (N01, N赵雷, CAST(0x0000806800000000 AS DateTime), N)
89 INSERT [dbo].[Student] ([Sid], [Sname], [Sage], [Ssex]) VALUES (N02, N钱电, CAST(0x000081CA00000000 AS DateTime), N)
90 INSERT [dbo].[Student] ([Sid], [Sname], [Sage], [Ssex]) VALUES (N03, N孙风, CAST(0x000080F300000000 AS DateTime), N)
91 INSERT [dbo].[Student] ([Sid], [Sname], [Sage], [Ssex]) VALUES (N04, N李云, CAST(0x0000814100000000 AS DateTime), N)
92 INSERT [dbo].[Student] ([Sid], [Sname], [Sage], [Ssex]) VALUES (N05, N周梅, CAST(0x0000832300000000 AS DateTime), N)
93 INSERT [dbo].[Student] ([Sid], [Sname], [Sage], [Ssex]) VALUES (N06, N吴兰, CAST(0x0000837E00000000 AS DateTime), N)
94 INSERT [dbo].[Student] ([Sid], [Sname], [Sage], [Ssex]) VALUES (N07, N郑竹, CAST(0x00007FB000000000 AS DateTime), N)
95 INSERT [dbo].[Student] ([Sid], [Sname], [Sage], [Ssex]) VALUES (N08, N王菊, CAST(0x0000807B00000000 AS DateTime), N)
96 INSERT [dbo].[Teacher] ([Tid], [Tname]) VALUES (N01, N张三)
97 INSERT [dbo].[Teacher] ([Tid], [Tname]) VALUES (N02, N李四)
98 INSERT [dbo].[Teacher] ([Tid], [Tname]) VALUES (N03, N王五)
创建数据库和数据

下面这个就是题目于我说写的答案了!

技术分享图片
  1 --1  查询"01"课程比"02"课程成绩高的学生的信息及课程分数
  2 create proc PB_problem_one
  3 as
  4 begin
  5 select s.*, scb.Cid, scb.score,scc.Cid, scc.score as 成绩 from student as s 
  6 left join (select * from SC where cid=01) scb on s.Sid=scb.Sid
  7 left join (select * from SC where cid=02) scc on scc.sid=scb.sid
  8 where scc.score<scb.score
  9 end
 10 
 11 --1.1  查询同时存在"01"课程和"02"课程的情况
 12 create proc PB_problem_one_one
 13 as
 14 begin
 15 select s.* ,scb.Cid,scb.score,scc.Cid,scc.score from Student s,SC scb,SC scc 
 16 where s.Sid=scb.Sid and s.Sid=scc.Sid and scb.Cid=01 and scc.Cid=02
 17 end
 18 
 19 --1.2  查询同时存在"01"课程和"02"课程的情况和存在"01"课程但可能不存在"02"课程的情况(不存在时显示为null)(以下存在相同内容时不再解释)
 20 create proc PB_problem_one_two
 21 as
 22 begin
 23 select s.*,scb.Cid,scb.score,scc.Cid,scc.score from Student s 
 24 left join SC scb on s.Sid=scb.Sid and scb.Cid=01
 25 left join SC scc on s.Sid=scc.Sid and scc.Cid=02
 26 where scb.score>ISNULL(scc.score,0)
 27 end
 28 
 29 --2  查询"01"课程比"02"课程成绩低的学生的信息及课程分数
 30 create proc PB_problem_two
 31 as
 32 begin
 33 select s.*, scb.Cid, scb.score,scc.Cid,scc.score as 成绩 from student as s 
 34 left join (select * from SC where cid=01) scb on s.Sid=scb.Sid
 35 left join (select * from SC where cid=02) scc on scc.sid=scb.sid
 36 where scc.score>scb.score
 37 end
 38 
 39 --2.1  这个和1.1的题目相同   查询同时存在"01"课程和"02"课程的情况
 40 create proc PB_problem_two_one
 41 as
 42 begin
 43 select s.* , scb.Cid,scb.score,scc.Cid,scc.score from Student s,SC scb,SC scc 
 44 where s.Sid=scb.Sid and s.Sid=scc.Sid and scb.Cid=01 and scc.Cid=02
 45 end
 46 
 47 --2.2  查询同时存在"01"课程和"02"课程的情况和不存在"01"课程但存在"02"课程的情况
 48 create proc PB_problem_two_two
 49 as
 50 begin
 51 select * from Student s
 52 left join SC scb on s.Sid=scb.Sid and scb.Cid=01
 53 left join SC scc on s.Sid=scc.Sid and scc.Cid=02
 54 where ISNULL(scb.score,0) < scc.score
 55 end
 56 
 57 --3   查询平均成绩大于等于60分的同学的学生编号和学生姓名和平均成绩
 58 create proc PB_problem_three
 59 as
 60 begin
 61 select s.Sname,s.Sid ,CAST(avg(scb.score) as int) as 平均成绩 from Student s,SC scb where s.Sid=scb.Sid
 62 group by s.Sname,s.Sid
 63 having Cast(avg(scb.score) as int) >= 60
 64 end
 65 
 66 --4  查询平均成绩小于60分的同学的学生编号和学生姓名和平均成绩
 67 create proc PB_problem_four
 68 as
 69 begin
 70 select s.Sname,s.Sid ,CAST(avg(scb.score) as int) as 平均成绩 from Student s,SC scb where s.Sid=scb.Sid
 71 group by s.Sname,s.Sid
 72 having Cast(avg(scb.score) as int) <= 60
 73 end
 74 
 75 --4.1   查询在sc表存在成绩的学生信息的SQL语句。‘
 76 create proc PB_problem_four_one
 77 as
 78 begin
 79 select DISTINCT s.* from Student s,SC sc where s.Sid=sc.Sid
 80 end
 81 
 82 --4.2  查询在sc表中不存在成绩的学生信息的SQL语句。
 83 create proc PB_problem_four_two
 84 as
 85 begin
 86 select s.*,sc.score from Student  s
 87 left join SC sc on s.Sid=sc.Sid 
 88 where sc.score  is null
 89 end
 90 
 91 --5  查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩
 92 create proc PB_problem_fives
 93 as
 94 begin
 95 select s.Sid,s.Sname,COUNT(scb.Sid) as 选课总数,CAST(SUM(scb.score) as int) as 课程总成绩 from Student s
 96 left join SC scb on s.Sid=scb.Sid 
 97 group by s.Sid,s.Sname
 98 order by SUM(scb.score) desc
 99 end
100 
101 --5.1  查询所有有成绩的SQL。
102 create proc PB_problem_fives_one
103 as
104 begin
105 select DISTINCT s.* from Student s,SC sc where s.Sid=sc.Sid
106 end
107 
108 --5.2  查询所有(包括有成绩和无成绩)的SQL。
109 create proc PB_problem_fives_two
110 as
111 begin
112 select distinct s.* from Student s left join SC sc on s.Sid=sc.Sid
113 end
114 
115 --6  查询"李"姓老师的数量 
116 create proc PB_problem_six_function_one
117 as
118 begin
119 select COUNT(Tname) as 姓李老师的数量 from Teacher where Tname like 李%
120 end
121 
122 create proc PB_problem_six_function_two
123 as
124 begin
125 select COUNT(Tname) as 姓李老师的数量 from Teacher where Tname like %李%
126 end
127 
128 --7  查询学过"张三"老师授课的同学的信息
129 create proc PB_problem_seven
130 as
131 begin
132 select st.* from Course c 
133 left join Teacher t on c.Tid=t.Tid 
134 left join SC s on s.Cid=c.Cid
135 left join Student st on st.Sid=s.Sid
136 where t.Tname=张三
137 end
138 
139 --8  查询没学过"张三"老师授课的同学的信息
140 create proc PB_problem_eight
141 as
142 begin
143 --先查询出学过张三老师课程的学号,然后使用Not in这个方法去查出没学过张三老师课程的学生
144 select * from Student s where s.Sid Not in (select s.Sid from SC s
145 left join Course c on s.Cid=c.Cid
146 left join Teacher t on c.Tid=t.Tid where t.Tname=张三)
147 end
148 
149 --9 查询学过编号为"01"并且也学过编号为"02"的课程的同学的信息
150 create proc PB_problem_nine
151 as
152 begin
153 select s.*,scb.Cid,scb.score,scc.Cid,scc.score from Student s,SC scb,SC scc 
154 where s.Sid=scb.Sid and s.Sid=scc.Sid and scb.Cid=01 and scc.Cid=02
155 end
156 
157 --10 查询学过编号为"01"但是没有学过编号为"02"的课程的同学的信息
158 create proc PB_problem_ten
159 as
160 begin
161 select * from Student s, SC sc 
162 where s.Sid=sc.Sid and sc.Cid=01 and not exists (select 1 from sc scc where scc.Sid=sc.Sid and scc.Cid=02)
163 order by s.Sid
164 end
165 
166 --11 查询没有学全所有课程的同学的信息 
167 create proc PB_problem_eleven
168 as
169 begin
170 select * from Student where Student.Sid not in(
171 --先查询出学完全部课程的学生的ID,然后再去查询学生表条件是不等于这些查询出来的ID
172 select s.Sid from Student s
173 left join SC sc  on s.Sid=sc.Sid 
174 group by s.Sid
175 having COUNT(sc.Cid) =(select COUNT(Course.Cname) from Course)
176 )
177 end
178 
179 --12  查询至少有一门课与学号为"01"的同学所学相同的同学的信息
180 create proc PB_problem_twelve
181 as
182 begin
183 select * from Student s,SC sc
184 where s.Sid=sc.Sid and sc.Cid in(select Sid from SC where Sid=01) and s.Sid <> 01
185 end
186 
187 --13  查询和"01"号的同学学习的课程完全相同的其他同学的信息
188 create proc PB_problem_thirteen
189 as
190 begin
191 select Student.* from Student where Sid in
192 (select distinct SC.Sid from SC where Sid <> 01 and SC.Cid in (select distinct Cid from SC where Sid = 01) 
193 group by SC.Sid having count(1) = (select count(1) from SC where Sid=01)) 
194 end
195 
196 --14  查询没学过"张三"老师讲授的任一门课程的学生姓名
197 create proc PB_problem_fourteen
198 as
199 begin
200 select s.Sname from Student s where s.Sid Not in (select s.Sid from SC s
201 left join Course c on s.Cid=c.Cid
202 left join Teacher t on c.Tid=t.Tid where t.Tname=张三)
203 end
204 
205 --15  查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩
206 create proc PB_problem_fifteen
207 as
208 begin
209 select s.Sid,s.Sname,CAST(AVG(sc.score) AS decimal(18,2)) as 平均成绩 from Student s,SC sc
210 where s.Sid=sc.Sid and s.Sid in (select sc.Sid from SC where sc.score<60 group by sc.Sid having COUNT(1)>=2)
211 group by s.Sid,s.Sname
212 end
213 
214 --16 检索"01"课程分数小于60,按分数降序排列的学生信息
215 create proc PB_problem_sixteen
216 as
217 begin
218 select * from Student s
219 where s.Sid in (select SC.Sid from SC where SC.Cid=01 and SC.score<60)
220 order by s.Sid asc
221 end
222 
223 --17、按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩 静态sql
224 create proc PB_problem_seventeen
225 as
226 begin
227 select s.Sid as 学生编号,s.Sname as 学生姓名,
228 MAX(case c.Cname when 语文 then sc.score else null end)[语文],
229 MAX(case c.Cname when 数学 then sc.score else null end)[数学],
230 MAX(case c.Cname when 英语 then sc.score else null end)[英语],
231 CAST(AVG(sc.score) as int) as 平均成绩 from Student s
232 left join SC sc on s.Sid=sc.Sid
233 left join Course c on sc.Cid=c.Cid
234 group by s.Sid,s.Sname
235 order by CAST(AVG(sc.score) as int) desc
236 end
237 
238 --18 查询各科成绩最高分、最低分和平均分:以如下形式显示:课程ID,课程name,最高分,最低分,平均分,及格率,中等率,优良率,优秀率
239 --及格为>=60,中等为:70-80,优良为:80-90,优秀为:>=90
240 create proc PB_problem_eighteen
241 as
242 begin
243 select sc.Cid as 课程ID,c.Cname as 课程名称,
244 max(SC.score) as 最高分,min(sc.score) as 最低分,CAST(avg(sc.score)as decimal(18,2)) as 平均分,
245 --count(Student.Sid)
246 --先查询每个课程及格的人数,然后再查询选修这个课程的总人数。然后及格的人数除于课程总人数,计算时需要让及格人数乘于 1.00 然后再把最后结果转为decimal(18,2) 不然计算的结果会出现很多的小数位
247 CAST(count(case when sc.score>=60  then sc.score else null end) * 1.00 / count(sc.Cid) as decimal(18,2)) as 积分率 ,
248 CAST(count(case when sc.score>=70 and sc.score<80  then sc.score else null end) * 1.00 / count(sc.Cid) as decimal(18,2)) as 中等,
249 CAST(count(case when sc.score>=80 and sc.score<90  then sc.score else null end) * 1.00  / count(sc.Cid)as decimal(18,2)) as 优良,
250 CAST(count(case when sc.score>=90  then sc.score else null end) * 1.00  / count(sc.Cid)as decimal(18,2)) as 优秀
251 from SC sc 
252 left join Course c on sc.Cid=c.Cid
253 left join Student s on sc.Sid=s.Sid
254 group by SC.Cid,c.cname 
255 end
256 
257 --19 按各科成绩进行排序,并显示排名 思路:利用over(partition by 字段名 order by 字段名)函数。 正常排序:1,2,3
258 create proc PB_problem_nineteen
259 as
260 begin
261 --ROW_NUMBER()先用这个函数给每一个行创建一个单独的列id,然后再用over去排序
262 select c.Cname as 科目,SC.score as 成绩,ROW_NUMBER() over(partition by c.Cname order by sc.score desc) as 各科排名 from SC
263 left join Course c on SC.Cid=c.Cid
264 end
265 
266 --20 查询学生的总成绩并进行排名 思路:所有学生的总成绩(一个记录集合),再使用函数进行排序。
267 create proc PB_problem_twenty
268 as
269 begin
270 select s.Sname,sum(sc.score) as 总成绩, ROW_NUMBER() over(order by sum(sc.score) desc) as 人员名次 from Student s 
271 left join SC sc on s.Sid=sc.Sid
272 group by s.Sname
273 end
274 
275 -- 20.3 查询学生的总成绩并进行排名,sql 2005用rank,DENSE_RANK完成,分总分重复时保留名次空缺和不保留名次空缺两种。
276 create proc PB_problem_twenty_three
277 as
278 begin
279 select s.Sname,sum(sc.score) as 总成绩,ROW_NUMBER() over(order by sum(sc.score) desc) as 人员名次 from Student s
280 left join SC sc on s.Sid=sc.Sid
281 group by s.Sname
282 having sum(sc.score) is not null
283 end
284 
285 --21  查询不同老师所教不同课程平均分从高到低显示   思路:不同老师所教不同课程的平均分(一个记录集合),再使用函数over(order by 字段名)
286 create proc PB_problem_twentyone
287 as
288 begin
289 select t.Tname,c.Cname,CAST(AVG(s.score) as decimal(18,2)) as 平均分,ROW_NUMBER() over(order by AVG(s.score) desc) as 排名 from Teacher t 
290 left join Course c on t.Tid=c.Tid
291 left join SC s on c.Cid=s.Cid
292 group by t.Tname,c.Cname
293 end
294 
295 --22查询所有课程的成绩第2名到第3名的学生信息及该课程成绩
296 --思路:所有课程成绩的学生及课程信息(一个记录集合),再利用函数排序(一个记录集合),选择第2名和第3名的记录。
297 create proc PB_problem_twentytwo
298 as
299 begin
300 select * from (select c.Cname,sc.score,ROW_NUMBER() over(partition by c.Cname order by sc.score desc) as 排名 from SC sc
301 left join Course c on sc.Cid=c.Cid)as TT
302 where TT.排名 between 2 and 3
303 end
304 
305 --23 统计各科成绩各分数段人数:课程编号,课程名称,[100-85],[85-70],[70-60],[0-60]及所占百分比
306 create proc PB_problem_twentythree
307 as
308 begin
309 select c.Cid,c.Cname,
310 CAST(count(case when sc.score>0 and sc.score<=60 then sc.score else null end) * 1.00 / count(c.Cid) as decimal(18,2)) as [0-60],
311 CAST(count(case when sc.score>60 and sc.score<=70 then sc.score else null end) * 1.00 / count(c.Cid) as decimal(18,2)) as [60-70],
312 CAST(count(case when sc.score>70 and sc.score<=85 then sc.score else null end) * 1.00 / count(c.Cid) as decimal(18,2)) as [70-85],
313 CAST(count(case when sc.score>85 and sc.score<=100 then sc.score else null end) * 1.00 / count(c.Cid) as decimal(18,2)) as [85-100]
314 from Course c
315 inner join SC sc on c.Cid=sc.Cid
316 group by c.Cid,c.Cname
317 end
318 
319 
320 --24  查询学生平均成绩及其名次 
321 create proc PB_problem_twentyfour
322 as
323 begin
324 select s.Sname, CAST(AVG(sc.score) as decimal(18,2)) as 平均成绩 ,ROW_NUMBER() over(order by CAST(AVG(sc.score) as decimal(18,2)) desc) as 名次 from Student s
325 inner join SC sc on s.Sid=sc.Sid
326 group by s.Sname
327 end
328 
329 --25 查询各科成绩前三名的记录
330 create proc PB_problem_twentyfives
331 as
332 begin
333 select * from (select c.Cname,sc.score,ROW_NUMBER() over(partition by c.Cname order by sc.score desc) as 排名 from SC sc
334 inner join Course c on sc.Cid=c.Cid
335 group by c.Cname,sc.score) as TT
336 where TT.排名 between 1 and 3
337 end
338 
339 --26 查询每门课程被选修的学生数
340 create proc PB_problem_twentysix
341 as
342 begin
343 select c.Cname,COUNT(sc.Cid) as 选修总数 from SC sc
344 inner join Course c on sc.Cid=c.Cid
345 group by c.Cname
346 end
347 
348 --27 查询出只有两门课程的全部学生的学号和姓名
349 create proc PB_problem_twentyseven
350 as
351 begin
352 select s.Sid,s.Sname,COUNT(sc.Cid) as 选课数量 from Student s
353 inner join SC sc on s.Sid=sc.Sid
354 group by s.Sid,s.Sname
355 having COUNT(sc.Cid)=2
356 end
357 
358 --28 查询男生、女生人数
359 create proc PB_problem_twentyeight
360 as
361 begin
362 --select COUNT(s.Ssex) as 男生人数 from Student s
363 --where s.Ssex=‘男‘
364 --select COUNT(s.Ssex) as 女生人数 from Student s
365 --where s.Ssex=‘女‘
366 
367 select sum(case when s.Ssex= then 1 else 0 end) as 男生人数,sum(case when s.Ssex= then 1 else 0 end) as 女生人数 from Student s
368 end
369 
370 
371 --29  查询名字中含有"风"字的学生信息
372 create proc PB_problem_twentynine
373 as
374 begin
375 select * from Student where Student.Sname like %风%
376 end
377 
378 --30 查询同名同性学生名单,并统计同名人数 
379 create proc PB_problem_thirty
380 as
381 begin
382 select  s.Sname,count(s.Sid) as 数量
383 from student s
384 group by s.Sname
385 having count(s.Sid)>1
386 --下面这个更新是为了测试上面的查询语句是否正确
387 --update Student
388 --set Sname=‘钱电‘
389 --where Sid=‘02‘
390 end
391 
392 --31 查询1990年出生的学生名单
393 create proc PB_problem_thirtyone
394 @year varchar(10)
395 as
396 begin
397 select * from Student s
398 where year(s.Sage)=@year
399 --下面这个函数是可以获取到日期
400 --CONVERT(VARCHAR(10),QueueDate,23)
401 end
402 
403 --32 查询每门课程的平均成绩,结果按平均成绩降序排列,平均成绩相同时,按课程编号升序排列 
404 create proc PB_problem_thirtytwo
405 as
406 begin
407 select c.Cname,CAST(AVG(sc.score) as decimal(18,2)) as 平均分,ROW_NUMBER() over(order by AVG(sc.score) desc) as 排名 from SC sc
408 inner join Course c on sc.Cid=c.Cid
409 group by c.Cname
410 end
411 
412 --33  查询平均成绩大于等于85的所有学生的学号、姓名和平均成绩
413 create proc PB_problem_thirtythree
414 as
415 begin
416 select s.Sid,s.Sname,CAST(AVG(sc.score) as decimal(18,2)) as 平均成绩 from Student s
417 inner join SC sc on s.Sid=sc.Sid
418 group by s.Sid,s.Sname
419 having CAST(AVG(sc.score) as decimal(18,2))>85
420 order by AVG(sc.score) desc
421 end
422 
423 --34  查询课程名称为"数学",且分数低于60的学生姓名和分数
424 create proc PB_problem_thirtyfour
425 as
426 begin
427 select s.Sname 姓名,sc.score 分数,c.Cname 学科 from student s
428 left join SC sc on s.Sid=sc.Sid
429 left join Course c on sc.Cid=c.Cid
430 group by s.Sname,sc.score,c.Cname
431 having sc.score<60 and c.Cname=数学
432 end
433 
434 --35  查询所有学生的课程及分数情况;
435 create proc PB_problem_thirtyfive
436 as
437 begin
438 select s.Sname,c.Cname,sc.score,ROW_NUMBER() over(partition by s.Sname order by sc.score desc) from Student s
439 left join SC sc on s.Sid=sc.Sid
440 left join Course c on sc.Cid=c.Cid
441 end
442 
443 --36 查询任何一门课程成绩在70分以上的姓名、课程名称和分数
444 create proc PB_problem_thirtysix
445 as
446 begin
447 select s.Sname,c.Cname,sc.score from Student s
448 left join SC sc on s.Sid=sc.Sid
449 left join Course c on sc.Cid=c.Cid
450 where sc.score>70
451 order by sc.score desc
452 --下面这个查的是视图
453 --select * from View_Scores v
454 --where v.score>70
455 end
456 
457 --37 查询不及格的课程
458 create proc PB_problem_thirtyseven
459 as
460 begin
461 select s.*,c.Cname,sc.score from Student s
462 left join SC sc on s.Sid=sc.Sid
463 left join Course c on sc.Cid=c.Cid
464 where sc.score<60
465 
466 --select * from View_Scores v
467 --where v.score<60
468 end
469 
470 --38 查询课程编号为01且课程成绩在80分以上的学生的学号和姓名;
471 create proc PB_problem_thirtyeight
472 as
473 begin
474 select s.Sid,s.Sname,c.Cname,sc.score from Student s
475 left join SC sc on s.Sid=sc.Sid
476 left join Course c on sc.Cid=c.Cid
477 where c.Cid=01 and sc.score>=80
478 
479 end
480 
481 --39 求每门课程的学生人数
482 create proc PB_problem_thirtynine
483 as
484 begin
485 select c.Cname ,COUNT(sc.Cid) 学生人数 from SC sc
486 left join Course c on sc.Cid=c.Cid
487 group by c.Cname
488 end
489 
490 --40 查询选修"张三"老师所授课程的学生中,成绩最高的学生信息及其成绩
491 create proc PB_problem_forty
492 as
493 begin
494 select  s.Sid,s.Sname,s.Sage,s.Ssex,MAX(sc.score) 最高分 from student s
495 left join SC sc on s.Sid=sc.Sid
496 left join Course c on sc.Cid=c.Cid
497 left join Teacher t on c.Tid=t.Tid
498 group by s.Sid,s.Sname,s.Sage,s.Ssex,t.Tname
499 having t.Tname=张三 
500 
501 --select  Sid,Sname,Sage,Ssex,MAX(score) 最高分 from View_Scores v
502 --group by Sid,Sname,Sage,Ssex,Tname
503 --having v.Tname=‘张三‘ 
504 end
505 
506 --40.2 当最高分出现多个时
507 create proc PB_problem_fortytwo
508 as
509 begin
510 select s.Sid,s.Sname,s.Sage,s.Ssex,MAX(sc.score) 最高分 from Student s
511 left join SC sc on s.Sid=sc.Sid
512 left join Course c on sc.Cid=c.Cid
513 left join Teacher t on c.Tid=t.Tid
514 group by s.Sid,s.Sname,s.Sage,s.Ssex,t.Tname,sc.score
515 having t.Tname=张三 and sc.score in (select MAX(sc.score) from Student s,SC sc,Course c,Teacher t where s.Sid=sc.Sid and sc.Cid=c.Cid and c.Tid=t.Tid and t.Tname=张三)
516 --sc.score 后面 in的分数可以用下面这个查视图的语句
517 --select MAX(v.score) from View_Scores v where v.Tname=‘张三‘
518 --用来做测试的SQL语句
519 --update SC 
520 --set score=‘60‘
521 --where Sid=‘02‘ and Cid=‘02‘   
522 --60
523 end
524 
525 --41 查询不同课程成绩相同的学生的学生编号、课程编号、学生成绩
526 create proc PB_problem_fortyone
527 as
528 begin
529 select a.* from SC a,(select Cid,score from SC group by Cid,score having COUNT(1) > 1) n
530 where a.Cid=n.Cid and a.score=n.score order by a.Cid,a.score,a.Sid 
531 end
532 
533 --42 查询每门课程成绩最好的前两名
534 create proc PB_problem_fortytwo
535 as
536 begin
537 select * from (select c.Cname,sc.score,ROW_NUMBER() over(partition by c.Cname order by sc.score desc) as 排名 from SC sc
538 inner join Course c on sc.Cid=c.Cid
539 group by c.Cname,sc.score) as TT
540 where TT.排名 between 1 and 2
541 
542 
543 --select * from(select v.Cname,v.score,ROW_NUMBER() over(partition by v.Cname order by v.score desc) as 排名 from View_Scores v
544 --group by v.Cname,v.score) as TT
545 --where TT.排名 between 1 and 2 and TT.score is not null
546 end
547 
548 --43 统计每门课程的学生选修人数(超过5人的课程才统计)。要求输出课程号和选修人数,查询结果按人数降序排列,若人数相同,按课程号升序排列  
549 create proc PB_problem_fortythree
550 @Cid int,
551 @num int
552 as
553 begin
554 select c.Cname,COUNT(sc.score) as 选修人数 from SC sc
555 left join Course c on sc.Cid=c.Cid
556 group by c.Cname,c.Cid
557 having c.Cid=@Cid and @num>=5
558 end
559 
560 --44 检索至少选修两门课程的学生学号 
561 create proc PB_problem_fortyfour
562 as
563 begin
564 select s.Sid,s.Sname,s.Sage,COUNT(1) as 选课总数 from Student s 
565 left join SC sc on s.Sid=sc.Sid
566 group by s.Sid,s.Sname,s.Sage
567 having COUNT(1)>=2
568 end
569 
570 --45 查询选修了全部课程的学生信息
571 create proc PB_problem_fortyfives
572 as
573 begin
574 select s.*,COUNT(1) as 选课总数 from Student s 
575 left join SC sc on s.Sid=sc.Sid
576 group by s.Sid,s.Sname,s.Ssex,s.Sage
577 having COUNT(1)=3
578 end
579 
580 --46 查询各学生的年龄  只按照年份来算
581 create proc PB_problem_fortysix
582 @age int
583 as
584 begin
585 select s.Sname,(DATENAME(YYYY,GETDATE())-year(s.Sage)) as 年龄 from Student s
586 --获取当前年份
587 --select DATENAME(YYYY,GETDATE())
588 end
589 
590 --46.2  按照出生日期来算,当前月日 < 出生年月的月日则,年龄减一
591 create proc PB_problem_fortysixtwo
592 as
593 begin
594 select s.Sname,
595 SUBSTRING(
596 CAST(
597 CAST(CONVERT(varchar(8),GETDATE(),112) as int) - CAST(CONVERT(VARCHAR(10),s.Sage,112) as int) 
598 as varchar)
599 ,0,3) as 年龄 from Student s
600 end
601 
602 --47  查询本周过生日的学生
603 create proc PB_problem_fortyseven
604 as
605 begin
606 SELECT * FROM Student WHERE datediff(week,Sage,getdate())=0
607 
608 --为了验证上面的查询语句是否正确,把01的出生年月日更改为当前日期
609 --update Student 
610 --set Sage=CONVERT(varchar,GETDATE(),120)
611 --where Sid=‘01‘
612 --恢复原始数据
613 --update Student 
614 --set Sage=‘1990-01-01 00:00:00.000‘
615 --where Sid=‘01‘
616 end
617 
618 --48 查询下周过生日的学生
619 create proc PB_problem_fortyeight
620 as
621 begin
622 select * from Student where DATEDIFF(WEEK,Sage,getdate())=-1
623 
624 --这个是获取当前日期上一周的时间,相当于当前日期的第前七天的日期  比如当前时间是2018:04:23 15:10:53  结果为:2018-04-16 00:00:00.000
625 --select dateadd(week,-1,DATEADD(week,DATEDIFF(week,0,getdate()),0))
626 
627 --为了验证上面的查询语句是否正确,把01的出生年月日更改为当前日期
628 --update Student 
629 --set Sage=‘2018-04-30 00:00:00.000‘
630 --where Sid=‘01‘
631 
632 --恢复原始数据
633 --update Student 
634 --set Sage=‘1990-01-01 00:00:00.000‘
635 --where Sid=‘01‘
636 
637 --获取当前日期 格式:2018:04:23 15:10:53
638 --select CONVERT(varchar,GETDATE(),120)
639 end
640 
641 --49 查询本月过生日的学生
642 create proc PB_problem_fortynine
643 as
644 begin
645 select * from Student s
646 where s.Sid in (select (case 
647 when CAST(DATENAME(MM,GETDATE()) as int) - CAST(month(s.Sage) as int) = 0 
648 then s.Sid 
649 else null end) from Student s)
650 end
651 --下面这个是用来测试上面的查询本月过生日的学生的SQL语句是否正确
652 --update Student
653 --set Sage=‘1990-01-01 00:00:00.000‘
654 --where sid=‘01‘
655 --CONVERT(varchar,GETDATE(),120)
656 --1990-01-01 00:00:00.000
657 
658 
659 --50 查询下月过生日的学生
660 create proc PB_problem_fifty
661 as
662 begin
663 select * from Student s
664 where s.Sid in(select (case
665 when CAST(DATENAME(MM,GETDATE()) as int) - CAST(MONTH(s.Sage) as int) = -1
666 then s.Sid
667 else null end) from Student s)
668 end
669 
670 --执行存储过程
671 exec PB_problem_fortythree @Cid=02,@num=8
672 --删除存储过程
673 drop proc PB_problem_fortythree
题目与答案

在写这些题目的时候碰到过很多问题!这些问题在我下面这个周报里面有所详细的描述!

http://www.cnblogs.com/Scholars/articles/8892504.html

还有一些没有写在其中就是最后几题的时间获取的问题!

下面这个地址是获取

sql语句获取本周、上一周、本月数据

http://www.cnblogs.com/Scholars/p/8919600.html

下面这个地址是获取

Sql Server获取当前日期

http://www.cnblogs.com/Scholars/p/8919094.html

我写的这些随笔里有详细的描述以及使用方法!

希望能帮到大家!

以上是关于SQL Server 50道查询训练题,学生Student表的主要内容,如果未能解决你的问题,请参考以下文章

深耕MySQL - 50道SQL练习题

50道SQL面试题

SQL Server学习笔记——单表查询

SQL Server学习笔记——单表查询

SQL Server学习笔记——多表查询

SQL Server学习笔记——多表查询