关于SQL按顺序取非最大或最小值的问题

2018/03/11 Sql

在数据库中很多地方都会用到,比如当你数据库查询记录有几万、几十万时使用limit和top查询效率非常快,只需要查询出你需要的数据就可以了·再也不用全表查询导致查询数据库崩溃的情况。

例如:写一个 SQL 查询语句,获取表test中score第二高的值

id score
1 100
2 200
3 400

解法1:利用top,mysql无此语法不适用

思路是先降序取前两个,然后升序取一个

select top 1 score
from (select distinct top 2 score
      from test order by score desc )
order by score asc

解法2:利用limit来限制数据显示,mysql可用

思路是先倒序,直接从第二个开始取,只取一个值

select distinct score
from test
order by score desc
limit 1,1

解法3:利用max即可,此方法仅适合第一和第二,多了别用

利用一个嵌套查询就解决了

select max(score)
from test
where score <
(select max(score)
from test)

注意:以上方法没有考虑重复值的情况

此时应使用distinct来唯一化数据

解法4:在考虑存在空值集和重复值的情况

此方法充分体现了SQL的执行顺序!!

SELECT distinct score as scoreone  
FROM test
UNION ALL (SELECT NULL as scoreone )  
ORDER BY  scoreone DESC
LIMIT 1 ,1

原创内容未经作者同意,严禁转载

Show Disqus Comments

Search

    欢迎关注我的微信公众号

    闷骚的程序员

    Table of Contents