文章目录
- 数据库设计
- 数据插入
- SQL查询示例
- 1. 查询"01"课程比"02"课程成绩高的学生信息及课程分数
- 2. 查询同时存在"01"课程和"02"课程的情况
- 3. 查询存在"01"课程但可能不存在"02"课程的情况
- 4. 查询不存在"01"课程但存在"02"课程的情况
- 5. 查询平均成绩大于等于 60 分的同学的学生编号和学生姓名和平均成绩
- 6. 查询在 SC 表存在成绩的学生信息
- 7. 查询所有同学的学编号、学生姓名、选课总数、所有课程的总成绩
- 8. 查询姓“李”的老师的数量
- 9. 查询学过“张三”老师授课的同学的信息
- 10.查询没有学全所有课程的同学的信息
- 11. 查询至少有一门课与学号为"01"的同学所学相同的同学的信息
- 12. 查询和"01"号的同学学习的课程完全相同的其他同学的信息
- 13. 查询没学过"张三"老师讲授的任何一门课程的学生姓名
- 14. 查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩
- 15. 查询"01"课程分数小于60,按分数降序排列的学生信息
- 16. 按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩
- 17. 查询各科成绩最高分、最低分和平均分
- 18. 按各科平均成绩进行排序,并显示排名,Score重复时保留名次空缺
- 19. 按各科平均成绩进行排序,并显示排名,Score重复时不保留名次空缺
- 20. 查询学生的总成绩,并进行排名,总分重复时保留名次空缺
- 21. 查询学生的总成绩,并进行排名,总分重复时不保留名次空缺
- 22. 统计各科成绩各分数段人数:课程编号,课程名称,[100-85],[85-70],[70-60],[60-0]及所占百分比
- 23. 查询各科成绩前三名的记录
- 24. 查询每门课程被选修的学生数
- 25. 查询只选修两门课程的学生学号和姓名
- 26. 查询男生女生人数
- 27. 查询名字中含有“风”字的学生信息
- 28. 查询同名同性学生名单,并统计同名人数
- 29. 查询1990年出生的学生名单
- 30. 查询每门课程的平均成绩,结果按平均成绩降序排列,平均成绩相同时,按课程编号升序排列
- 31. 查询平均成绩大于等于85的所有学生的学号、姓名和平均成绩
- 32. 查询课程名称为「数学」,且分数低于 60 的学生姓名和分数
- 33. 查询所有学生的课程及分数情况(存在学生没成绩,没选课的情况)
- 34. 查询任何一门课程成绩在 70 分以上的姓名、课程名称和分数
- 35. 查询不及格的课程
- 36. 查询课程编号为 01 且课程成绩在 80 分以上的学生的学号和姓名
- 37. 求每门课程的学生人数
- 38. 成绩不重复的情况下,查询选修「张三」老师所授课程的学生中,成绩最高的学生信息及其成绩
- 39. 成绩有重复的情况下,查询选修「张三」老师所授课程的学生中,成绩最高的学生信息及其成绩
- 40. 查询不同课程成绩相同的学生的学生编号、课程编号、学生成绩
- 41. 查询每门课程成绩最好的前两名
- 42. 统计每门课程的学生选修人数(超过 5 门的课程才统计)
- 43. 检索至少选修两门课程的学生学号
- 44. 查询选修了全部课程的学生信息
- 45. 查询各学生的年龄,只按年份来算
- 46. 查询各学生的年龄,按照出生日期来算,当前月份 < 出生年月的月日则,年龄减一
- 47. 查询本周过生日的学生
- 48. 查询下周过生日的学生
- 49. 查询本月过生日的学生
- 50. 查询下个月过生日的学生
数据库设计
学生表 Student
存储学生基本信息的表,包括学生编号、姓名、出生日期和性别。
| 字段 | 类型 | 描述 |
|---|---|---|
| SId | varchar(10) | 学生编号 |
| Sname | varchar(10) | 学生姓名 |
| Sage | datetime | 学生出生日期 |
| Ssex | varchar(10) | 学生性别 |
-- 建立学生表Student
create table Student(
SId varchar(10),
Sname VARCHAR(10),
Sage datetime,
Ssex varchar(10)
);
当封面使用下图

