最近学了SQL的内容,老师也给我们发了练习题,感觉在做题的过程中得到了提高,所以将题目和我自己的答案分享一下,希望对大家有所帮助。我使用的是SQL Server 2014 Management Studio。

---学生表
create table student(
sno varchar(10) primary key,                --学号
sname varchar(20),                              --姓名
sage numeric(2),                        --年龄
ssex varchar(5)         --性别
);
----教师表
create table teacher(
tno varchar(10) primary key,            ---教师编号
tname varchar(20)           ---教师姓名
);
----课程表
create table course(
cno varchar(10),            ---课程号
cname varchar(20),      --课程名
tno varchar(20),            --教师编号
constraint pk_course primary key (cno,tno)
);
---成绩表
create table sc(
sno varchar(10),            ---学号
cno varchar(10),            ---课程号
score numeric(4,2),         ---学生成绩
constraint pk_sc primary key (sno,cno)
);
/*******初始化学生表的数据******/
insert into student values ('s001','张三',23,'男');
insert into student values ('s002','李四',23,'男');
insert into student values ('s003','吴鹏',25,'男');
insert into student values ('s004','琴沁',20,'女');
insert into student values ('s005','王丽',20,'女');
insert into student values ('s006','李波',21,'男');
insert into student values ('s007','刘玉',21,'男');
insert into student values ('s008','萧蓉',21,'女');
insert into student values ('s009','陈萧晓',23,'女');
insert into student values ('s010','陈美',22,'女');/******************初始化教师表***********************/
insert into teacher values ('t001', '刘阳');
insert into teacher values ('t002', '谌燕');
insert into teacher values ('t003', '胡明星');/***************初始化课程表****************************/
insert into course values ('c001','J2SE','t002');
insert into course values ('c002','Java Web','t002');
insert into course values ('c003','SSH','t001');
insert into course values ('c004','Oracle','t001');
insert into course values ('c005','SQL SERVER 2005','t003');
insert into course values ('c006','C#','t003');
insert into course values ('c007','JavaScript','t002');
insert into course values ('c008','DIV+CSS','t001');
insert into course values ('c009','PHP','t003');
insert into course values ('c010','EJB3.0','t002');/***************初始化成绩表***********************/
insert into sc values ('s001','c001',78.9);
insert into sc values ('s002','c001',80.9);
insert into sc values ('s003','c001',81.9);
insert into sc values ('s004','c001',60.9);
insert into sc values ('s001','c002',82.9);
insert into sc values ('s002','c002',72.9);
insert into sc values ('s003','c002',81.9);
insert into sc values ('s001','c003','59');

1、 查询“c001”课程比“c002”课程成绩高的所有学生的学号;
解题思路:我需要查询的数据都在同一个表里面,所以这里我使用的是自连接

select a.sno from dbo.sc a
inner join dbo.sc b
on a.sno=b.sno
where a.cno='c001' and b.cno='c002'
and a.score>b.score

2、 查询平均成绩大于60 分的同学的学号和平均成绩;
解题思路: 这里使用了聚合函数求平均值avg

select sno,avg(score) from dbo.sc
group by sno
having avg(score)>60

3、查询所有同学的学号、姓名、选课数、总成绩;
解题思路:使用了聚合函数sum求和、count个数,以及左连接来查询出所有同学的信息

select xs.sno,sname,sum(score),count(cno)from dbo.student xs
left join dbo.sc cj
on xs.sno=cj.sno
group by xs.sno,sname

4、 查询姓“刘”的老师的个数;
解题思路:这里使用了like模糊查询,通配符百分比( % ):任何零个或多个字符的字符串

select count(tname)from dbo.teacher
where tname like'刘%'

5、 查询没学过“谌燕”老师课的同学的学号、姓名;
解题思路:这里我使用了嵌套子查询来查询没学过‘谌燕’老师的课,‘没学过’用not in,所以这里学生表要用 not in

select sno,sname from dbo.student
where sno not in(
select sno from dbo.sc
where cno in(
select cno from dbo.teacher
where tname='谌燕'
))

6、 查询学过“c001”并且也学过编号“c002”课程的同学的学号、姓名;
解题思路:使用了子查询和自连接,以及使用and查找满足两个条件的行

select sno,sname from dbo.student
where sno in(
select a.sno from dbo.sc a
inner join dbo.sc b
on a.sno=b.sno
where a.cno='c001' and b.cno='c002'
)

