MySQL基础 练习题3

– 创建学生表
create table tb_student
(
stuid int not null comment ‘学号’,
stuname varchar(20) not null comment ‘姓名’,
stusex boolean default 1 comment ‘性别’,
stubirth date not null comment ‘出生日期’,
stuaddr varchar(255) default ‘’ comment ‘籍贯’,
collid int not null comment ‘所属学院’,
primary key (stuid),
foreign key (collid) references tb_college (collid)
);

– 创建课程表
create table tb_course
(
couid int not null comment ‘编号’,
couname varchar(50) not null comment ‘名称’,
coucredit int not null comment ‘学分’,
teaid int not null comment ‘授课老师’,
primary key (couid),
foreign key (teaid) references tb_teacher (teaid)
);

– 创建选课记录表
create table tb_record
(
recid int auto_increment comment ‘选课记录编号’,
sid int not null comment ‘选课学生’,
cid int not null comment ‘所选课程’,
seldate timestamp default now() comment ‘选课时间日期’,
score decimal(4,1) comment ‘考试成绩’,
primary key (recid),
foreign key (sid) references tb_student (stuid),
foreign key (cid) references tb_course (couid),
unique (sid, cid)
);

– 插入学生数据
insert into tb_student (stuid, stuname, stusex, stubirth, stuaddr, collid) values
(1001, ‘杨逍’, 1, ‘1990-3-4’, ‘四川成都’, 1),
(1002, ‘任我行’, 1, ‘1992-2-2’, ‘湖南长沙’, 1),
(1033, ‘王语嫣’, 0, ‘1989-12-3’, ‘四川成都’, 1),
(1572, ‘岳不群’, 1, ‘1993-7-19’, ‘陕西咸阳’, 1),
(1378, ‘纪嫣然’, 0, ‘1995-8-12’, ‘四川绵阳’, 1),
(1954, ‘林平之’, 1, ‘1994-9-20’, ‘福建莆田’, 1),
(2035, ‘东方不败’, 1, ‘1988-6-30’, null, 2),
(3011, ‘林震南’, 1, ‘1985-12-12’, ‘福建莆田’, 3),
(3755, ‘项少龙’, 1, ‘1993-1-25’, null, 3),
(3923, ‘杨不悔’, 0, ‘1985-4-17’, ‘四川成都’, 3),
(4040, ‘隔壁老王’, 1, ‘1989-1-1’, ‘四川成都’, 2);

– 插入课程数据
insert into tb_course (couid, couname, coucredit, teaid) values
(1111, ‘Python程序设计’, 3, 1122),
(2222, ‘Web前端开发’, 2, 1122),
(3333, ‘操作系统’, 4, 1122),
(4444, ‘计算机网络’, 2, 1133),
(5555, ‘编译原理’, 4, 1144),
(6666, ‘算法和数据结构’, 3, 1144),
(7777, ‘经贸法语’, 3, 2255),
(8888, ‘成本会计’, 2, 3366),
(9999, ‘审计学’, 3, 3366);

– 插入选课数据
insert into tb_record (sid, cid, seldate, score) values
(1001, 1111, ‘2017-09-01’, 95),
(1001, 2222, ‘2017-09-01’, 87.5),
(1001, 3333, ‘2017-09-01’, 100),
(1001, 4444, ‘2018-09-03’, null),
(1001, 6666, ‘2017-09-02’, 100),
(1002, 1111, ‘2017-09-03’, 65),
(1002, 5555, ‘2017-09-01’, 42),
(1033, 1111, ‘2017-09-03’, 92.5),
(1033, 4444, ‘2017-09-01’, 78),
(1033, 5555, ‘2017-09-01’, 82.5),
(1572, 1111, ‘2017-09-02’, 78),
(1378, 1111, ‘2017-09-05’, 82),
(1378, 7777, ‘2017-09-02’, 65.5),
(2035, 7777, ‘2018-09-03’, 88),
(2035, 9999, default, null),
(3755, 1111, default, null),
(3755, 8888, default, null),
(3755, 9999, ‘2017-09-01’, 92);

