SQL 随机返回若干行记录,你希望从表中获取特定数量的随机记录。修改下面的语句,以便连续执行查询并使结果集含有 5 行不同的数据。
SQL 随机返回若干行记录 问题
你希望从表中获取特定数量的随机记录。修改下面的语句,以便连续执行查询并使结果集含有 5
行不同的数据。
select ename, job
from emp
SQL 随机返回若干行记录 解决方案
使用数据库的内置函数来随机生成查询结果。在 ORDER BY
子句里使用该内置函数可以实现查询结果的随机排序。最后要结合 SQL 限定返回行数 中的技巧从随机排序结果里获取限定数目的行。
DB2
把内置函数 RAND
和 ORDER BY
、FETCH
结合使用。
select ename,job
from emp
order by rand() fetch first 5 rows only
把内置函数 RAND
和 LIMIT
、ORDER BY
结合使用。
select ename,job
from emp
order by rand() limit 5
把内置函数 RANDOM
和 LIMIT
、ORDER BY
结合使用。
select ename,job
from emp
order by random() limit 5
Oracle
在内置包 DBMS_RANDOM
里可以找到 VALUE
函数,把该内置函数和 ORDER BY
、内置函数 ROWNUM
结合使用。
select *
from (
select ename, job
from emp
order by dbms_random.value()
)
where rownum <= 5
SQL Server
同时使用内置函数 NEWID
和 TOP
、ORDER BY
来返回一个随机结果集。
select top 5 ename,job
from emp
order by newid()
SQL 随机返回若干行记录 扩展知识
ORDER BY
子句能够接受一个函数的返回值,并利用该值改变当前结果集的顺序。在本例中,所有查询都是在 ORDER BY
子句执行结束后才限定返回值的行数。看过 Oracle 的解决方案后,非 Oracle 用户可能会受到启发,因为 Oracle 的解决方案展示了(在理论上)其他数据库内部是如何实现该查询的。
不要误认为 ORDER BY
子句中的函数是数值常量,这一点很重要。如果 ORDER BY
子句使用数值常量,那么就需要按照 SELECT
列表里的顺序来排序。如果 ORDER BY
子句使用了函数,那么就需要按照该函数的返回值来排序,而函数返回的值是根据结果集里的每一行计算而来的。