0
点赞
收藏
分享

微信扫一扫

学习Mysql的第三天

水墨_青花 2022-03-12 阅读 98

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)
举报

相关推荐

0 条评论