• Oracle中随机抽取N条记录


    一、Oracle取随机数据 
    1Oracle访问数据的基本方法: 
    1)、全表扫描(Full table Scan):执行全表扫描,Oracle读表中的所有记录,考查每一行是否满足WHERE条件。Oracle顺序的读分配给该表的每一个数据块,且每个数据块Oracle只读一次.这样全表扫描能够受益于多块读. 
      
    2)、采样表扫描(sample table scan):扫描返回表中随机采样数据,这种访问方式需要在FROM语句中包含SAMPLE选项或者SAMPLE BLOCK选项. 
      
    注:从Oracle8i开始Oracle提供采样表扫描特性 

      
    2、使用sample获得随机结果集 
    2.1、语法: SAMPLE [ BLOCK ](sample_percent)[ SEED (seed_value) ]  
    SAMPLE选项:表示按行采样来执行一个全表扫描,Oracle从表中读取特定百分比的记录,并判断是否满足WHERE子句以返回结果。 
    BLOCK: 表示使用随机块例举而不是随机行例举。 
    sample_percent:是随机获取一张表中记录的百分比。比如值为10,那就是表中的随机的百分之10的记录。 
                   值必须大于等于.000001,小于100。 
    SEED:表示从哪条记录返回,类似于预先设定例举结果,因而每次返回的结果都是固定的。该值必须介于0和4294967295之间。 
      
    2.2、举例说明 
       创建测试临时表: 

     

    Sql代码  

    1.  SQL> select dbms_random.value() from dual;  

    2.     

    3.  DBMS_RANDOM.VALUE()  

    4.  -------------------  

    5.    0.146123095968043  

    6.     

    7.  SQL> select dbms_random.value() from dual;  

    8.     

    9.  DBMS_RANDOM.VALUE()  

    10.-------------------  

    11.   0.90175764902345  

     

    Sql代码  

    1.  SQL> select dbms_random.value(1,10) from dual;  

    2.     

    3.  DBMS_RANDOM.VALUE(1,10)  

    4.  -----------------------  

    5.         9.86601968210438  

    6.     

    7.  SQL> select dbms_random.value(1,10) from dual;  

    8.     

    9.  DBMS_RANDOM.VALUE(1,10)  

    10.-----------------------  

    11.       3.43475105499398  

     

     3.2、举例说明

      

    Sql代码  

    1.  SQL> select * from (select object_name from zeeno order by dbms_random.random) where rownum<6;  

    2.     

    3.  OBJECT_NAME  

    4.  --------------------------------------------------------------------------------  

    5.  /6dd0fe0e_CertificateCertifica  

    6.  /cf5224d7_SunJSSE_a4  

    7.  KU$_PARSED_ITEMS  

    8.  javax/swing/text/IconView  

    9.  oracle/xml/jdwp/XSLJDWPString  

    10.   

    11.SQL> select * from (select object_name from zeeno order by dbms_random.random) where rownum<6;  

    12.   

    13.OBJECT_NAME  

    14.--------------------------------------------------------------------------------  

    15.java/io/ObjectOutputStream$1  

    16.sun/security/krb5/KrbAsReq  

    17./2d52a21c_Last  

    18.SYS_YOID0000006594$  

    19./308fbfa1_BeanContextServices  

     

    Sql代码  

    1.  SQL> select * from (select object_name from zeeno order by trunc(dbms_random.value(1,3))) where rownum<6;  

    2.     

    3.  OBJECT_NAME  

    4.  --------------------------------------------------------------------------------  

    5.  ICOL$  

    6.  C_COBJ#  

    7.  PROXY_ROLE_DATA$  

    8.  I_OBJ#  

    9.  UET$  

    10.   

    11.SQL> select * from (select object_name from zeeno order by trunc(dbms_random.value(1,3))) where rownum<6;  

    12.   

    13.OBJECT_NAME  

    14.--------------------------------------------------------------------------------  

    15.ICOL$  

    16.UNDO$  

    17.I_PROXY_ROLE_DATA$_1  

    18.I_CDEF2  

    19.UET$  

     

    Sql代码  

    1.  SQL> select trunc(dbms_random.value(0, 1000)) randomNum from dual; --(0-1000的整数)  

    2.     

    3.   RANDOMNUM  

    4.  ----------  

    5.         790  

    6.     

    7.  SQL> select dbms_random.value(0, 1000) randomNum from dual; --(0-1000的浮点数)  

    8.     

    9.   RANDOMNUM  

    10.----------  

    11.997.876726  

     

    4、使用内部函数sys_guid()  

    Sql代码  

    1.  SQL>  select * from (select OBJECT_NAME from zeeno order by sys_guid()) where rownum < 6;   

    2.     

    3.  OBJECT_NAME  

    4.  --------------------------------------------------------------------------------  

    5.  /6bedadd5_KeyManagerFactory1  

    6.  /ffd795c8_AddCRIF  

    7.  TABLE_EXPORT_OBJECTS  

    8.  /278cd3a4_CGParselet  

    9.  KU$_REFCOL_T  

    10.   

    11.SQL>  select * from (select OBJECT_NAME from zeeno order by sys_guid()) where rownum < 6;  

    12.   

    13.OBJECT_NAME  

    14.--------------------------------------------------------------------------------  

    15.sun/awt/InputMethodSupport  

    16.V_$RESTORE_POINT  

    17.COLORSLIST  

    18.java/util/WeakHashMap$Entry  

    19.DBMSOUTPUT_LINESARRAY  

     

    :

           在使用sys_guid() 这种方法时,有时会获取到相同的记录,即和前一次查询的结果集是一样的,查找相关资料,有些说是和操作系统有关,在windows平台下正常,获取到的数据是随机的,而在linux等平台下始终是相同不变的数据集,有些说是因为sys_guid()函数本身的问题,即sys_guid()会在查询上生成一个16字节的全局唯一标识符,这个标识符在绝大部分平台上由一个宿主标识符和进程或进程的线程标识符组成,这就是说,它很可能是随机的,但是并不表示一定是百分之百的这样。
          
           所以,为确保在不同的平台每次读取的数据都是随机的,我们大多采用使用sample函数或者DBMS_RANDOM包获得随机结果集,其中使用sample函数更常用,因为其查询时缩小了查询范围,在查询大表,且要提取数据不是很不多的情况下,会对查询速度上有明显的提高。


     

    二、其他数据库随机取出n条记录:

    1SqlServer中随机提取数据库记录

    select top n * from 表 order by newid()

    --------------------------------------------------------------------------------
    select top 10 * from tablename order by NEWID()   
    select top 10 * from tablename order by NEWID()

    2mysql中随机提取数据库记录

    Select * From 表 order By rand() Limit n

    -------------------------------------------------------------------------------
    select * from tablename order by rand() limit 10
    select * from tablename order by rand() limit 10

    3Access中随机提取数据库记录

    Select top n * FROM 表 orDER BY Rnd(id)

    -------------------------------------------------------------------------------
    SELECT top 10 * FROM tablename ORDER BY Rnd(FId)   
    SELECT top 10 * FROM tablename ORDER BY Rnd(FId)
    FId:为你当前表的ID字段名




    转载源  http://kb.cnblogs.com/a/1443619/
    转载源  http://hpitcn.iteye.com/blog/676330

  • 相关阅读:
    EKLM3S8962之LED
    [uClinuxdev] detecting stack overflow
    Eclipse换行符
    EKLM3S8962之OLED
    Windows 环境下 GNU ARM 开发环境建立
    关于阻焊层和助焊层的理解
    MISRA C 2004中文版
    对话框托盘程序实现源码
    VC++中四种进程或线程同步互斥的控制方法
    Windows线程同步与互斥技术总结
  • 原文地址:https://www.cnblogs.com/vicky24k/p/4506584.html
Copyright © 2020-2023  润新知