经常会有查询数据库最大的记录或者前N条记录,根据某个字段分组。自己整理如下。
数据如下:
id kc xh score
------ ------ ------ --------
1 语文 0023 70
2 语文 0024 76
3 语文 0025 68
4 数学 0023 15
5 数学 0024 68
6 数学 0025 95
7 数学 0026 73
8 英语 0023 77
9 英语 0024 69
10 英语 0025 12
11 英语 0026 54
12 语文 0026 34
13 物理 0023 99
14 化学 0023 89
1、 要求查询分数最大的几个方法。结果如下:
id kc xh score
------ ------ ------ --------
2 语文 0024 76
6 数学 0025 95
8 英语 0023 77
13 物理 0023 99
14 化学 0023 89
一、排除法
SELECT * FROM s_score a WHERE NOT EXISTS (SELECT 1 FROM s_score b WHERE a.kc=b.kc AND a.score<b.score);
这个是用到exists,也是最容易想到的。
二、内连接分组法
SELECT a.* FROM s_score a INNER JOIN (SELECT MAX(score) score,kc FROM s_score GROUP BY kc) b ON a.kc=b.kc AND a.score=b.score;
这个则是先查询出每科最多的分数,然后内连接关联找出
三、临时表分组法
SELECT * FROM (SELECT * FROM s_score ORDER BY score DESC ) t GROUP BY kc;
这个也很简单,先排序,再分组。
2、要求分数在前2名的学科和学号,结果如下
id kc xh score
------ ------ ------ --------
14 化学 0023 89
6 数学 0025 95
7 数学 0026 73
13 物理 0023 99
8 英语 0023 77
9 英语 0024 69
2 语文 0024 76
1 语文 0023 70
一、左连接having排除法
SELECT a.* FROM s_score a LEFT JOIN s_score b ON a.kc=b.kc AND a.score<b.score GROUP BY a.id,a.kc,a.xh,a.score HAVING COUNT(b.id)<2 ORDER BY a.kc,a.score DESC;
这个要先理解,理解了还是挺容易的。a会跟b的每一条比较,找处a分数小于b的,那只有第二名的分数小于第一名,然后第一名是不会小于b表中任何记录的。但是是左连接,所以结果就是前两面的记录了。
二、count排除法
SELECT * FROM s_score a WHERE 2>(SELECT COUNT(*) FROM s_score b WHERE a.kc=b.kc AND a.score<b.score) ORDER BY a.kc,a.score DESC;
这个原因和上面的差不多。count小于2,会有0和1,为0的情况是a中最多的分数,为1是a中第二大,b中分数最大。
参考一下:http://blog.csdn.net/acmain_chm/article/details/4126306
相关推荐
mysql获取group by内部可以获取到某字段的记录分组统计总数,而无法统计出分组的记录数。 mysql的SQL_CALC_FOUND_ROWS 使用 获取查询的行数 在很多分页的程序中都这样写: 代码如下 SELECT COUNT(*) from `table` ...
dict_column 全部数据字典表里字段名称和解释 如果我们想查询跟索引有关的数据字典时,可以用下面这条SQL语句: SQL>select * from dictionary where instr(comments,'index')>0; 如果我们想知道user_indexes...
ROWNUM对于`ROWNUM<n`(n>1的自然数)的条件认为是成立的,所以可以找到记录。例如: ```sql SELECT ROWNUM, ID, NAME FROM STUDENT WHERE ROWNUM ; ``` 六、ROWNUM用于查询某区间的数据 查询ROWNUM在某区间的数据...
3. 最后查出所有 parent_id 字段值为 2 或 3 的记录。 将上述三个结果集合并起来就是最终结果集。这个递归过程可以用以下公式表示: resultset(n) = resultset(n-1) union all current_resultset 其中 resultset...
dict_column 全部数据字典表里字段名称和解释 如果我们想查询跟索引有关的数据字典时,可以用下面这条SQL语句: SQL>select * from dictionary where instr(comments,'index')>0; 如果我们想知道user_indexes...
7、为表和字段取别名 8、使用正则表达式查询 什么是查询? 怎么查的? 数据的准备如下: [sql] view plain copy create table STUDENT( STU_ID int primary KEY, STU_NAME char(10) not null, STU_AGE ...
软件测试规范 目 录 一.概述 ...............................................................................................................................................................