
上QQ阅读APP看书,第一时间看更新
1.10 从表中随机返回n行数据
问题
你想从表中随机返回 n 行数据。为此,你想修改下面的语句,使其返回 5 行数据,且每次执行时返回的行都不同。
select ename, job from emp
解决方案
使用 DBMS 提供的返回随机值的内置函数。在
ORDER BY
子句中,使用该内置函数以随机的方式对行进行排序,然后使用上一节介绍的方法来限制返回的行数。DB2
结合使用内置函数
RAND
、ORDER BY
和FETCH
。1 select ename,job 2 from emp 3 order by rand() fetch first 5 rows only
MySQL
结合使用内置函数
RAND
、LIMIT
和ORDER BY
。1 select ename,job 2 from emp 3 order by rand() limit 5
PostgreSQL
结合使用内置函数
RANDOM
、LIMIT
和ORDER BY
。1 select ename,job 2 from emp 3 order by random() limit 5
Oracle
结合使用(内置包
DBMS_RANDOM
中的)内置函数VALUE
、ORDER BY
子句和内置函数ROWNUM
。1 select * 2 from ( 3 select ename, job 4 from emp 6 order by dbms_random.value() 7 ) 8 where rownum <= 5
SQL Server
结合使用内置函数
NEWID
、TOP
和ORDER BY
来返回随机的结果集。1 select top 5 ename,job 2 from emp 3 order by newid()
讨论
ORDER BY
子句可以根据函数的返回值来调整结果集的排列顺序。这些解决方案都在ORDER BY
子句中的函数执行后限制返回的行数。即便你使用的不是 Oracle,仔细研究 Oracle 解决方案也会有所帮助,因为它展示了其他解决方案在幕后发生的情况。在
ORDER BY
子句中,使用函数和使用数值常量导致的排序方式是不同的,明白这一点很重要。在ORDER BY
子句中指定数值常量时,要求根据SELECT
子句中相应位置的列进行排序。而在ORDER BY
子句中指定函数时,要求对每行执行该函数,并根据函数的结果进行排序。