1.查询所有学生信息
2.查询所有课程名称及学分
3.查询所有学生的姓名和性别
4.查询所有女学生的姓名和出生日期
5.查询所有80后学生的姓名、性别和出生日期
6.查询姓"杨"的学生姓名和性别
7.查询姓"杨"名字两个字的学生姓名和性别
8.查询姓"杨"名字三个字的学生姓名和性别
9.查询名字中有"不"字或"嫣"字的学生的姓名
10.查询没有录入家庭住址的学生姓名
11.查询录入了家庭住址的学生姓名
12.查询学生选课的所有日期
13.查询学生的家庭住址
14.查询男学生的生日按年龄从大到小排列
15.查询年龄最大的学生的出生日期
16.查询年龄最小的学生的出生日期
17.分别查询男学生和女学生的人数
18.查询课程编号为1111的课程的平均成绩
19.查询学号为1001的学生所有课程的平均分
20.查询每个学生的学号和平均成绩
21.查询平均成绩大于等于90分的学生的学号和平均成绩
22.查询年龄最大的学生的姓名
23.查询选了两门以上的课程的学生姓名
24.查询学生姓名、课程名称以及成绩
25.查询学生姓名、课程名称以及成绩按成绩从高到低查询第11-15条记录
26.查询每个学生的姓名和选课数量
演示:

1.查询所有学生信息

select *from tb_student;

2.查询所有课程名称及学分

select couname,coucredit from tb_course;

3.查询所有学生的姓名和性别

select stuname,stusex from tb_student;

4.查询所有女学生的姓名和出生日期

select stuname,stubirth from tb_student where stusex=0;

5.查询所有80后学生的姓名、性别和出生日期

mysql> select stuname,stusex,stubirth from tb_student where stubirth like '198%';
+----------+--------+------------+
| stuname  | stusex | stubirth   |
+----------+--------+------------+
| 王语嫣   |      0 | 1989-12-03 |
| 东方不败 |      1 | 1988-06-30 |
| 林震南   |      1 | 1985-12-12 |
| 杨不悔   |      0 | 1985-04-17 |
| 隔壁老王 |      1 | 1989-01-01 |
+----------+--------+------------+
5 rows in set, 1 warning (0.00 sec)

6.查询姓"杨"的学生姓名和性别

select stuname,stusex from tb_student where stuname like '杨%';

7.查询姓"杨"名字两个字的学生姓名和性别

select stuname,stusex from tb_student where stuname like '杨_';

8.查询姓"杨"名字三个字的学生姓名和性别

select stuname,stusex from tb_student where stuname like '杨__';

9.查询名字中有"不"字或"嫣"字的学生的姓名

select stuname from tb_student where stuname like '%不%' or stuname like '%嫣%'

10.查询没有录入家庭住址的学生姓名

select stuname from tb_student where stuaddr is null;

11.查询录入了家庭住址的学生姓名

select stuname from tb_student where stuaddr is not null;

12.查询学生选课的所有日期

(看你怎么理解你可以理解成只要学生选课的时间,就只用查询tb_record的seldate字段,去重就好了)

select stuname,seldate from tb_student s join tb_record r on s.stuid=r.sid;

13.查询学生的家庭住址

select stuname,stuaddr from tb_student;

14.查询男学生的生日按年龄从大到小排列

(年龄从大到小就是出生日期从小打大)

select stuname,stubirth from tb_student where stusex=1 order by stubirth asc;

15.查询年龄最大的学生的出生日期

select stuname,min(stubirth) from tb_student;

16.查询年龄最小的学生的出生日期

select stuname,max(stubirth) from tb_student;

17.分别查询男学生和女学生的人数

select stusex,count(*) from tb_student group by stusex;

18.查询课程编号为1111的课程的平均成绩

