MySQL数据库练习-1

查询" 01 "课程比" 02 "课程成绩高的学生的信息及课程分数


分析: 题目中可以看出涉及到课程成绩,学生信息,因此只需要从Student学生表和SC成绩表入手.这道题的难点在于,学生的成绩表上包含了01,02,03等课程的成绩,在同一张表上面怎么比较?当然是把它们拆出来,我们可以把SC表中学生的01课程信息全部拿出来,放在一个新表t1,t1中有字段SId和新字段class1,这里的class1是学生01课程的成绩;然后跟上一步一样提取SC中的02课程信息组成新表t2,t2中字段是SId和class2.之后select两张新表01课程成绩大于02课程成绩的人,最后接在Student表右边.

Student表

+------+--------+---------------------+------+
| 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 | 女   |
| 06   | 吴兰   | 1992-01-01 00:00:00 | 女   |
| 07   | 郑竹   | 1989-01-01 00:00:00 | 女   |
| 09   | 张三   | 2017-12-20 00:00:00 | 女   |
| 10   | 李四   | 2017-12-25 00:00:00 | 女   |
| 11   | 李四   | 2012-06-06 00:00:00 | 女   |
| 12   | 赵六   | 2013-06-13 00:00:00 | 女   |
| 13   | 孙七   | 2014-06-01 00:00:00 | 女   |
+------+--------+---------------------+------+

sc表

+------+------+-------+
| SId  | CId  | score |
+------+------+-------+
| 01   | 01   |  80.0 |
| 01   | 02   |  90.0 |
| 01   | 03   |  99.0 |
| 02   | 01   |  70.0 |
| 02   | 02   |  60.0 |
| 02   | 03   |  80.0 |
| 03   | 01   |  80.0 |
| 03   | 02   |  80.0 |
| 03   | 03   |  80.0 |
| 04   | 01   |  50.0 |
| 04   | 02   |  30.0 |
| 04   | 03   |  20.0 |
| 05   | 01   |  76.0 |
| 05   | 02   |  87.0 |
| 06   | 01   |  31.0 |
| 06   | 03   |  34.0 |
| 07   | 02   |  89.0 |
| 07   | 03   |  98.0 |
+------+------+-------+

构建新表t1

select SId,score as class1 from sc where sc.CId='01';

t1的查询结果:

+------+--------+
| SId  | class1 |
+------+--------+
| 01   |   80.0 |
| 02   |   70.0 |
| 03   |   80.0 |
| 04   |   50.0 |
| 05   |   76.0 |
| 06   |   31.0 |
+------+--------+

构建新表t2

select SId,score as class2 from sc where sc.CId='02';

t2查询结果:

+------+--------+
| SId  | class2 |
+------+--------+
| 01   |   90.0 |
| 02   |   60.0 |
| 03   |   80.0 |
| 04   |   30.0 |
| 05   |   87.0 |
| 07   |   89.0 |
+------+--------+

筛选01课程成绩大于02课程成绩的学生

select t1.SId, class1, class2 from
          (select SId, score as class1 from sc where sc.CId = '01')as t1, 
          (select SId, score as class2 from sc where sc.CId = '02')as t2
where t1.SId = t2.SId AND t1.class1 > t2.class2;

查询结果:

+------+--------+--------+
| SId  | class1 | class2 |
+------+--------+--------+
| 02   |   70.0 |   60.0 |
| 04   |   50.0 |   30.0 |
+------+--------+--------+

那接下来就简单了,直接查询Student表02,04学生的学生信息,然后把class1和class2接在后边就行,我们可以把上一步查询的结果命名为r表

select * from Student RIGHT JOIN (
    select t1.SId, class1, class2 from
          (select SId, score as class1 from sc where sc.CId = '01')as t1, 
          (select SId, score as class2 from sc where sc.CId = '02')as t2
    where t1.SId = t2.SId AND t1.class1 > t2.class2
)r 
on Student.SId = r.SId;

最终结果:

+------+--------+---------------------+------+------+--------+--------+
| SId  | Sname  | Sage                | Ssex | SId  | class1 | class2 |
+------+--------+---------------------+------+------+--------+--------+
| 02   | 钱电   | 1990-12-21 00:00:00 | 男   | 02   |   70.0 |   60.0 |
| 04   | 李云   | 1990-12-06 00:00:00 | 男   | 04   |   50.0 |   30.0 |
+------+--------+---------------------+------+------+--------+--------+

以上

猜你喜欢

转载自www.cnblogs.com/lattesea/p/12159301.html