7、 查询学过“谌燕”老师所教的所有课的同学的学号、姓名;
解题思路:跟上面的第五题差不多,只是把‘没学过’not in 改成‘学过’ in

select sno,sname from dbo.student
where sno  in(
select sno from dbo.sc
where cno in(
select cno from dbo.teacher
where tname='谌燕'
))

8、查询所有课程成绩小于60 分的同学的学号、姓名;
解题思路:使用了两个内连接和where条件查询子句

select xs.sno sname from dbo.student xs
inner join dbo.sc cj
on xs.sno=cj.sno
inner join dbo.course kc
on kc.cno=cj.cno
where cj.score<60

9、 查询没有学全所有课的同学的学号、姓名;
解题思路:使用子查询

select*from dbo.student
where sno not in (
select sno from dbo.sc
)

10、 查询至少有一门课与学号为“s001”的同学所学相同的同学的学号和姓名;
解题思路:使用嵌套子查询和where子句

select*from dbo.student
where sno in(
select sno from dbo.sc
where cno in(
select cno from dbo.student
where sno='s001'
)
)

11、查询各科成绩最高和最低的分:以如下形式显示:课程ID,最高分,最低分
解题思路:使用聚合函数 min最小值 max最大值

select cno 课程ID,max(score)最高分,min(score)最低分from dbo.scgroup by cno

12、查询每门课程被选修的学生数
解题思路:使用聚合函数count个数

select cno ,count(*) from dbo.sc
group by cno

13、查询出只选修了一门课程的全部学生的学号和姓名
解题思路:这里只需要查询出只选修一门课的学生,首先我使用了内连接,其次是使用having子句来根据指定的条件列表过滤分组

select xs.sno,xs.sname,count(cno) from dbo.student xs
inner join dbo.sc cj
on xs.sno=cj.sno
group by xs.sno,xs.sname
having count(cno)=1

14、1981 年出生的学生名单(注:Student 表中Sage 列的类型是numeric)
解题思路:getdate获取当前时间datediff是计算日期时间。它有三个值datepart/startdate/Enddate,第一个是规定了应在日期的哪一部分计算差额的参数;第二个是计算的开始日期;第三个是计算的终止日期

select*from dbo.student
where sage=datediff(yyyy,'1981',getdate())

15、查询每门课程的平均成绩,结果按平均成绩升序排列,平均成绩相同时,按课程号降序排列
解题思路:使用聚合函数,其次是asc升序和desc降序

select cno,avg(score)from dbo.sc
group by cno
order by avg(score) asc,cno desc

16、查询平均成绩大于85 的所有学生的学号、姓名和平均成绩
解题思路:使用了内连接和聚合函数

select xs.sno,sname,avg(score)from dbo.student xs
inner join dbo.sc cj
on xs.sno=cj.sno
group by xs.sno,sname
having avg(score)>85

17、查询课程编号为c001 且课程成绩在80 分以上的学生的学号和姓名;
解题思路:使用了内连接,以及使用and查找满足两个条件的行

select xs.sno,sname,score from dbo.student xs
inner join dbo.sc cj
on xs.sno=cj.sno
where cno='c001' and score>80

18、查询两门以上不及格课程的同学的学号及其平均成绩
解题思路:这里查询两门不及格的学生,使用where子句直接小于60,再通过having来判断是否大于1

select sno, avg(score) from dbo.sc
where score<60
group by sno
having count(*)>1

19、检索“c004”课程分数小于60,按分数降序排列的同学学号
解题思路:直接使用and来满足where查询出课程号为c004和分数小于60

select sno from dbo.sc
where cno='c004'
and score<60
order by score desc

20、删除“s002”同学的“c001”课程的成绩

 delete from dbo.scwhere  sno='s002' and cno='c001'

