SQL经典实例(第2版)
上QQ阅读APP看书,第一时间看更新

1.10 从表中随机返回n行数据

  1. 问题

    你想从表中随机返回 n 行数据。为此,你想修改下面的语句,使其返回 5 行数据,且每次执行时返回的行都不同。

    select ename, job
      from emp

     

  2. 解决方案

    使用 DBMS 提供的返回随机值的内置函数。在 ORDER BY 子句中,使用该内置函数以随机的方式对行进行排序,然后使用上一节介绍的方法来限制返回的行数。

    DB2

    结合使用内置函数 RANDORDER BYFETCH

    1 select ename,job
    2   from emp
    3  order by rand() fetch first 5 rows only

    MySQL

    结合使用内置函数 RANDLIMITORDER BY

    1 select ename,job
    2   from emp
    3  order by rand() limit 5

    PostgreSQL

    结合使用内置函数 RANDOMLIMITORDER BY

    1 select ename,job
    2   from emp
    3  order by random() limit 5

    Oracle

    结合使用(内置包 DBMS_RANDOM 中的)内置函数 VALUEORDER 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

    结合使用内置函数 NEWIDTOPORDER BY 来返回随机的结果集。

    1 select top 5 ename,job
    2   from emp
    3  order by newid()

     

  3. 讨论

    ORDER BY 子句可以根据函数的返回值来调整结果集的排列顺序。这些解决方案都在 ORDER BY 子句中的函数执行后限制返回的行数。即便你使用的不是 Oracle,仔细研究 Oracle 解决方案也会有所帮助,因为它展示了其他解决方案在幕后发生的情况。

    ORDER BY 子句中,使用函数和使用数值常量导致的排序方式是不同的,明白这一点很重要。在 ORDER BY 子句中指定数值常量时,要求根据 SELECT 子句中相应位置的列进行排序。而在 ORDER BY 子句中指定函数时,要求对每行执行该函数,并根据函数的结果进行排序。