免责声明:以下练习中涉及到的人名均属于我用python的faker模块自动生成的,如有雷同纯属巧合。
create database day5; # 创建新的数据库day5
use day5; # 切换day5为当前数据库
create table teacher( # 创建老师表
tid int unsigned not null auto_increment primary key,
tname char(20) not null
)default charset=utf8;
insert into teacher(tname) values # 插入老师表数据
('周建国'),
('江成'),
('吴芳'),
('王飞'),
('李冬梅');
create table course( # 创建课程表
cid int unsigned not null auto_increment primary key,
cname char(20) not null,
teacher_id int unsigned not null,
key fk_course_teacher (teacher_id),
constraint fk_course_teacher foreign key(teacher_id) references teacher(tid)
)default charset=utf8;
insert into course values # 插入课程表数据
(1,'语文',1),
(2,'数学',2),
(3,'体育',3),
(4,'物理',2);
create table student( # 创建学生表
sid int unsigned not null auto_increment primary key,
gender enum('男','女') not null,
sname char(20) not null
)default charset=utf8;
insert into student values # 插入学生数据
(1, '男', '梁鑫'), (2, '女','黄淑珍'), (3, '男', '唐建华'), (4, '男', '叶辉'),
(5, '女','李倩'), (6, '男', '唐帆'), (7, '女', '钟琴'), (8, '男','冯东'),
(9, '男','文洋'), (10, '女', '乔霞'), (11, '男','吴成'), (12, '女','何颖'),
(13, '男', '张波'), (14, '男','张宇'), (15, '女','舒洁'), (16, '男','卢龙');
create table score( # 创建分数表
sid int unsigned not null auto_increment primary key,
student_id int unsigned not null,
course_id int unsigned not null,
num int unsigned not null,
key fk_score_student (student_id),
key fk_score_course (course_id),
constraint fk_score_course foreign key (course_id) references course (cid),
constraint fk_score_student foreign key (student_id) references student (sid)
)default charset=utf8;
insert into score(student_id,course_id,num) values # 插入分数数据
(15, 1, 93), (15, 2, 81), (15, 3, 99), (15, 4, 97), (10, 1, 85),
(10, 2, 94), (10, 3, 93), (10, 4, 96), (16, 1, 87), (16, 2, 87),
(16, 3, 97), (16, 4, 100), (8, 1, 83), (8, 2, 100), (8, 3, 83),
(8, 4, 80), (13, 1, 82), (13, 2, 89), (13, 3, 96), (13, 4, 88),
(6, 1, 91), (6, 2, 88), (6, 3, 99), (6, 4, 100), (12, 1, 32),
(12, 3, 42), (12, 2, 58), (5, 4, 57), (5, 3, 46), (5, 2, 7),
(2, 3, 27), (1, 2, 55), (1, 4, 32), (9, 4, 75), (9, 2, 71),
(9, 3, 76), (4, 2, 72), (4, 4, 71), (4, 3, 66), (4, 1, 69),
(11, 2, 64), (11, 4, 63), (11, 1, 70), (11, 3, 62), (14, 3, 75),
(14, 1, 76), (14, 2, 78), (3, 4, 63), (3, 3, 72), (3, 1, 73),
(3, 2, 76);
一、查询学生中男生人数和女生人数:
这题非常简单,直接从学生表中做分组count即可:
select gender 性别,count(gender) 人数
from student
group by gender;
二、查询学生中名字是两个字的人数
这题和上一题差不多,用where筛选用count统计即可:
select count(*) 人数
from student
where sname like '__';
三、查询各科成绩平均分(从高到低排序)
select course_id 课程,avg(num) 平均分
from score
group by course_id;
select cname 课程,平均分
from course a
inner join(
select course_id 课程,avg(num) 平均分
from score
group by course_id) b
on a.cid=b.课程
order by 平均分 desc;
四、查询有课程成绩小于60分的学生学号和姓名:
select distinct student_id
from score
where num<60;
select sid 学号,sname 姓名
from student a
inner join(
select distinct student_id
from score
where num<60) b
on a.sid=b.student_id;
五、查询出只有一门考试成绩的全部学生学号和姓名:
select student_id
from score
group by student_id
having count(student_id)=1
select sid 学号,sname 姓名
from student
where sid in(
select student_id
from score
group by student_id
having count(student_id)=1);
复杂查询的时候优先考虑使用连表其次考虑使用子表。如果第一步查询结果是单列的少量数据时可以用子表查询。但如果第一步查询的结果是多列那么考虑用连表。
另外复杂查询是需要解题思路和抽丝剥茧逐步实现的,每一步实现子步骤都要经过验证。最终将所有步骤合并起来就可以完成。
最后,今天建库建表耗费了我较多时间,其中的student表中的名字都是我写的python程序利用facker模块生成的,score表中的成绩也是用python程序按正态分布规律random生成的随机数。
今天暂时写5道题,后面几天我还会发布多一些练习题。
希望学MySQL的朋友一定要认真地动手练习,多尝试自己写。