课程表 Course
存储课程信息的表,包括课程编号、课程名称和授课教师编号。
| 字段 | 类型 | 描述 |
|---|---|---|
| CId | varchar(10) | 课程编号 |
| Cname | varchar(10) | 课程名称 |
| TId | varchar(10) | 教师编号 |
-- 建立课程表Course
create table Course(
CId varchar(10),
Cname varchar(10),
TId varchar(10)
);
教师表 Teacher
存储教师信息的表,包括教师编号和姓名。
| 字段 | 类型 | 描述 |
|---|---|---|
| TId | varchar(10) | 教师编号 |
| Tname | varchar(10) | 教师姓名 |
-- 建立教师表 Teacher
create table Teacher(
TId varchar(10),
Tname Varchar(10)
);
成绩表 SC1
存储学生成绩信息的表,包括学生编号、课程编号和分数。
| 字段 | 类型 | 描述 |
|---|---|---|
| SId | varchar(10) | 学生编号 |
| CId | varchar(10) | 课程编号 |
| score | decimal(18,1) | 学生成绩 |
-- 成绩表SC1
create table SC1(
SId varchar(10),
CId varchar(10),
score decimal(18,1)
);
数据插入
以下是对学生表、课程表、教师表和成绩表的数据插入示例。
-- 插入学生数据
insert into Student values('01' , '赵雷' , '1990-01-01' , '男');
insert into Student values('02' , '钱电' , '1990-12-21' , '男');
insert into Student values('03' , '孙风' , '1990-12-20' , '男');
insert into Student values('04' , '李云' , '1990-12-06' , '男');
insert into Student values('05' , '周梅' , '1991-12-01' , '女');
insert into Student values('06' , '吴兰' , '1992-01-01' , '女');
insert into Student values('07' , '郑竹' , '1989-01-01' , '女');
insert into Student values('09' , '张三' , '2017-12-20' , '女');
insert into Student values('10' , '李四' , '2017-12-25' , '女');
insert into Student values('11' , '李四' , '2012-06-06' , '女');
insert into Student values('12' , '赵六' , '2013-06-13' , '女');
insert into Student values('13' , '孙七' , '2014-06-01' , '女');
insert into Student values('14' , '李四' , '2012-06-06' , '女');
insert into Student values('14' , '李四' , '2012-09-04' , '女');
...
-- 插入课程数据
insert into Course values('01' , '语文' , '02');
insert into Course values('02' , '数学' , '01');
insert into Course values('03' , '英语' , '03');
...
-- 插入教师数据
insert into Teacher values('01' , '张三');
insert into Teacher values('02' , '李四');
insert into Teacher values('03' , '王五');
...
-- 插入成绩数据
insert into SC1 values('01' , '01' , 80);
insert into SC1 values('01' , '02' , 90);
insert into SC1 values('01' , '03' , 99);
insert into SC1 values('02' , '01' , 70);
insert into SC1 values('02' , '02' , 60);
insert into SC1 values('02' , '03' , 80);
insert into SC1 values('03' , '01' , 80);
insert into SC1 values('03' , '02' , 80);
insert into SC1 values('03' , '03' , 80);
insert into SC1 values('04' , '01' , 50);
insert into SC1 values('04' , '02' , 30);
insert into SC1 values('04' , '03' , 20);
insert into SC1 values('05' , '01' , 76);
insert into SC1 values('05' , '02' , 87);
insert into SC1 values('06' , '01' , 31);
insert into SC1 values('06' , '03' , 34);
insert into SC1 values('07' , '02' , 89);
insert into SC1 values('07' , '03' , 98);
...
SQL查询示例
1. 查询"01"课程比"02"课程成绩高的学生信息及课程分数
-- 查询"01"课程比"02"课程成绩高的学生信息及课程分数
select c.*,d.score01,d.score02,e.score as score03 from
Student as c
join
(
select a.SID ,a.score as score01,b.score as score02 from
(select * from SC where Cid='01') as a
left join
(select * from SC where Cid='02') as b
on a.Sid=b.SId
where a.score > if(b.score is null,0 ,b.score)
) as d
on c.SId=d.SId
join
(select * from SC where Cid='01') as e
on c.SId=e.Sid;
此查询通过连接学生表和成绩表,找出了在"01"课程中成绩高于"02"课程的学生,并显示了他们的详细信息和两门课程的分数。
2. 查询同时存在"01"课程和"02"课程的情况
-- 查询同时存在"01"课程和"02"课程的情况
select
Sid,
sum(case when CId='01' then score else 0 end) as score01,
sum(case when CId='02' then score else 0 end) as score02,
sum(case when CId='03' then score else 0 end) as score03
from
SC
group by Sid
having score01 > 0 and score02 > 0;
此查询通过分组和条件筛选,找出了同时选修"01"和"02"课程的学生,并计算了他们在这两门课程的成绩。
3. 查询存在"01"课程但可能不存在"02"课程的情况
-- 查询存在"01"课程但可能不存在"02"课程的情况
select
Sid,
sum(case when CId='01' then score else 0 end) as score01,
sum(case when CId='02' then score else null end) as score02,
sum(case when CId='03' then score else 0 end) as score03
from
SC
group by Sid
having score01 > 0;
此查询通过使用case语句和null值处理,找出了选修了"01"课程但可能未选修"02"课程的学生,并显示了他们的成绩。
4. 查询不存在"01"课程但存在"02"课程的情况
-- 查询不存在"01"课程但存在"02"课程的情况
select
Sid,
sum(case when CId='01' then score else 0 end) as score01,
sum(case when CId='02' then score else null end) as score02,
sum(case when CId='03' then score else 0 end) as score03
from
SC
group by Sid
having score01 = 0 and score02 > 0;
此查询找出了未选修"01"课程但选修了"02"课程的学生,并显示了他们的成绩。
5. 查询平均成绩大于等于 60 分的同学的学生编号和学生姓名和平均成绩
-- 查询平均成绩大于等于 60 分的同学的学生编号和学生姓名和平均成绩
select
a.SId,
b.Sname,
avg(score) as avg_score
from
SC as a
join
Student as b
on
a.Sid=b.Sid
group by
a.SId,b.Sname
having
avg_score > 60;
此查询计算了每个学生的平均成绩,并筛选出平均成绩大于等于60分的学生。
6. 查询在 SC 表存在成绩的学生信息
-- 查询在 SC 表存在成绩的学生信息
select distinct a.* from
Student as a
join
SC as b
on a.SId=b.SId;
此查询通过连接学生表和成绩表,找出了所有有成绩记录的学生信息。
7. 查询所有同学的学编号、学生姓名、选课总数、所有课程的总成绩
-- 查询所有同学的学编号、学生姓名、选课总数、所有课程的总成绩
select a.SId,a.Sname,count(b.SId) as num,sum(b.score) as sum_score from
Student as a
left join
SC as b
on
a.SId=b.Sid
group by a.SId,a.Sname;
此查询计算了每个学生的选课总数和所有课程的总成绩。
8. 查询姓“李”的老师的数量
-- 查询姓“李”的老师的数量
select count(1) as num from
Teacher
where Tname like '李%';
此查询通过使用like语句,找出了所有姓“李”的教师数量。
9. 查询学过“张三”老师授课的同学的信息
-- 查询学过“张三”老师授课的同学的信息
SELECT
*
FROM
Student
WHERE
SId IN (
SELECT
Sid
FROM
SC
WHERE
CId IN (
SELECT
Cid
FROM
Course
WHERE
TId = (
SELECT
TId
FROM
Teacher
WHERE
Tname = '张三'
)
)
);
此查询通过多层连接和条件筛选,找出了所有选修过“张三”老师课程的学生信息。
10.查询没有学全所有课程的同学的信息
-- 查询没有学全所有课程的同学的信息
select a.SId,a.Sname,a.Sage,a.Ssex,count(b.SId) as num from
Student as a
left join
SC as b
on a.SId=b.SId
group by a.SId,a.Sname,a.Sage,a.Ssex
having num < (select count(1) from Course);
此查询通过比较学生选修课程数和总课程数,找出了没有学全所有课程的学生。
11. 查询至少有一门课与学号为"01"的同学所学相同的同学的信息
-- 查询至少有一门课与学号为"01"的同学所学相同的同学的信息
select * from
Student
where
Sid in
(select distinct SId from SC
where Sid!='01' and CId in (select CId from SC where SId='01'));
此查询通过比较学号为"01"的学生所选课程与其他学生所选课程,找出了至少有一门相同课程的其他学生。
12. 查询和"01"号的同学学习的课程完全相同的其他同学的信息
-- 查询和"01"号的同学学习的课程完全相同的其他同学的信息
create view v_tmp as select CId from SC where SId='01';
select * from Student
where
SId in
(
SELECT
SId
FROM
SC
WHERE
SId IN (
SELECT
SId
FROM
SC
WHERE
SId != '01'
GROUP BY
SId
HAVING
count(1) = ( -- 1、第一次取出课程数量和01相同的学生
SELECT
count(1) AS num
FROM
v_tmp
)
)
AND CId IN (SELECT * FROM v_tmp)-- 2、取出至少有一个课程和01相同的学生
GROUP BY
SId
HAVING
count(1) = ( -- 3、取出和01完全相同的学生
SELECT
count(1) AS num
FROM
v_tmp
)
);
此查询通过创建视图和使用分组、计数和比较,找出了和学号为"01"的学生学习课程完全相同的其他学生。
13. 查询没学过"张三"老师讲授的任何一门课程的学生姓名
-- 查询没学过"张三"老师讲授的任何一门课程的学生姓名
select * from
Student
where
SId not in
(select Sid from
SC
where Cid in
(select Cid from
Course
where
TId = (select TId from Teacher where Tname = '张三')));
此查询通过排除法找出了没有选修过“张三”老师任何课程的学生。
14. 查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩
-- 查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩
select a.SId,a.Sname,b.avg_score from
Student as a
join
(select
SId,
sum(case when score < 60 then 1 else 0 end) as num,
avg(score) as avg_score
from
SC
group by SId
having num >= 2) as b
on a.SId=b.SId;
此查询通过计算不及格课程的数量和平均成绩,找出了两门及以上不及格课程的学生。
15. 查询"01"课程分数小于60,按分数降序排列的学生信息
-- 查询"01"课程分数小于60,按分数降序排列的学生信息
select b.* from
SC as a
join
Student as b
on a.Sid=b.Sid
where Cid='01' and score < 60
order by a.score desc;
此查询通过连接学生表和成绩表,并筛选出“01”课程分数小于60的学生,按分数降序排列。
16. 按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩
-- 按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩
select a.*,b.avg_score from
SC as a
join
(select
Sid,
avg(score) as avg_score
from
SC
group by Sid) as b
on a.SId=b.SId
order by b.avg_score desc;
此查询通过计算每个学生的平均成绩,并按平均成绩降序排列显示所有学生的所有课程成绩。
17. 查询各科成绩最高分、最低分和平均分
-- 查询各科成绩最高分、最低分和平均分
select
CId,
max(score) as max_score,
min(score) as min_score,
avg(score) as avg_score,
round(count(case when score >=60 then 1 else null end) / count(1) *100,2) as pass_rate,
round(count(case when score >=70 and score<80 then 1 else null end) / count(1) *100,2) as average_rate,
round(count(case when score >=80 and score<90 then 1 else null end) / count(1) *100,2) as good_rate,
round(count(case when score >=90 then 1 else null end) / count(1) *100,2) as excellent_rate
from
SC
group by
CId
order by count(1) desc ,CId asc;
此查询通过计算每门课程的最高分、最低分、平均分以及及格率、中等率、优良率和优秀率,按选修人数降序排列。
18. 按各科平均成绩进行排序,并显示排名,Score重复时保留名次空缺
-- 按各科平均成绩进行排序,并显示排名,Score重复时保留名次空缺
SELECT @i:=0;
select Cid,avg(score) as avg_score ,(@i:=@i+1) from
SC
group by
Cid
order by avg_score;
此查询通过使用变量@i来为每个科目的平均成绩进行排名,当有相同的平均成绩时,保留名次空缺。
19. 按各科平均成绩进行排序,并显示排名,Score重复时不保留名次空缺
-- 按各科平均成绩进行排序,并显示排名,Score重复时不保留名次空缺
select Cid,avg(score) as avg_score ,(@i:=@i+1) from
SC,
(SELECT @i:=0) AS j
group by
Cid
order by avg_score;
此查询通过使用变量@i来为每个科目的平均成绩进行排名,当有相同的平均成绩时,不保留名次空缺。
20. 查询学生的总成绩,并进行排名,总分重复时保留名次空缺
-- 查询学生的总成绩,并进行排名,总分重复时保留名次空缺
select a.*,(@i:=@i+1) as rank from
(
select SId,sum(score) as sum_score from
SC
group by
SId
order by sum_score desc
) as a,
(SELECT @i:=0) AS j
此查询通过计算每个学生的总成绩,并使用变量@i进行排名,当有相同的总成绩时,保留名次空缺。
21. 查询学生的总成绩,并进行排名,总分重复时不保留名次空缺
-- 查询学生的总成绩,并进行排名,总分重复时不保留名次空缺
select a.*,(@i:=@i+1) as rank from
(
select SId,sum(score) as sum_score from
SC
group by
SId
order by sum_score desc
) as a,
(SELECT @i:=0) AS j
此查询通过计算每个学生的总成绩,并使用变量@i进行排名,当有相同的总成绩时,不保留名次空缺。
22. 统计各科成绩各分数段人数:课程编号,课程名称,[100-85],[85-70],[70-60],[60-0]及所占百分比
-- 统计各科成绩各分数段人数及所占百分比
select a.*,a.num / b.num * 100 as p from
(select
CId,
case
when score >= 0 and score <=60 then '[0-60]'
when score > 60 and score <=70 then '[60-70]'
when score > 70 and score <=85 then '[70-85]'
else '[85-100]' end as flow,
count(1) as num
from
SC
group by
Cid,
case
when score >= 0 and score <=60 then '[0-60]'
when score > 60 and score <=70 then '[60-70]'
when score > 70 and score <=85 then '[70-85]'
else '[85-100]' end
) as a
join
(select Cid,count(1) as num from
SC
group by Cid
) as b
此查询统计了每个课程在不同分数段的学生人数,并计算了每个分数段所占的百分比。
23. 查询各科成绩前三名的记录
-- 查询各科成绩前三名的记录
(select * from
SC
where CId='01'
order by score desc
limit 3)
union all
(select * from
SC
where CId='02'
order by score desc
limit 3)
union all
(select * from
SC
where CId='03'
order by score desc
limit 3)
此查询通过使用union all合并了每个课程成绩前三名的记录,显示了各科成绩前三的学生信息。
24. 查询每门课程被选修的学生数
-- 查询每门课程被选修的学生数
select Cid,count(1) as num from
SC
group by CId
此查询通过分组和计数,统计了每门课程被选修的学生数量。
25. 查询只选修两门课程的学生学号和姓名
-- 查询只选修两门课程的学生学号和姓名
select a.Sid,a.SName from
Student as a
join
(select SId,count(1) as num from
SC
group by SId
having num = 2
) as b
on a.Sid=b.Sid
此查询通过连接学生表和成绩表,并使用having子句筛选出只选修两门课程的学生。
26. 查询男生女生人数
-- 查询男生女生人数
select SSex,count(1) as num from
Student
group by
SSex
此查询通过分组和计数,统计了男生和女生的人数。
27. 查询名字中含有“风”字的学生信息
-- 查询名字中含有“风”字的学生信息
select * from
Student
where
Sname like '%风%'
此查询通过使用like语句,找出了名字中含有“风”字的学生信息。
28. 查询同名同性学生名单,并统计同名人数
-- 查询同名同性学生名单,并统计同名人数
select distinct a.* from
Student as a
join
Student as b
on a.SName=b.Sname and a.SId!=b.SId
select count(distinct a.SId) as num from
Student as a
join
Student as b
on a.SName=b.Sname and a.SId!=b.SId;
此查询通过自连接学生表,找出了同名同性的学生,并统计了同名的人数。
29. 查询1990年出生的学生名单
-- 查询1990年出生的学生名单
select * from Student where year(Sage)='1990';
select * from Student where substring(Sage,1,4)='1990';
此查询通过提取出生日期的年份,找出了1990年出生的学生。
30. 查询每门课程的平均成绩,结果按平均成绩降序排列,平均成绩相同时,按课程编号升序排列
-- 查询每门课程的平均成绩
select CId,avg(score) as avg_score from
SC
group by CId
order by avg_score desc,Cid asc
此查询通过计算每门课程的平均成绩,并按平均成绩降序排列,若平均成绩相同,则按课程编号升序排列。
31. 查询平均成绩大于等于85的所有学生的学号、姓名和平均成绩
-- 查询平均成绩大于等于85的所有学生的学号、姓名和平均成绩
select a.SId,b.SName,avg(score) as avg_score from
SC as a
join
Student as b
on a.Sid=b.Sid
group by
a.SId,b.SName
having avg_score >= 85;
此查询通过连接学生表和成绩表,计算了每个学生的平均成绩,并筛选出平均成绩大于等于85的学生。
32. 查询课程名称为「数学」,且分数低于 60 的学生姓名和分数
-- 查询课程名称为「数学」,且分数低于 60 的学生姓名和分数
select b.Sname, a.score from
SC as a
join
Student as b
on a.Sid = b.Sid
where Cid = (select Cid from Course where CName = '数学')
and score < 60;
此查询通过连接学生表和成绩表,并筛选出课程名称为「数学」且分数低于60分的学生姓名和分数。
33. 查询所有学生的课程及分数情况(存在学生没成绩,没选课的情况)
-- 查询所有学生的课程及分数情况(包括没有成绩和未选课的学生)
select * from
Student as a
left join
SC as b
on a.Sid = b.Sid;
此查询通过左连接学生表和成绩表,显示了所有学生的课程及分数情况,包括那些没有成绩或没有选课的学生。
34. 查询任何一门课程成绩在 70 分以上的姓名、课程名称和分数
-- 查询任何一门课程成绩在 70 分以上的姓名、课程名称和分数
select a.SName, c.Cname, b.score from
Student as a
join
SC as b
on a.SId = b.SId
join
Course as c
on b.Cid = c.Cid
where b.score > 70;
此查询通过连接学生表、成绩表和课程表,找出了任何一门课程成绩在70分以上的学生的姓名、课程名称和分数。
35. 查询不及格的课程
-- 查询不及格的课程
select * from
SC
where score < 60;
此查询通过简单的筛选条件,找出了所有不及格的课程记录。
36. 查询课程编号为 01 且课程成绩在 80 分以上的学生的学号和姓名
-- 查询课程编号为 01 且课程成绩在 80 分以上的学生的学号和姓名
select a.Sid, b.Sname, a.score from
SC as a
join
Student as b
on a.Sid = b.Sid
where CId = '01' and score >= 80;
此查询通过连接学生表和成绩表,并筛选出课程编号为01且成绩在80分以上的学生的学号和姓名。
37. 求每门课程的学生人数
-- 求每门课程的学生人数
select CId, count(1) as num from
SC
group by CId;
此查询通过分组和计数,统计了每门课程的学生人数。
38. 成绩不重复的情况下,查询选修「张三」老师所授课程的学生中,成绩最高的学生信息及其成绩
-- 成绩不重复的情况下,查询选修「张三」老师所授课程的学生中,成绩最高的学生信息及其成绩
select * from
Student as a
join
(
select * from
SC
where Cid in(
select Cid from
Course
where Tid = (select TId from Teacher where Tname = '张三')
)
and score = (select max(score) from SC where Cid in (select Cid from Course where Tid = (select TId from Teacher where Tname = '张三')))
) as b
on a.Sid = b.Sid;
此查询通过连接学生表和成绩表,并筛选出选修「张三」老师所授课程中成绩最高的学生信息及其成绩,假设成绩不重复。
39. 成绩有重复的情况下,查询选修「张三」老师所授课程的学生中,成绩最高的学生信息及其成绩
-- 成绩有重复的情况下,查询选修「张三」老师所授课程的学生中,成绩最高的学生信息及其成绩
select * from
Student as a
join
(
select SId from
SC
where Cid in (
select Cid from
Course
where Tid = (select TId from Teacher where Tname = '张三')
)
group by SId
having max(score) = (select max(score) from SC where Cid in (select Cid from Course where Tid = (select TId from Teacher where Tname = '张三')))
) as b
on a.Sid = b.Sid;
此查询在考虑成绩可能有重复的情况下,找出了选修「张三」老师所授课程中成绩最高的学生信息及其成绩。
40. 查询不同课程成绩相同的学生的学生编号、课程编号、学生成绩
-- 查询不同课程成绩相同的学生的学生编号、课程编号、学生成绩
select a.* from
SC as a,
SC as b
where a.Sid != b.Sid and a.CId != b.CId and a.score = b.score;
此查询通过自连接成绩表,找出了不同课程但成绩相同的学生的学生编号、课程编号和学生成绩。
41. 查询每门课程成绩最好的前两名
-- 查询每门课程成绩最好的前两名
(select * from
SC
where CId='01'
order by score desc
limit 2)
union all
(select * from
SC
where CId='02'
order by score desc
limit 2)
union all
(select * from
SC
where CId='03'
order by score desc
limit 2);
此查询通过分别查询每门课程成绩最好的前两名,然后使用union all合并结果。
42. 统计每门课程的学生选修人数(超过 5 门的课程才统计)
-- 统计每门课程的学生选修人数(超过 5 门的课程才统计)
select Cid, count(1) as num from
SC
group by Cid
having num > 5;
此查询通过分组和计数,统计了每门课程的学生选修人数,只显示超过5门的课程。
43. 检索至少选修两门课程的学生学号
-- 检索至少选修两门课程的学生学号
select SId, count(1) as num from
SC
group by SId
having num >= 2;
此查询通过分组和计数,找出了至少选修两门课程的学生学号。
44. 查询选修了全部课程的学生信息
-- 查询选修了全部课程的学生信息
select SId, count(1) as num from
SC
group by SId
having num = (select count(1) from Course);
此查询通过比较学生选修课程数和总课程数,找出了选修了全部课程的学生。
45. 查询各学生的年龄,只按年份来算
-- 查询各学生的年龄,只按年份来算
select *, year(now()) - year(Sage) as age from
Student;
此查询通过计算当前年份和学生出生年份的差值,得出学生的岁数。
46. 查询各学生的年龄,按照出生日期来算,当前月份 < 出生年月的月日则,年龄减一
-- 查询各学生的年龄,按照出生日期来算,当前月份 < 出生年月的月日则,年龄减一
select
*,
year(now()) - year(Sage) as age,
case when date_format(now(),'%m-%d') < date_format(Sage,'%m-%d') then year(now()) - year(Sage) - 1 else year(now()) - year(Sage) end as age
from
Student;
此查询通过比较当前日期和出生日期,准确计算出学生的年龄。
47. 查询本周过生日的学生
-- 查询本周过生日的学生
select * from
Student
where week(concat(year(now()),'-',date_format(Sage,'%m-%d'))) = week(now());
此查询通过计算学生出生日期和当前日期的周数,找出本周过生日的学生。
48. 查询下周过生日的学生
-- 查询下周过生日的学生
select *from
Student
where week(concat(year(now()),'-',date_format(Sage,'%m-%d'))) = week(now()) + 1;
此查询通过计算学生出生日期和当前日期的周数,找出下周过生日的学生。
49. 查询本月过生日的学生
-- 查询本月过生日的学生
select *from
Student
where month(concat(year(now()),'-',date_format(Sage,'%m-%d'))) = month(now());
此查询通过计算学生出生日期和当前日期的月份,找出本月过生日的学生。
50. 查询下个月过生日的学生
select *from
Student
where month(concat(year(now()),'-',date_format(Sage,'%m-%d')))=month(now()) +1;

3497

被折叠的 条评论
为什么被折叠?



