3.查询存在" 01 “课程但可能不存在” 02 "课程的情况(不存在时显示为 null )
mysql> select t1.SId
-> ,t2.SId
-> from
-> (
-> select SId
-> from SC
-> where CId = '01'
-> )t1
-> left join
-> (
-> select SId
-> from SC
-> where CId ='02'
-> )t2
-> on t1.SId=t2.SId;
+------+------+
| SId | SId |
+------+------+
| 01 | 01 |
| 02 | 02 |
| 03 | 03 |
| 04 | 04 |
| 05 | 05 |
| 06 | NULL |
+------+------+
6 rows in set (0.01 sec)
4.查询不存在" 01 “课程但存在” 02 "课程的情况
mysql> select t1.SId
-> ,t2.SId
-> from
-> (
-> select SId
-> from SC
-> where CId='01'
-> )t1
-> right join
-> (
-> select SId
-> from SC
-> where CId ='02'
-> )t2
-> on t1.SId= t2.SId;
+------+------+
| SId | SId |
+------+------+
| 01 | 01 |
| 02 | 02 |
| 03 | 03 |
| 04 | 04 |
| 05 | 05 |
| NULL | 07 |
+------+------+
6 rows in set (0.00 sec)
5.查询平均成绩⼤于等于 60 分的同学的学⽣编号和学⽣姓名和平均成绩
mysql> select t1.SId
-> ,t1.avg_score
-> ,t2.SName
-> from(
-> select SId
-> ,avg(score) as avg_score
-> from SC
-> group by SId
-> having avg_score>=60
-> )t1
-> left join
-> Student t2
-> on t1.SId = t2.SId;
+------+-----------+--------+
| SId | avg_score | SName |
+------+-----------+--------+
| 01 | 89.66667 | 赵雷 |
| 02 | 70.00000 | 钱电 |
| 03 | 80.00000 | 孙风 |
| 05 | 81.50000 | 周梅 |
| 07 | 93.50000 | 郑竹 |
+------+-----------+--------+
5 rows in set (0.00 sec)
6.查询在 SC 表存在成绩的学⽣信息
mysql> select SId
-> ,SName
-> from Student
-> where SId in
-> (
-> select distinct SId
-> from SC
-> );
+------+--------+
| SId | SName |
+------+--------+
| 01 | 赵雷 |
| 02 | 钱电 |
| 03 | 孙风 |
| 04 | 李云 |
| 05 | 周梅 |
| 06 | 吴兰 |
| 07 | 郑竹 |
+------+--------+
7 rows in set (0.00 sec)
7.查询所有同学的学⽣编号、学⽣姓名、选课总数、所有课程的总成绩(没成绩的显示为 null )
mysql> select t1.SId
-> ,t1.Sname
-> ,t2.ccnt
-> ,t2.sum_score
-> from Student t1
-> left join(
-> select SId
-> ,count(CId) ccnt
-> ,sum(score) sum_score
-> from SC
-> group by SId
-> ) t2
-> on t1.SId=t2.SId;
+------+--------+------+-----------+
| SId | Sname | ccnt | sum_score |
+------+--------+------+-----------+
| 01 | 赵雷 | 3 | 269.0 |
| 02 | 钱电 | 3 | 210.0 |
| 03 | 孙风 | 3 | 240.0 |
| 04 | 李云 | 3 | 100.0 |
| 05 | 周梅 | 2 | 163.0 |
| 06 | 吴兰 | 2 | 65.0 |
| 07 | 郑竹 | 2 | 187.0 |
| 09 | 张三 | NULL | NULL |
| 10 | 李四 | NULL | NULL |
| 11 | 李四 | NULL | NULL |
| 12 | 赵六 | NULL | NULL |
| 13 | 孙七 | NULL | NULL |
+------+--------+------+-----------+
12 rows in set (0.00 sec)
8.查询「李」姓⽼师的数量
mysql> select '姓李' as col1
-> ,count(*) as cnt
-> from Teacher
-> where Tname like '李%';
+--------+-----+
| col1 | cnt |
+--------+-----+
| 姓李 | 1 |
+--------+-----+
1 row in set (0.00 sec)
9.查询学过「张三」⽼师授课的同学的信息
方法一:
mysql> select t1.SId
-> ,t2.Sname
-> ,t2.Sage
-> ,t2.Ssex
-> from
-> (
-> select SId
-> from SC t1
-> where CId =
-> (
-> select CId
-> from Course
-> where TId =
-> (
-> select TId
-> from Teacher
-> where Tname = '张三'
-> )
-> )
-> )t1
-> left join
-> Student t2
-> on t1.SId = t2.SId;
+------+--------+---------------------+------+
| SId | Sname | Sage | Ssex |
+------+--------+---------------------+------+
| 01 | 赵雷 | 1990-01-01 00:00:00 | 男 |
| 02 | 钱电 | 1990-12-21 00:00:00 | 男 |
| 03 | 孙风 | 1990-12-20 00:00:00 | 男 |
| 04 | 李云 | 1990-12-06 00:00:00 | 男 |
| 05 | 周梅 | 1991-12-01 00:00:00 | 女 |
| 07 | 郑竹 | 1989-01-01 00:00:00 | 女 |
+------+--------+---------------------+------+
6 rows in set (0.00 sec)
方法二:
mysql> select SId
-> ,Sname
-> ,Sage
-> ,Ssex
-> from Student
-> where SId in
-> (
-> select SId
-> from SC t1
-> where CId =
-> (
-> select CId
-> from Course
-> where TId =
-> (
-> select TId
-> from Teacher
-> where Tname = '张三'
-> )
-> )
-> );
+------+--------+---------------------+------+
| SId | Sname | Sage | Ssex |
+------+--------+---------------------+------+
| 01 | 赵雷 | 1990-01-01 00:00:00 | 男 |
| 02 | 钱电 | 1990-12-21 00:00:00 | 男 |
| 03 | 孙风 | 1990-12-20 00:00:00 | 男 |
| 04 | 李云 | 1990-12-06 00:00:00 | 男 |
| 05 | 周梅 | 1991-12-01 00:00:00 | 女 |
| 07 | 郑竹 | 1989-01-01 00:00:00 | 女 |
+------+--------+---------------------+------+
6 rows in set (0.00 sec)
10.查询没有学全所有课程的同学的信息
mysql> select SId
-> ,Sname
-> from Student
-> where SId not in
-> (
-> select SId
-> from
-> (
-> select SId
-> ,count(CId) as cnt
-> from SC
-> group by SId
-> having cnt =
-> (
-> select count(CId)
-> from Course
-> )
-> )t1
-> );
+------+--------+
| SId | Sname |
+------+--------+
| 05 | 周梅 |
| 06 | 吴兰 |
| 07 | 郑竹 |
| 09 | 张三 |
| 10 | 李四 |
| 11 | 李四 |
| 12 | 赵六 |
| 13 | 孙七 |
+------+--------+
8 rows in set (0.00 sec)
11.查询⾄少有⼀⻔课与学号为" 01 "的同学所学相同的同学的信息
mysql> select SId
-> ,Sname
-> from Student
-> where SId in
-> (
-> select distinct SId
-> from SC
-> where SId !='01'
-> and CId in
-> (
-> select CId
-> from SC
-> where SId ='01'
-> )
-> );
+------+--------+
| SId | Sname |
+------+--------+
| 02 | 钱电 |
| 03 | 孙风 |
| 04 | 李云 |
| 05 | 周梅 |
| 06 | 吴兰 |
| 07 | 郑竹 |
+------+--------+
6 rows in set (0.00 sec)
12.查询和" 01 "号的同学学习的课程 完全相同的其他同学的信息
mysql> select SId
-> ,Sname
-> from Student
-> where SId in
-> (
-> select t1.SId
-> from
-> (
-> select SId
-> ,count(CId) as cnt
-> from SC
-> where SId !='01'
-> and CId in
-> (
-> select CId
-> from SC
-> where SId ='01'
-> )group by SId
-> having cnt =
-> (
-> select count(CId)
-> from SC
-> where SId='01'
-> )
-> )t1
-> join
-> (
-> select SId
-> ,count(CId) as cnt
-> from SC
-> where SId !='01'
-> group by SId
-> ) t2
-> on t1.SId =t2.SId and t1.cnt=t2.cnt
-> );
+------+--------+
| SId | Sname |
+------+--------+
| 02 | 钱电 |
| 03 | 孙风 |
| 04 | 李云 |
+------+--------+
3 rows in set (0.00 sec)
13.查询没学过"张三"⽼师讲授的任⼀⻔课程的学⽣姓名
mysql> select SId
-> ,Sname
-> from Student
-> where SId not in
-> (
-> select distinct SId
-> from SC
-> where CId in
-> (
-> select CId
-> from Course
-> where TId in
-> (
-> select TId
-> from Teacher
-> where Tname ='张三'
-> )
-> )
-> );
+------+--------+
| SId | Sname |
+------+--------+
| 06 | 吴兰 |
| 09 | 张三 |
| 10 | 李四 |
| 11 | 李四 |
| 12 | 赵六 |
| 13 | 孙七 |
+------+--------+
6 rows in set (0.00 sec)
14.查询两⻔及其以上不及格课程的同学的学号,姓名及其平均成绩
mysql> select t1.SId
-> ,t2.Sname
-> ,t1.avg_score
-> from
-> (
-> select SId
-> ,count(CId) as cnt
-> ,avg(score) as avg_score
-> from SC
-> where score <60
-> group by SId
-> having cnt>=2
-> )t1
-> left join
-> Student t2
-> on t1.SId =t2.SId;
+------+--------+-----------+
| SId | Sname | avg_score |
+------+--------+-----------+
| 04 | 李云 | 33.33333 |
| 06 | 吴兰 | 32.50000 |
+------+--------+-----------+
2 rows in set (0.00 sec)
15.检索" 01 "课程分数⼩于 60,按分数降序排列的学⽣信息
mysql> select t1.SId
-> ,t2.Sname
-> ,t1.score
-> from
-> (
-> select SId
-> ,score
-> from SC
-> where CId ='01'
-> and score<60
-> )t1
-> left join
-> Student t2
-> on t1.SId =t2.SId
-> order by t1.score desc;
+------+--------+-------+
| SId | Sname | score |
+------+--------+-------+
| 04 | 李云 | 50.0 |
| 06 | 吴兰 | 31.0 |
+------+--------+-------+
2 rows in set (0.00 sec)
16.按平均成绩从⾼到低显示所有学⽣的所有课程的成绩以及平均成绩
mysql> select t1.SId
-> ,t1.CId
-> ,t1.score
-> ,t2.avg_score
-> from SC t1
-> left join
-> (
-> select SId
-> ,round(avg(score),2) as avg_score
-> from SC
-> group by SId
-> )t2
-> on t1.SId =t2.SId
-> order by t2.avg_score desc;
+------+------+-------+-----------+
| SId | CId | score | avg_score |
+------+------+-------+-----------+
| 07 | 03 | 98.0 | 93.50 |
| 07 | 02 | 89.0 | 93.50 |
| 01 | 03 | 99.0 | 89.67 |
| 01 | 01 | 80.0 | 89.67 |
| 01 | 02 | 90.0 | 89.67 |
| 05 | 01 | 76.0 | 81.50 |
| 05 | 02 | 87.0 | 81.50 |
| 03 | 02 | 80.0 | 80.00 |
| 03 | 03 | 80.0 | 80.00 |
| 03 | 01 | 80.0 | 80.00 |
| 02 | 03 | 80.0 | 70.00 |
| 02 | 01 | 70.0 | 70.00 |
| 02 | 02 | 60.0 | 70.00 |
| 04 | 02 | 30.0 | 33.33 |
| 04 | 03 | 20.0 | 33.33 |
| 04 | 01 | 50.0 | 33.33 |
| 06 | 03 | 34.0 | 32.50 |
| 06 | 01 | 31.0 | 32.50 |
+------+------+-------+-----------+
18 rows in set (0.00 sec)
17.查询各科成绩最⾼分、最低分和平均分: 以如下形式显示:课程 ID,课程 name,最⾼分,最低分,平均分,及格率,中等率,优良率,优秀率 及格为>=60,中等为:70-80,优良为:80-90,优秀为:>=90要求输出课程号和选修⼈数,查询结果按⼈数降序排列,若⼈数相同,按课程号升序排列
mysql> select CId
-> , max(score) as max_score
-> ,min(score) as min_score
-> ,avg(score) as avg_score
-> ,concat(round(sum(if(score>=60,1,0))*100/count(SId),2),'%') as pass_percent
-> ,concat(round(sum(if(score>=70 and score <80,1,0))*100/count(SId),2),'%') as med_percent
-> ,concat(round(sum(if(score>=80 and score <90,1,0))*100/count(SId),2),'%') as good_percent
-> ,concat(round(sum(if(score>=90,1,0))*100/count(SId),2),'%') as best_percent
-> ,count(SId) as cnt
-> from SC
-> group by CId
-> order by cnt desc,CId;
+------+-----------+-----------+-----------+--------------+-------------+--------------+--------------+-----+
| CId | max_score | min_score | avg_score | pass_percent | med_percent | good_percent | best_percent | cnt |
+------+-----------+-----------+-----------+--------------+-------------+--------------+--------------+-----+
| 01 | 80.0 | 31.0 | 64.50000 | 66.67% | 33.33% | 33.33% | 0.00% | 6 |
| 02 | 90.0 | 30.0 | 72.66667 | 83.33% | 0.00% | 50.00% | 16.67% | 6 |
| 03 | 99.0 | 20.0 | 68.50000 | 66.67% | 0.00% | 33.33% | 33.33% | 6 |
+------+-----------+-----------+-----------+--------------+-------------+--------------+--------------+-----+
3 rows in set (0.00 sec)
18.按各科平均成绩进⾏排序,并显示排名, Score 重复时保留名次空缺(1 2 2 4 5 6 )
set @i :=0;
set @j=0;
set @avg_score_front :=0;
set @avg_score_last :=0;
mysql> select tt1.CId
-> ,tt1.avg_score
-> ,tt1.dense_rk
-> from
-> (
-> select t1.CId
-> ,t1.avg_score
-> ,@j :=@j+1
-> ,@avg_score_front := t1.avg_score
-> ,if(@avg_score_front = @avg_score_last , @i,@i :=@j) as dense_rk
-> ,@avg_score_last :=@avg_score_front
->
-> from
-> (
-> select CId
-> ,round(avg(score),2) as avg_score
-> from SC
-> group by CId
-> order by avg_score desc
-> )t1
-> )tt1;
+------+-----------+----------+
| CId | avg_score | dense_rk |
+------+-----------+----------+
| 02 | 72.67 | 1 |
| 03 | 68.50 | 2 |
| 01 | 64.50 | 3 |
+------+-----------+----------+
3 rows in set (0.01 sec)
19.按各科平均成绩进⾏排序,并显示排名, Score 重复时不保留名次空缺(1 2 2 3 4 5 6 )
set @i :=0;
set @avg_score_front :=0;
set @avg_score_last :=0;
mysql> select tt1.CId
-> ,tt1.avg_score
-> ,tt1.dense_rk
-> from
-> (
-> select t1.CId
-> ,t1. avg_score
-> ,@avg_score_front := t1.avg_score
-> ,if(@avg_score_front = @avg_score_last,@i , @i := @i+1) as dense_rk
-> ,@avg_score_last := @avg_score_front
-> from
-> (
-> select CId
-> ,round(avg(score),2) as avg_score
-> from SC
-> group by CId
-> order by avg_score desc
-> )t1
-> )tt1;
+------+-----------+----------+
| CId | avg_score | dense_rk |
+------+-----------+----------+
| 02 | 72.67 | 1 |
| 03 | 68.50 | 2 |
| 01 | 64.50 | 3 |
+------+-----------+----------+
3 rows in set (0.00 sec)
20.查询学⽣的总成绩,并进⾏排名,总分重复时保留名次空缺
set @i :=0;
set @j :=0;
set @sum_score_front :=0;
set @sum_score_last :=0;
select tt1.SId
,tt1.sum_score
,tt1.dense_rk
from
(
select t1.SId
,t1.sum_score
,@j :=@j+1
,@sum_score_front := t1.sum_score
,if(@sum_score_front=@sum_score_last,@i,@i :=@j) as dense_rk
,@sum_score_last :=@sum_score_front
from
(
select SId
,sum(score) as sum_score
from SC
group by SId
order by sum_score desc
)t1
)tt1;
+------+-----------+----------+
| SId | sum_score | dense_rk |
+------+-----------+----------+
| 01 | 269.0 | 1 |
| 03 | 240.0 | 2 |
| 02 | 210.0 | 3 |
| 07 | 187.0 | 4 |
| 05 | 163.0 | 5 |
| 04 | 100.0 | 6 |
| 06 | 65.0 | 7 |
+------+-----------+----------+
7 rows in set (0.00 sec)
21.查询学⽣的总成绩,并进⾏排名,总分重复时不保留名次空缺
set @i :=0;
set @sum_score_front :=0;
set @sum_score_last :=0;
mysql> select tt1.SId
-> ,tt1.sum_score
-> ,tt1.dense_rk
-> from
-> (
-> select t1.SId
-> ,t1.sum_score
-> ,@sum_score_front := t1.sum_score
-> ,if(@sum_score_front=@sum_score_last,@i,@i :=@i+1) as dense_rk
-> ,@sum_score_last :=@sum_score_front
-> from
-> (
-> select SId
-> ,sum(score) as sum_score
-> from SC
-> group by SId
-> order by sum_score desc
-> )t1
-> )tt1;
+------+-----------+----------+
| SId | sum_score | dense_rk |
+------+-----------+----------+
| 01 | 269.0 | 1 |
| 03 | 240.0 | 2 |
| 02 | 210.0 | 3 |
| 07 | 187.0 | 4 |
| 05 | 163.0 | 5 |
| 04 | 100.0 | 6 |
| 06 | 65.0 | 7 |
+------+-----------+----------+
7 rows in set (0.00 sec)