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