select avg(score) from tb_record where cid=1111;

19.查询学号为1001的学生所有课程的平均分

select avg(score) from tb_record where sid=1001;

20.查询每个学生的学号和平均成绩

select sid,avg(score) from tb_record group by sid;

21.查询平均成绩大于等于90分的学生的学号和平均成绩

select sid,avg(score) from tb_record group by sid having avg(score)>=90;

22.查询年龄最大的学生的姓名

以防有同一天出生的人

mysql> select stuname,stubirth from tb_student where stubirth=(select min(stubirth) from tb_student);
+---------+------------+
| stuname | stubirth   |
+---------+------------+
| 杨不悔  | 1985-04-17 |
+---------+------------+
1 row in set (0.00 sec)

23.查询选了两门以上的课程的学生姓名

mysql> select stuname from tb_student where stuid in (select sid from tb_record group by sid having count(*)>2);
+---------+
| stuname |
+---------+
| 杨逍    |
| 王语嫣  |
| 项少龙  |
+---------+
3 rows in set (0.00 sec)

24.查询学生姓名、课程名称以及成绩

mysql> select stuname,couname,score from tb_student s join tb_record r on s.stuid=r.sid join tb_course cs on r.cid=cs.couid;
+----------+----------------+-------+
| stuname  | couname        | score |
+----------+----------------+-------+
| 杨逍     | Python程序设计 |  95.0 |
| 任我行   | Python程序设计 |  65.0 |
| 王语嫣   | Python程序设计 |  92.5 |
| 岳不群   | Python程序设计 |  78.0 |
| 纪嫣然   | Python程序设计 |  82.0 |
| 项少龙   | Python程序设计 |  NULL |
| 杨逍     | Web前端开发    |  87.5 |
| 杨逍     | 操作系统       | 100.0 |
| 杨逍     | 计算机网络     |  NULL |
| 王语嫣   | 计算机网络     |  78.0 |
| 任我行   | 编译原理       |  42.0 |
| 王语嫣   | 编译原理       |  82.5 |
| 杨逍     | 算法和数据结构 | 100.0 |
| 纪嫣然   | 经贸法语       |  65.5 |
| 东方不败 | 经贸法语       |  88.0 |
| 项少龙   | 成本会计       |  NULL |
| 东方不败 | 审计学         |  NULL |
| 项少龙   | 审计学         |  92.0 |
+----------+----------------+-------+
18 rows in set (0.00 sec)

25.查询学生姓名、课程名称以及成绩按成绩从高到低查询第11-15条记录

mysql> select stuname,couname,score from tb_student s join tb_record r on s.stuid=r.sid join tb_course cs on cs.couid=r.cid order by score desc limit 10,5;
+---------+----------------+-------+
| stuname | couname        | score |
+---------+----------------+-------+
| 王语嫣  | 计算机网络     |  78.0 |
| 纪嫣然  | 经贸法语       |  65.5 |
| 任我行  | Python程序设计 |  65.0 |
| 任我行  | 编译原理       |  42.0 |
| 杨逍    | 计算机网络     |  NULL |
+---------+----------------+-------+
5 rows in set (0.00 sec)

26.查询每个学生的姓名和选课数量

mysql> select stuname,count(sid) from tb_student s left join  tb_record r on s.stuid=r.sid group by stuid;
+----------+------------+
| stuname  | count(sid) |
+----------+------------+
| 杨逍     |          5 |
| 任我行   |          2 |
| 王语嫣   |          3 |
| 纪嫣然   |          2 |
| 岳不群   |          1 |
| 林平之   |          0 |
| 东方不败 |          2 |
| 林震南   |          0 |
| 项少龙   |          3 |
| 杨不悔   |          0 |
| 隔壁老王 |          0 |
+----------+------------+
11 rows in set (0.00 sec)
只是一个作为参考的答案,如有错误还望指出
QAQ

猜你喜欢

转载自blog.csdn.net/hmh4640219/article/details/114038265