2019独角兽企业重金招聘Python工程师标准>>>
创建数据库:
create database 学生课程
建表:
create table 学生表(
学号 char(10) not null primary key,
姓名 nvarchar(30) not null,
性别 nvarchar(2) not null,
年龄 int not null,
所在院系 nvarchar(10) not null,
班级名称 nvarchar(20) not null,
入学年份 datetime not null
);
create table 课程表(
课程号 char(10) not null primary key,
课程名 nvarchar(20) not null,
选修课 nvarchar(10)
);
create table 成绩表(
学号 char(10) not null references 学生表(学号),
课程号 char(10) not null references 课程表(课程号),
成绩 int not null
);
create table 授课表(
教师名 nvarchar(30) not null,
课程号 char(10) not null references 课程表(课程号),
学时数 int not null,
班级名 nvarchar(20)
);
插入数据:
insert into 学生表 values('200009001',N'葛文卿',N'女',22,N'国际贸易',N'国贸2班',2000-8-29);
insert into 学生表 values('200104019',N'郑秀莉',N'女',21,N'会计学',N'会计2班',2001-2-9);
insert into 学生表 values('200203001',N'刘成协',N'男',18,N'计算机',N'软件2班',2002-8-27);
insert into 学生表 values('200206001',N'苏怀欣',N'男',22,N'电子学',N'电子1班',2002-8-27);
insert into 学生表 values('200203002',N'夏洛特',N'女',22,N'计算机',N'软件2班',2002-8-27);
insert into 学生表 values('200206002',N'李涛',N'男',23,N'电子学',N'电子1班',2002-8-27);
insert into 学生表 values('200203003',N'肖一竹',N'女',19,N'计算机',N'软件2班',2000-8-27);
insert into 课程表 values('C801',N'高等数学',' ');
insert into 课程表 values('C807',N'离散数学',' ');
insert into 课程表 values('C802',N'C++语言','C807');
insert into 课程表 values('C803',N'数据结构','C802');
insert into 课程表 values('C804',N'数据库原理','C803');
insert into 课程表 values('C805',N'操作系统','C807');
insert into 课程表 values('C806',N'编译原理','C803');
insert into 成绩表 values('200203001','C801',98);
insert into 成绩表 values('200203002','C804',70);
insert into 成绩表 values('200206001','C801',85);
insert into 成绩表 values('200203001','C802',99);
insert into 成绩表 values('200206002','C803',82);
insert into 授课表 values(N'赵鑫智','C801',72,N'软件2班');
insert into 授课表 values(N'王立山','C802',64,N'软件2班');
insert into 授课表 values(N'何珊','C803',72,N'软件2班');
insert into 授课表 values(N'王立山','C804',64,N'软件2班');
insert into 授课表 values(N'赵鑫智','C801',72,N'软件1班');
题目及答案:
--1.查询学生表中信息
select * from 学生表;
--2.查询成绩表中的信息
select * from 成绩表;
--3.查询全部学生的所有信息,且姓名输出在左边(第一列)
select 姓名,学号,性别,年龄,所在院系,班级名称,入学年份 from 学生表;
--4.查询学生当前的年龄是多少岁
select 姓名,性别,年龄 from 学生表;
--5.要求计算教师授课程的学分(设学分=学时数/16)
select 教师名,学时数/16 as 学分 from 授课表;
--6.要求列出学生所在的所有院系名称
select distinct 所在院系 from 学生表;
--7.查询姓'李'的学生情况
select * from 学生表 where 姓名 like N'肖%';
--8.查询成绩不在85 到95 之间的信息
select * from 成绩表 where 成绩 not in(select 成绩 from 成绩表 where 成绩>=85 and 成绩<95);
select * from 成绩表 where 成绩<85 or 成绩>95;
--9.列出所有非软件2班的班级名称
select 班级名称 from 学生表 where 班级名称 not in (select 班级名称 from 学生表 where 班级名称 = N'软件2班');
--10.列出课程号在'C802'与'C806'之间的所有课程信息
select * from 课程表 where 课程号 like 'C80[2-6]';
--11.列出无选修课的所有课程的课程名
select 课程名 from 课程表 where 选修课='';
--12.列出'高等数学','操作系统','编译原理'的全部信息
select * from 课程表 where 课程名=N'高等数学' or 课程名=N'操作系统'or 课程名=N'编译原理';
--13.要求查询所有2002年元旦前入学的学生名单.()并按年龄排序
--这句是对的,但是查询不出来的原本是,当初插入数据时未加单引号,导致datetime类型插入有误
select * from 学生表 where month(入学年份)<1 and year(入学年份)<2002 order by 年龄;
--14.要求查询年龄在19岁以下或者是女生的学生姓名,年龄,性别
select 姓名 as 学生姓名,年龄,性别 from 学生表 where 年龄<19 or 性别=N'女';
--15.同时按学号(从小到大)和成绩(从大到小)排列出所有学生课程成绩
select * from 成绩表 order by 学号,成绩 desc;
--16.从学生表中统计每个班级名称的人数
select 班级名称,count(班级名称) from 学生表 group by 班级名称;
--17.统计19岁以上女生的个数
select count(年龄) from 学生表 where 性别 = N'女' and 年龄>19;
--18.查询所有年龄的总和
select sum(年龄) from 学生表;
--19.从成绩表查询最高分,最低分
select max(成绩) as 最高分,min(成绩)as 最低分 from 成绩表;
--20.要求查询'C801'课程的平均分
select avg(成绩) from 成绩表 where 课程号='C801';
--21.统计选修了课程的学生人数(用成绩表)
select count(a) from (select count(学号) as a from 成绩表 group by 学号) as b where b.a>1;
--22.根据性别统计学生平均年龄
select avg(年龄) from 学生表 group by 性别;
--23.根据学生表统计入学年份
select 入学年份 from 学生表 group by 入学年份;
--24.找出入学人数大于3人的年份及人数
select 人数 from (select 入学年份,count(入学年份) as 人数 from 学生表 group by 入学年份 ) as A where 人数>3;
--25.求相同月份入学的人数(不考虑年份)
select month(入学年份) from 学生表;
select count(入学月份) from (select MONTH(入学年份) as 入学月份 from 学生表)as A group by 入学月份 having count(*)>1;
--26.筛选出平均成绩在80分以上的课程及平均成绩
select 课程号,平均成绩 from (select 课程号,AVG(成绩) as 平均成绩 from 成绩表 group by 课程号) as A where 平均成绩>80;
--27.查询学生 姓名,课程号,成绩
select 姓名,课程表.课程号,成绩 from 学生表,课程表,成绩表 where 学生表.学号=成绩表.学号 and 课程表.课程号=成绩表.课程号;
select 姓名,课程表.课程号,成绩 from 学生表 join 成绩表 on 学生表.学号 = 成绩表.学号 join 课程表 on 成绩表.课程号=课程表.课程号;
--28.列出所有课程的选修课程名称
select 课程号 as 选修课,课程名 from 课程表 where 课程号 in (select 选修课 from 课程表 where 选修课 !='');
--29.查询课程号为'C801'并且成绩大于90分的学生姓名,学号和成绩
select distinct 学生表.姓名,学生表.学号,成绩表.成绩 from 学生表,成绩表 ,课程表 where 成绩表.课程号='C801'
and 成绩表.成绩>90 and 成绩表.学号=学生表.学号;
--30.查询学生姓名,学号,课程名,成绩
select 姓名,学生表.学号,课程表.课程名,成绩 from 学生表,课程表,成绩表 where 学生表.学号=成绩表.学号
and 课程表.课程号=成绩表.课程号;
--31.要求列出选修了C++语言的学生学号,姓名,成绩,课程名
select 学生表.学号,姓名,成绩,课程名 from 学生表,课程表,成绩表 where 学生表.学号=成绩表.学号
and 课程表.课程号=成绩表.课程号 and 选修课='C802';
--32.查询与'刘成协' 同院系的学生信息
select * from 学生表 where 所在院系 in(select 所在院系 from 学生表 where 姓名=N'刘成协');
--33.查询选修了'C802'与'C807' 这2门课程的学生姓名,课程名和成绩
select distinct 姓名,课程名,成绩 from 学生表,课程表,成绩表 where 学生表.学号=成绩表.学号 and
成绩表.课程号=课程表.课程号 and (选修课='C802' or 选修课='C807');
--34.查询所有与计算机系学生年龄不相同的学生信息
select * from 学生表 where 年龄 not in (select 年龄 from 学生表 where 所在院系=N'计算机');
--35.查询所有年龄大于计算机系的平均年龄的非计算机系学生的学生信息
select * from 学生表 where 年龄 >(select avg(年龄) from 学生表 where 所在院系=N'计算机') and 所在院系 != N'计算机';
--36.查询所有年龄大于计算机系的最小年龄的非计算机系学生的学生信息
select * from 学生表 where 年龄>(select min(年龄) from 学生表 where 所在院系=N'计算机') and 所在院系 != N'计算机';
--37.查询所有年龄小于计算机系的最大年龄的非计算机系学生的学生信息
select * from 学生表 where 年龄<(select max(年龄) from 学生表 where 所在院系=N'计算机') and 所在院系 != N'计算机';
--38.查询'何珊'所教班级的所有任课教师的姓名,所教班级名
select * from 授课表;
select 教师名,班级名 from 授课表 where 班级名 in (select 班级名 from 授课表 where 教师名=N'何珊');
--39.按年龄降序列出所有超过平均年龄的学生姓名和年龄
select 姓名,年龄 from 学生表 where 年龄>(select avg(年龄) from 学生表) order by 年龄 desc;
--40.检索学号不是[200108011]且入学月份为5月的学生信息
--这道题废了半天劲,原因:
--学生表的入学年份输入的时候写的是2000-8-29
--但是实际插入的是1905-05-18
--原因可能由于内部机制问题,所以查入学年份时,注意下
--这是我网上找的解释:日期型数据插入要带上单引号.不然就变成数字,当你的字段类型为日期型时,我插入日期类型时确实没加单引号,加入单引号
--测试了一下,加单引号是对的,所以你可以加单引号插入,不要跟着我做
select month(入学年份) from 学生表;--结果都是5和6
select * from 学生表 where 学号 != '200108011' and month(入学年份)=5;
--41.列出年龄在18~23岁之间且选修了C++语言的男同学的详细信息
select * from 学生表 where 年龄>=18 and 年龄<=23 and 性别=N'男' and 学号 in(select 学号 from 成绩表 where 课程号 in(select 课程号 from 课程表 where 选修课='C802'));
--42.列出所有不是姓'刘'的学生信息
--这个题用到了正则,但是没有搞出来
select * from 学生表 where 姓名 not in(select 姓名 from 学生表 where 姓名=N'刘成协');
--43.统计学生表中一共有多少名20岁以上的女同学
select count(性别) from 学生表 where 年龄>20 and 性别=N'女';
--44.查找年龄最大和最小的男学生年龄
select max(年龄)as maxage,min(年龄)as minage from 学生表 where 性别=N'男';
--45.计算选修课门数在1门以上的学生号,姓名, 选课门数
--这个写法理解错的 select 学号,姓名 from 学生表 where 学号 in(select 学号 from 成绩表 where 课程号 in(select 选修课 as 课程号 from 课程表 group by 选修课 having count(选修课)>1 and 选修课 !=''));
select 学生表.学号,姓名 from 学生表 where 学号 in( select 学号 from 成绩表 group by 学号 having count(学号)>1);
--选课门数没有统计
--46.计算每个班学生的平均年龄和最小年龄
select 班级名称,avg(年龄) as 平均年龄,min(年龄) as 最小年龄 from 学生表 group by 班级名称;
--47.列出所有成绩大于学号为200106001的学生平均成绩的学生姓名,课程名和成绩
select 姓名,课程名,成绩 from 学生表,课程表,成绩表 where 学生表.学号=成绩表.学号 and 成绩表.课程号
=课程表.课程号 and 学生表.学号>'200106001';
--48.创建一个[简单学生表]要求包含4个字段"学号,姓名,性别和所在院系",
----然后将[学生表]中"国际贸易"或者男学生的记录全部插入到简单学生表中,最后显示插入的记录
create table 简单学生表(
学号 char(10) not null primary key,
姓名 nvarchar(30) not null,
性别 nvarchar(2) not null,
所在院系 nvarchar(10) not null
);
insert into 简单学生表 select 学号,姓名,性别,所在院系 from 学生表 where 所在院系=N'国际贸易' or 性别=N'男';
select * from 简单学生表;
--49.列出所有没有选修课程'C804'的学生清单
select * from 学生表 where 学号 in(
select 学号 from 成绩表 where 课程号 in(
select 课程号 from 课程表 where 选修课 in(select 选修课 from 课程表 where 选修课 !='C804')));
--50.将计算级系的学生成绩均加5分
select 成绩+5 as 加5后成绩 from 成绩表 where 学号 in (select 学号 from 学生表 where 所在院系=N'计算机');