一、建表工作
# 学生表 Student:
create table Student(SId varchar(10) ,Sname varchar(10),Sage datetime,Ssex varchar(10));
insert into Student values('01' , '赵雷' , '1990-01-01' , '男'),('02' , '钱电' , '1990-12-21' , '男'),('03' , '孙风' , '1990-05-20' , '男'),('04' , '李云' , '1990-08-06' , '男'),('05' , '周梅' , '1991-12-01' , '女'),('06' , '吴兰' , '1992-03-01' , '女'),('07' , '郑竹' , '1989-07-01' , '女'),('09' , '张三' , '2017-12-20' , '女'),('10' , '李四' , '2017-12-25' , '女'),('11' , '李四' , '2017-12-30' , '女'),('12' , '赵六' , '2017-01-01' , '女'),('13' , '孙七' , '2018-01-01' , '女');
# 教师表 Teacher:
create table Teacher(TId varchar(10),Tname varchar(10));
insert into Teacher values('01' , '张三'),('02' , '李四'),('03' , '王五');
# 科目表 Course:
create table Course(CId varchar(10),Cname nvarchar(10),TId varchar(10));
insert into Course values('01' , '语文' , '02'),('02' , '数学' , '01'),('03' , '英语' , '03');
# 成绩表 SC:
create table SC(SId varchar(10),CId varchar(10),score decimal(18,1));
insert into SC values('01' , '01' , 80),('01' , '02' , 90),('01' , '03' , 99),('02' , '01' , 70),('02' , '02' , 60),('02' , '03' , 80),('03' , '01' , 80),('03' , '02' , 80),('03' , '03' , 80),('04' , '01' , 50),('04' , '02' , 30), ('04' , '03' , 20),('05' , '01' , 76), ('05' , '02' , 87),('06' , '01' , 31),('06' , '03' , 34),('07' , '02' , 89),('07' , '03' , 98);
二、题目准备及解答
-----1、查询"01"课程成绩比"02"课程成绩高的学生的信息及分数
思路:【关键词】学生信息及分数
需要联表查询,先进行01课程比02课程大的比较,然后再拿出SID相等的数据
select s.*,sc.score from student s
left join sc on s.SId = sc.SId
left join sc a on a.SId = sc.SId
and sc.CId='01' and a.CId='02'
where sc.score>a.score
-----2、查询平均成绩>=60分同学的学生编号、姓名和平均成绩
思路:
主要考察group by聚合函数,where和having的区别以及Sql的执行顺序。
HAVING AVG(score)>=60是在select前执行的,需要写完整
SELECT s.SId,s.Sname,AVG(sc.score)
FROM student s
LEFT JOIN sc
ON s.SId = sc.SId
GROUP BY s.SId
HAVING AVG(score)>=60
-----3、查询在SC表中有成绩的学生信息
SELECT *
FROM sc
LEFT JOIN student s
ON s.SId = sc.SId
GROUP BY sc.SId;
-----4、查询所有同学的学生编号、姓名、选课总数、所有课程的总成绩(没成绩显示null)
SELECT s.SId,s.Sname,SUM(sc.CId),SUM(sc.score)
FROM student s
LEFT JOIN sc
ON s.SId = sc.SId
GROUP BY sc.SId;