SQL查询小练习 - 001
今天群里有个人问了下面一个问题,我看很经典就写了一下。
表名:成绩表 (其他用户实验的记录大家可自行插入)
姓名 | 课程 | 分数 |
---|---|---|
张三 | 语文 | 81 |
张三 | 数学 | 75 |
李四 | 语文 | 56 |
李四 | 数学 | 90 |
王五 | 语文 | 81 |
王五 | 数学 | 100 |
王五 | 英语 | 49 |
… | … | … |
问题:
1. 给出成绩全部合格的学生信息,包含姓名、课程、分数(注:分数在60以上评为合格 请查询出合格的信息)。
2. 查询出数学的最高分的信息,包含姓名、课程、分数。
我自己写的答案,没有实际执行过,不过我个人认为应该不会出错。
select *
from t2
where 姓名 not in (select distinct 姓名
from t1
where t1.分数 <= 60 );
select *
from tables t1
where t1.课程='数学' and t1.分数 = (select max(t2.分数)
from tables t2
where t2.课程='数学') ;
数据库表tab_b有如下记录
id | name | num |
---|---|---|
1 | ‘数学’ | 90 |
2 | ‘数学’ | 91 |
3 | ‘数学’ | 80 |
4 | ‘数学’ | 92 |
5 | ‘物理’ | 80 |
6 | ‘物理’ | 79 |
7 | ‘物理’ | 82 |
8 | ‘物理’ | 70 |
… | … | … |
问题:
请将每种name中num前2名的记录找出来,并按num倒排序
select *
from (select row_number() over(partition by name order by num desc) rn,
a.*
from test4 a)
where rn <= 2;