建表
--course definition
CREATE TABLE `course` (
`CId` varchar(10) DEFAULT NULL,
`Cname` varchar(10) DEFAULT NULL,
`TId` varchar(10) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='科目表';
--sc definition
CREATE TABLE `sc` (
`SId` varchar(10) DEFAULT NULL,
`CId` varchar(10) DEFAULT NULL,
`score` decimal(18,1) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='分数表';
--student definition
CREATE TABLE `student` (
`SId` varchar(10) DEFAULT NULL,
`Sname` varchar(10) DEFAULT NULL,
`Sage` datetime DEFAULT NULL,
`Ssex` varchar(10) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='学生表';
--teacher definition
CREATE TABLE `teacher` (
`TId` varchar(10) DEFAULT NULL,
`Tname` varchar(10) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='教师表';
插入数据
INSERT INTO student (SId, Sname, Sage, Ssex) VALUES('01', '赵雷', '1990-01-01 00:00:00.0', '男');
INSERT INTO student (SId, Sname, Sage, Ssex) VALUES('02', '钱电', '1990-12-21 00:00:00.0', '男');
INSERT INTO student (SId, Sname, Sage, Ssex) VALUES('03', '孙风', '1990-05-20 00:00:00.0', '男');
INSERT INTO student (SId, Sname, Sage, Ssex) VALUES('04', '李云', '1990-08-06 00:00:00.0', '男');
INSERT INTO student (SId, Sname, Sage, Ssex) VALUES('05', '周梅', '1991-12-01 00:00:00.0', '女');
INSERT INTO student (SId, Sname, Sage, Ssex) VALUES('06', '吴兰', '1992-03-01 00:00:00.0', '女');
INSERT INTO student (SId, Sname, Sage, Ssex) VALUES('07', '郑竹', '1989-07-01 00:00:00.0', '女');
INSERT INTO student (SId, Sname, Sage, Ssex) VALUES('09', '张三', '2017-12-20 00:00:00.0', '女');
INSERT INTO student (SId, Sname, Sage, Ssex) VALUES('10', '李四', '2017-12-25 00:00:00.0', '女');
INSERT INTO student (SId, Sname, Sage, Ssex) VALUES('11', '李四', '2017-12-30 00:00:00.0', '女');
INSERT INTO student (SId, Sname, Sage, Ssex) VALUES('12', '赵六', '2017-01-01 00:00:00.0', '女');
INSERT INTO student (SId, Sname, Sage, Ssex) VALUES('13', '孙七', '2018-01-01 00:00:00.0', '女');
INSERT INTO teacher (TId, Tname) VALUES('01', '张三');
INSERT INTO teacher (TId, Tname) VALUES('02', '李四');
INSERT INTO teacher (TId, Tname) VALUES('03', '王五');
INSERT INTO course (CId, Cname, TId) VALUES('01', '语文', '02');
INSERT INTO course (CId, Cname, TId) VALUES('02', '数学', '01');
INSERT INTO course (CId, Cname, TId) VALUES('03', '英语', '03');
INSERT INTO sc (SId, CId, score) VALUES('01', '01', 80.0);
INSERT INTO sc (SId, CId, score) VALUES('01', '02', 90.0);
INSERT INTO sc (SId, CId, score) VALUES('01', '03', 99.0);
INSERT INTO sc (SId, CId, score) VALUES('02', '01', 70.0);
INSERT INTO sc (SId, CId, score) VALUES('02', '02', 60.0);
INSERT INTO sc (SId, CId, score) VALUES('02', '03', 80.0);
INSERT INTO sc (SId, CId, score) VALUES('03', '01', 80.0);
INSERT INTO sc (SId, CId, score) VALUES('03', '02', 80.0);
INSERT INTO sc (SId, CId, score) VALUES('03', '03', 80.0);
INSERT INTO sc (SId, CId, score) VALUES('04', '01', 50.0);
INSERT INTO sc (SId, CId, score) VALUES('04', '02', 30.0);
INSERT INTO sc (SId, CId, score) VALUES('04', '03', 20.0);
INSERT INTO sc (SId, CId, score) VALUES('05', '01', 76.0);
INSERT INTO sc (SId, CId, score) VALUES('05', '02', 87.0);
INSERT INTO sc (SId, CId, score) VALUES('06', '01', 31.0);
INSERT INTO sc (SId, CId, score) VALUES('06', '03', 34.0);
INSERT INTO sc (SId, CId, score) VALUES('07', '02', 89.0);
INSERT INTO sc (SId, CId, score) VALUES('07', '03', 98.0);
-
查询" 01 "课程比" 02 "课程成绩高的学生的信息及课程分数
1.1查询同时存在" 01 "课程和" 02 "课程的情况
1.2查询存在" 01 "课程但可能不存在" 02 "课程的情况(不存在时显示为 null )
1.3查询不存在" 01 "课程但存在" 02 "课程的情况
/*
*
*查询" 01 "课程比" 02 "课程成绩高的学生的信息及课程分数
*1.1 查询同时存在" 01 "课程和" 02 "课程的情况
*1.2 查询存在" 01 "课程但可能不存在" 02 "课程的情况(不存在时显示为 null )
*1.3 查询不存在" 01 "课程但存在" 02 "课程的情况
* */
//1
select * from
(select sid,CId,score from sc where CId ='01') t1
inner join
(select sid,CId,score from sc where CId ='02') t2
on t1.sid = t2.sid
where t1.score<t2.score
//1.1
select * from
(select sid,CId,score from sc where CId ='01') t1
inner join
(select sid,CId,score from sc where CId ='02') t2
on t1.sid = t2.sid
//1.2
select * from
(select sid,CId,score from sc where CId ='01') t1
left join
(select sid,CId,score from sc where CId ='02') t2
on t1.sid = t2.sid
//1.3
select * from sc
where sc.SId not in
(select sid from sc where cid = '01')
and cid = '02'
- 查询平均成绩大于等于 60 分的同学的学生编号和学生姓名和平均成绩
-- 查询平均成绩大于等于 60 分的同学的学生编号和学生姓名和平均成绩
select s.sid ,s.sname , avgscore from student s ,
(select sid , avg(score) as 'avgscore' from sc group by sid having avg(score)>60)t1
where s.sid = t1.sid
-
查询在 SC 表存在成绩的学生信息(同4.1) -
查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩(没成绩的显示为 null )
-- 4. 查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩(没成绩的显示为null)
select s.sid,s.Sname ,t1.cnum,t1.countscore from student s ,
(select SId ,count(CId)as cnum ,sum(score) countscore from sc group by sid) t1
where s.sid = t1.sid
4.1查有成绩的学生信息
-- 4.1查有成绩的学生信息
select distinct s.* from student s left join sc on s.sid = sc.sid
- 查询「李」姓老师的数量
-- 5. 查询「李」姓老师的数量
select count(*) from teacher t where t.Tname like '李%'
- 查询学过「张三」老师授课的同学的信息
-- 6. 查询学过「张三」老师授课的同学的信息
select s2.* from student s2 right join
(select sid from sc where cid in (select c.CId from course c left join teacher t on c.TId = t.TId where t.Tname ='张三')) t1
on s2.SId = t1.sid
- 查询没有学全所有课程的同学的信息
-- 7.查询没有学全所有课程的同学的信息
select * from student where sid not in
(select sc.sid from student s2 ,sc where s2.sid = sc.sid group by sc.sid
having count(1) = (select count(1) from course c2))
- 查询至少有一门课与学号为" 01 "的同学所学相同的同学的信息
-- 查询至少有一门课与学号为" 01 "的同学所学相同的同学的信息
select distinct s.* from student s ,sc where sc.CId in
(select cid from sc where sid = '01')
and s.sid !='01'
- 查询和" 01 "号的同学学习的课程 完全相同的其他同学的信息
select sid from sc group by sid having (group_concat(CId order by CId)) =
(select group_concat(CId order by CId) from sc where sid = '01')
and sid !='01'
- 查询没学过"张三"老师讲授的任一门课程的学生姓名
-- 查询没学过"张三"老师讲授的任一门课程的学生姓名
select sid ,sname from student where sid not in
(
select sid from sc where cid in
(select CId from teacher c inner join course t on c.TId = t.TId and Tname = '张三')
)
- 查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩
-- 查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩
select s.*, avg(score) as '平均分' from student s inner join sc
on exists (select sid from sc group by SId having count(score<60 or null) >=2 and s.sid = sc.sid)
- 检索" 01 "课程分数小于 60,按分数降序排列的学生信息
--检索" 01 "课程分数小于 60,按分数降序排列的学生信息
select s.* ,t.score from student s ,
(select sid,score from sc where cid = '01' and score <60 ) t
where t.sid = s.SId order by t.score desc
- 按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩
-- 按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩
select sc.sid,sname,
max(case when cid = '01' then score else null end) as 'chinese',
max(case when cid = '02' then score else null end)as 'math',
max(case when cid = '03' then score else null end)as'english',
sum(score)/3 'avgscore',
sum(score)'sum'
from sc , student s2
where sc.sid = s2.SId
group by sc.sid
order by avgscore desc
(未完待续)
-
查询各科成绩最高分、最低分和平均分: 以如下形式显示:课程 ID,课程 name,最高分,最低分,平均分,及格率,中等率,优良率,优秀率 及格为>=60,中等为:70-80,优良为:80-90,优秀为:>=90 要求输出课程号和选修人数,查询结果按人数降序排列,若人数相同,按课程号升序排列
-
按各科成绩进行排序,并显示排名, Score 重复时保留名次空缺 15.1 按各科成绩进行排序,并显示排名, Score 重复时合并名次
-
查询学生的总成绩,并进行排名,总分重复时保留名次空缺 16.1 查询学生的总成绩,并进行排名,总分重复时不保留名次空缺
-
统计各科成绩各分数段人数:课程编号,课程名称,[100-85],[85-70],[70-60],[60-0] 及所占百分比
-
查询各科成绩前三名的记录
-
查询每门课程被选修的学生数
-
查询出只选修两门课程的学生学号和姓名
-
查询男生、女生人数
-
查询名字中含有「风」字的学生信息
-
查询同名同性学生名单,并统计同名人数
-
查询 1990 年出生的学生名单
-
查询每门课程的平均成绩,结果按平均成绩降序排列,平均成绩相同时,按课程编号升序排列
-
查询平均成绩大于等于 85 的所有学生的学号、姓名和平均成绩
-
查询课程名称为「数学」,且分数低于 60 的学生姓名和分数
-
查询所有学生的课程及分数情况(存在学生没成绩,没选课的情况)
-
查询任何一门课程成绩在 70 分以上的姓名、课程名称和分数
-
查询不及格的课程
-
查询课程编号为 01 且课程成绩在 80 分以上的学生的学号和姓名
-
求每门课程的学生人数
-
成绩不重复,查询选修「张三」老师所授课程的学生中,成绩最高的学生信息及其成绩
-
成绩有重复的情况下,查询选修「张三」老师所授课程的学生中,成绩最高的学生信息及其成绩
-
查询不同课程成绩相同的学生的学生编号、课程编号、学生成绩
-
查询每门功成绩最好的前两名
-
统计每门课程的学生选修人数(超过 5 人的课程才统计)。
-
检索至少选修两门课程的学生学号
-
查询选修了全部课程的学生信息
-
查询各学生的年龄,只按年份来算
-
按照出生日期来算,当前月日 < 出生年月的月日则,年龄减一
-
查询本周过生日的学生
-
查询下周过生日的学生
-
查询本月过生日的学生
-
查询下月过生日的学生