有时候,当我们需要对数据库内部数据进行排名显示的时候,我们常常会设置一些变量跟踪查询,但是,有时候变量过多,我们常常被变量搞得比较晕,所以,有时候,我们需要一种在我们写程序时候的一个类似的for循环来实现,其实,我们在数据库中,也能认为的制造一个for循环来查询数据,当我们查询一个表时,如果我们将整张表先按照一定的大小顺序排列的话,我们会得到一个从大到小,或者从小到大的一些数据,那么,当我们设置一个子查询,子查询中的条件参数中掺杂着外部函数的参数,此时当外部函数参数返回一个值时,我们的子查询就是遍历一圈,故,这种方法的效率比较低,但是,不可否认的是,会制造一个我们比较想要的查询方式:下面,我们来看看一个关于排名的问题。
编写一个 SQL 查询来实现分数排名。如果两个分数相同,则两个分数排名(Rank)相同。请注意,平分后的下一个名次应该是下一个连续的整数值。换句话说,名次之间不应该有“间隔”。
±—±------+
| Id | Score |
±—±------+
| 1 | 3.50 |
| 2 | 3.65 |
| 3 | 4.00 |
| 4 | 3.85 |
| 5 | 4.00 |
| 6 | 3.65 |
±—±------+
例如,根据上述给定的 Scores 表,你的查询应该返回(按分数从高到低排列):
±------±-----+
| Score | Rank |
±------±-----+
| 4.00 | 1 |
| 4.00 | 1 |
| 3.85 | 2 |
| 3.65 | 3 |
| 3.65 | 3 |
| 3.50 | 4 |
±------±-----+
这个时候,我们就希望有个循环,当我取出一个数出来的时候,我能确定有几个数比它大,就会排到第几,故:我们可以用以下的方法来实现:
SELECT Score, (SELECT count(DISTINCT score) FROM Scores WHERE score >= s.score) AS Rank FROM Scores s ORDER BY Score DESC ;
我们用count记录,因为外层是一个降序排列,此时,我们可以假设,当外面第一的时候,此时的count函数遍历怎个分数表, 只会是1;故此时可以起到排名的作用,当然,这个也给我们创造了一个排名多少的条件,直接再用一个查询,筛选count的排名的数值就可以了。
关于数据库嵌入式的子查询
最新推荐文章于 2019-04-10 13:17:16 发布