drop database if exists test;
create database test default charset=utf8mb4;
use test;
create table 学生
(
学号 char(7) primary key ,
姓名 char(20),
性别 char(2),
出生日期 date,
身高 float
)engine=innodb;
create table 课程
(
课程号 char(7) primary key ,
学时数 int,
学分 smallint,
开课学期 char(20)
)engine=innodb;
create table 选课
(
学号 char(7),
课程号 char(7) ,
成绩 char(10),
primary key (学号,课程号),
foreign key (学号) references 学生(学号),
foreign key (课程号) references 课程(课程号)
)engine=innodb;
insert into 学生 values('1309203','欧阳林','女','1995-6-3','1.62');
insert into 学生 values('1208123','王义平','男','1994-8-20','1.71');
insert into 学生 values('1104421','周远行','男','1993-7-16','1.83');
insert into 学生 values('1309119','李维','女','1996-8-14','1.68');
insert into 学生 values('1209120','王大力','男','1993-10-20','1.75');
insert into 课程 values('CS-110','60','3','秋');
insert into 课程 values('CS-201','80','4','春');
insert into 课程 values('CS-221','40','2','秋');
insert into 课程 values('EE-122','106','5','秋');
insert into 课程 values('EE-201','45','2','春');
insert into 选课 values('1309203','CS-110','82.5');
insert into 选课 values('1309203','CS-201','80');
insert into 选课 values('1309203','EE-201','75');
insert into 选课 values('1208123','EE-122','91');
insert into 选课 values('1208123','EE-201','83');
insert into 选课 values('1104421','EE-201','100');
insert into 选课 values('1104421','CS-110','91');
insert into 选课 values('1309119','CS-110','71');
insert into 选课 values('1309119','CS-201','65');
insert into 选课 values('1209120','CS-221',null);
1.查询课程表中所有信息
select * from 课程;
2.查询所有学生的学号和姓名
select 学号,姓名 from 学生;
3.查询所有被选了课的课程号,去除重复元组
select distinct 课程号 from 课程;
4.查询所有‘女’学生的姓名和出生日期
select 姓名,出生日期 from 学生 where 性别='女';
5.查询选课成绩有不及格的学生的学号,去除重复元组
select distinct学号 from 选课 where 成绩<60;
6.查询姓‘李’,且姓名为两个字的学生的学号和姓名
select 学号,姓名 from 学生 where 姓名 like '李_';
7.查询姓名中有‘远’字的学生的学号和姓名
select 学号,姓名 from 学生 where 姓名 like '%远%';
8.查询姓名中第二个字为‘大’的学生的学号和姓名
select 学号,姓名 from 学生 where 姓名 like '_大%';
9.查询选课成绩为空值的学生的学号,去除重复元组
select distinct 学号 from 选课 where 成绩 is null;
10.查询开课学期为‘秋’且学时大于50的课程的课程号
select 课程号 from 课程 where 开课学期='秋'and 学时数>50;
11.查询全部课程的情况,查询结果按学分降序排列,相同学分的课程按学时数升序排列
select * from 课程 order by 学分 desc,学时数;
12.查询选了课的学生人数
select count(distinct 学号) from 选课;
13.查询有2门及2门以上选课成绩高于78分的学生的学号及他们选课成绩超过78分的课程数
select 学号,count(课程号) from 选课 where 成绩 >78
group by 学号 having count(课程号)>=2;
14.查询所有选了课的男学生的姓名和他选的每门课程的学分
select 姓名,学分 from 学生,课程,选课 where 学生.学号=选课.学号
and 选课.课程号=课程.课程号 and 学生.性别='男';
15.查询学号为‘1309203’的学生所选课程的总学分数
select sum(学分) from 课程,选课 where 选课.课程号=课程.课程号 and 选课.学号='1309203';
16.查询没有任何一门课程成绩不及格的所有学生的学号和姓名(没有选过课的学生也是满足条件的)。去除重复元组
select distinct 学号,姓名 from 学生 where not exists (select * from 选课 where 成绩<60);
或:
select distinct 学号,姓名 from 学生 where 学号 not in(select * from 选课 where 成绩<60);
17.查询所有姓‘王’的学生没有选修的所有课程的课程号没有选过课的学生也是满足条件的)。去除重复元组
select distinct 课程号 from 课程 where 课程号 not in
(select 课程号 from 选课,学生
where 选课.学号=学生.学号 and 学生.姓名 like '王%');
18.查询学号为‘1309119’的学生没有选修,但是学号为‘1309203’的学生选修了的所有课程的课程号,去除重复元组
select distinct 课程号 from 选课
where 学号='1309203' and 课程号 not in (select 课程号 from 选课 where 学号='1309119');
19.查询既选修了‘CS-110’课程,又选修了‘CS-201’课程的学生的学号,去除重复元组
select distinct 学号 from 选课
where 课程号='CS-110' and 学号 in (select 学号 from 选课 where 课程号='CS-201');
20.查询至少选修了3门课程的学生的学号和姓名,去除重复元组
select distinct 学生.学号,姓名 from 选课,学生
where 学生.学号=选课.学号 group by 学生.学号 having count(课程号)>=3;
21.查询学号比‘1309119’小,而年龄比学号‘1309119’的学生年龄大的学生的学号和姓名,去除重复元组
select distinct 学号,姓名 from 学生
where 学号 <'1309119' and 出生日期<(select 出生日期 from 学生 where 学号='1309119');
22.查询比任何一个男生年龄小的女生的学号和姓名,去除重复元组
select distinct 学号,姓名 from 学生 where 出生日期>
any(select 出生日期 from 学生 where 性别='男') and 性别='女';
23.查询比所有男生年龄都小的女生的学号和姓名,去除重复元组
select distinct 学号,姓名 from 学生 where 出生日期>
all(select 出生日期 from 学生 where 性别='男') and 性别='女';
24.查询被全部学生都选修了的课程的课程号,去除重复元组
select distinct 课程号 from 课程
where not exists(select * from 学生 where not exists
(select * from 选课 where 选课.学号=学生.学号 and 课程.课程号=选课.课程号));
25.查询至少选修了学号为‘1309203’的学生选修的全部课程的学生的学号,去除重复元组
select distinct 学号 from 学生 X
where not exists(select * from 学生 Y where Y.学号='1309119'
and not exists (select * from 学生 Z where Z.学号=X.学号 and Z.学号=Y.学号));
26.往‘学生表’中插入一个学生元组,该生的学号是‘1399999’,姓名是‘石丹’,女
insert into 学生 (学号,姓名,性别) values ('1399999','石丹','女');
27.往‘课程’表中插入一个课程元组,课程号是‘MA-999’,学时数99,学分2,开课学期为‘春’
insert into 课程 (课程号,学时数,学分) values ('MA-999','99','2');
28.往‘选课’表中插入如下纪录:‘学生’表中所有的‘女’生都选修了‘MA-999’课程,且成绩都为90分
insert into 选课(学号,课程号,成绩) select 学号,'MA-999','90' from 学生 where 性别='女';
29.把选了‘秋’季开设的课且该课成绩为空值的选课成绩改为0分
update 选课 set 成绩='0' where 课程号 in (select 课程号 from 课程
where 开课学期='秋') and 成绩 is null;
30.把姓‘李’的学生的选课记录全部删除
delete from 选课 where 学号 in (select 学号 from 学生 where 姓名 like '李%');
31.定义一个视图名为‘每个学生的平均成绩’,包含3个属性:(学号,姓名,平均成绩),其中平均成绩是该生自己所选课程的平均成绩
create view 每个学生的平均成绩 (学号,姓名,平均成绩)
as select 学生.学号,姓名,avg(成绩) from 学生,选课
where (学生.学号=选课.学号) group by 学生.学号;
32.利用视图‘每个学生的平均成绩’查询每个学生的姓名和平均成绩
select 姓名,平均成绩 from 每个学生的平均成绩;
33.利用视图‘每个学生的平均成绩’查询平均成绩最高的学生的学号和姓名
select 学号,姓名 from 每个学生的平均成绩
where 平均成绩>=all(select 平均成绩 from 每个学生的平均成绩);
或:
select 学号,姓名 from 每个学生的平均成绩
where 平均成绩=(select max(平均成绩) from 每个学生的平均成绩);
34.定义一个视图名为‘全部选课记录的平均成绩’,只包含1个属性:(总平均成绩),为所有选课记录的总平均成绩
create view 全部选课记录的平均成绩 (总平均成绩) as select avg(成绩) from 选课;
35.利用视图‘全部选课记录的平均成绩’找到选课记录中低于总平均成绩的那些成绩,把其中属于女生的那些成绩提高10%
update 选课 set 成绩=成绩*1.1 where
成绩 in (select 成绩 from(select 成绩 as a from 学生,选课 where 学生.学号=选课.学号
and 学生.性别='女' and 成绩<(select 总平均成绩 from 全部选课记录的平均成绩))as a);
或:
update 选课 set 成绩=成绩*1.1 where
学号 in (select 学号 from 学生 where 性别='女') and
成绩<(select 总平均成绩 from 全部选课记录的平均成绩);