超经典的20道SQL题目(附加解题思路)相关推荐

  1. 如何快速掌握MYSQL?附牛客网精选的50道SQL题目详解【入门推荐】

    大家早上好,本人姓吴,如果觉得文章写得还行的话也可以叫我吴老师.欢迎大家跟我一起走进数据分析的世界,一起学习! 感兴趣的朋友可以关注我的数据分析专栏,里面有许多优质的文章跟大家分享哦. 另外也欢迎大家 ...

  2. 2020年数学建模国赛B题题目和解题思路

    2020年数学建模国赛B题题目: 考虑如下的小游戏:玩家凭借一张地图,利用初始资金购买一定数量的水和食物(包括食品和其他日常用品),从起点出发,在沙漠中行走.途中会遇到不同的天气,也可在矿山.村庄补充 ...

  3. 2018年数学建模国赛A题题目、解题思路、matlab代码(四)

    题目: 消防和金属冶金等行业常常需要工作人员在高温环境中作业,高温作业专用服装可以较好地吸收部分热量,使得工作人员体表温度不至于过高从而避免灼伤,所以高温作业服必不可少.通常作业服由三层材料构成,记为 ...

  4. 2020年数学建模国赛C题题目和解题思路

    2020年数学建模国赛C题题目: 在实际中,由于中小微企业规模相对较小,也缺少抵押资产,因此银行通常是依据信贷政策.企业的交易票据信息和上下游企业的影响力,向实力强.供求关系稳定的企业提供贷款,并可以 ...

  5. 2016年数学建模A题题目、解题思路、matlab代码(二)

    问题: 海洋边界作为国家的领土区分线,对国家安全具有极其重要的战略用途,建立和完善近浅海观测网势在必行.近浅海观测网由若干传输节点组合而成,每个传输节点由浮标系统.系泊系统和水声通讯系统组成.其中水声 ...

  6. 2020年数学建模国赛D题题目和解题思路

    2020年数学建模国赛D题题目: 轮廓仪是一种两坐标测量仪器(见图1),它由工作平台.夹具.被测工件.探针.传感器和伺服驱动等部件组成(见图2). 图1 某种型号的接触式轮廓仪 图2 接触式轮廓仪的示 ...

  7. sqlzoo刷题(部分题目含解题思路)

    1.concat函数用法 (1)12.The capital of Mexico is Mexico City. Show all the countries where the capital ha ...

  8. 计算机网络经典选择题20道

    计算机网络可以被理解为( B ) 执行计算机数据处理的软件模块 由自治的计算机互联起来的集合体 多个处理器通过共享内存实现的紧耦合系统 用于共同完成一项任务的分布式系统 计算机网络最基本的功能是( A ...

  9. 45道SQL题目陆续更新

    文章目录 学习视频 配置环境 第一天 内连接 + 外连接 sql执行顺序 第二天 group by 的用法 第三天 第四天 order by case when 窗口函数 第五天 第六天 第七天 li ...

最新文章

  1. 查询出每个部门比本部门平均工资高的职工人数
  2. idea redis 插件_Redis客户端RDM收费后,还有哪些开源的替代品呢?
  3. vgg 名人人脸图像库_您看起来像哪个名人? 图像相似度搜索模型
  4. python整数加法计算器_Python应用实例赏析2.1简单计算
  5. 《YOLO算法笔记》(草稿)
  6. 驱动框架3——在内核中添加或去除某个驱动
  7. NOIP2003普及组第1题 乒乓球(Table.cpp)-- python3实现
  8. skcket编程实例
  9. 服务器java项目转移到另一个盘_将svn的项目从一台服务器转移到另外一台服务器...
  10. 华为起诉美国政府新进展;小米空调对董明珠“没有压力”;扎克伯格:后悔没早点学微信 | 极客头条...
  11. oracle如何增加磁盘,牛刀小试Oracle之ORACLE 11GR2 RAC安装配置-asm磁盘组配置添加(四)...
  12. python模块下载网址
  13. 5G时代的到来--5G技术介绍
  14. Service与Android系统设计(5)-- libbinder
  15. build-essential unmet dependencies 有未满足依赖 解决办法
  16. 编辑器下运行exe或bat run exe or bat in editor
  17. 统信国产linux操作系统——虚拟机安装
  18. Mac 上怎么双开微信
  19. 第二届“马栏山”杯国际音视频算法大赛高分攻略
  20. 如何实现shardSDK分享以及自定义图标实现

热门文章

  1. De Bruijn 序列生成的本原多项式方法
  2. java8 各种时间转换方法
  3. 关于魅族手机adb连接不上的问题
  4. JDK8新特性(五):JDK8时间日期API
  5. 物联网流量卡能用在手机上吗
  6. 清华张长水等人30页少样本学习综述论文,涵盖400+参考文献
  7. 日志审计系统及ELK日志系统
  8. 搭建ELK日志审计系统
  9. 树立产学研合作典范,IBM携手十所商学院共同打造百企大数据合作计划A100升级版...
  10. 批量地导入本地的scholar.enw到endnote