MySQL数据库题目练习

1.创建数据库

drop database if exists test;
create database test default charset=utf8mb4;
use test;

2.创建学生表

create table 学生
(
    学号 char(7) primary key ,
    姓名 char(20),
    性别 char(2),
    出生日期 date,
    身高 float
)engine=innodb;

3.创建课程表

create table 课程
(
    课程号 char(7) primary key ,
    学时数 int,
    学分 smallint,
    开课学期 char(20)
)engine=innodb;

4.创建选课表

create table 选课
(
    学号 char(7),
    课程号 char(7) ,
    成绩 char(10),
    primary key (学号,课程号),
    foreign key (学号) references 学生(学号),
    foreign key (课程号) references 课程(课程号)
)engine=innodb;

5.插入数据

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);

6.练习题目

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 全部选课记录的平均成绩);
  • 3
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
--3、查询平均成绩大于等于60分的同学的学生编号和学生姓名和平均成绩 --4、查询平均成绩小于60分的同学的学生编号和学生姓名和平均成绩 --4.1、查询在sc表存在成绩的学生信息的SQL语句。 --4.2、查询在sc表中不存在成绩的学生信息的SQL语句。 --5、查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩 --5.1、查询所有有成绩的SQL。 --5.2、查询所有(包括有成绩和无成绩)的SQL。 --6、查询"李"姓老师的数量 --7、查询学过"张三"老师授课的同学的信息 --8、查询没学过"张三"老师授课的同学的信息 --9、查询学过编号为"01"并且也学过编号为"02"的课程的同学的信息 --10、查询学过编号为"01"但是没有学过编号为"02"的课程的同学的信息 --11、查询没有学全所有课程的同学的信息 --12、查询至少有一门课与学号为"01"的同学所学相同的同学的信息 --13、查询和"01"号的同学学习的课程完全相同的其他同学的信息 --14、查询没学过"张三"老师讲授的任一门课程学生姓名 --15、查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩 --16、检索"01"课程分数小于60,按分数降序排列的学生信息 --17、按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩 --18、查询各科成绩最高分、最低分和平均分: --19、按各科成绩进行排序,并显示排名 --20、查询学生的总成绩并进行排名 --20.1 查询学生的总成绩 --21、查询不同老师所教不同课程平均分从高到低显示 --22、查询所有课程的成绩第2名到第3名的学生信息及该课程成绩 --26、查询每门课程选修学生数 --27、查询出只有两门课程的全部学生的学号和姓名 --28、查询男生、女生人数 --29、查询名字中含有"风"字的学生信息 --30、查询同名同性学生名单,并统计同名人数 --31、查询1990年出生的学生名单(注:Student表中Sage列的类型是datetime) --32、查询每门课程的平均成绩,结果按平均成绩降序排列,平均成绩相同时,按课程编号升序排列 --33、查询平均成绩大于等于85的所有学生的学号、姓名和平均成绩 --34、查询课程名称为"数学",且分数低于60的学生姓名和分数 --35、查询所有学生课程及分数情况; --36、查询任何一门课程成绩在70分以上的姓名课程名称和分数; --37、查询不及格的课程 --38、查询课程编号为01且课程成绩在80分以上的学生的学号和姓名; --39、求每门课程学生人数 --40、查询选修"张三"老师所授课程学生中,成绩最高的学生信息及其成绩 --41、查询不同课程成绩相同的学生学生编号、课程编号、学生成绩 --42、查询每门功成绩最好的前两名 --43、统计每门课程学生选修人数(超过5人的课程才统计)。要求输出课程号和选修人数,查询结果按人数降序排列,若人数相同,按课程号升序排列 --44、检索至少选修两门课程学生学号 --45、查询选修了全部课程学生信息 --46、查询各学生年龄 --47、查询本周过生日的学生 --48、查询下周过生日的学生 --49、查询本月过生日的学生 --50、查询下月过生日的学生 --1、查询"01"课程比"02"课程成绩高的学生的信息及课程分数 --1.1、查询同时存在"01"课程和"02"课程的情况 --1.2、查询同时存在"01"课程和"02"课程的情况和存在"01"课程但可能不存在"02"课程的情况(不存在时显示为null)(以下存在相同内容时不再解释)

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值