From:http://www.orafans.net/2006/09/oracle-random-record.htmlhtml
工做中常常用到隨機數,好比隨機抽取獎券,隨機抽取某地區的客戶樣本等。在Oracle中能夠很是方便地實現這個功能。mysql
方法1:使用SAMPLE()。sql
使用sample的語法是:數據庫
- SAMPLE
- [ BLOCK ] (sample_percent)
- [ SEED (seed_value) ]
BLOCK: 表示使用隨機塊例舉而不是隨機行例舉。oracle
sample_percent是隨機獲取一張表中記錄的百分比。好比值爲10,那就是表中的隨機的百分之10的記錄。值必須大於等於.000001,小於100。dom
seed表示從哪條記錄返回,相似於預先設定例舉結果,於是每次返回的結果都是固定的。該值必須介於0和4294967295之間。ide
接下來舉例說明:spa
- SQL> create table zeeno as select * from dba_objects;
- Table created.
- SQL> select object_name from zeeno sample(10) where rownum=1;
- OBJECT_NAME
- -------------------------------------------------------------
- UET$
- SQL> /
- OBJECT_NAME
- -------------------------------------------------------------
- ICOL$
若是使用seed,則返回固定的集。.net
- 1* select object_name from zeeno sample(10) seed(10) where rownum=1
- SQL> /
- OBJECT_NAME
- ---------------------------------------------------------------------
- PROXY_ROLE_DATA$
- SQL> /
- OBJECT_NAME
- ---------------------------------------------------------------------
- PROXY_ROLE_DATA$
- SQL> select object_name from dba_objects sample(10)where rownum=1;
- select object_name from dba_objects sample(10)where rownum=1
- *
- ERROR at line 1:
- ORA-01446: cannot select ROWID from, or sample, a view with DISTINCT, GROUP BY,
- etc.
DBMS_RANDOM有兩種主要的使用方法,分別是DBMS_RANDOM.VALUE()和DBMS_RANDOM.RANDOM。htm
- SQL> select dbms_random.value() from dual;
- DBMS_RANDOM.VALUE()
- -------------------
- .638206012
- SQL> /
- DBMS_RANDOM.VALUE()
- -------------------
- .312828706
- SQL> select dbms_random.value(1,10) from dual
- DBMS_RANDOM.VALUE(1,10)
- -----------------------
- 2.49371361
- SQL> /
- DBMS_RANDOM.VALUE(1,10)
- -----------------------
- 1.6890498
有了隨機數,抽取隨機記錄就是一件很是輕鬆的事情了:
- SQL> select * from (select object_name from zeeno
- 2 order by dbms_random.random)
- 3 where rownum=1;
- OBJECT_NAME
- -------------------------------------------------
- DBMS_JAVA_TEST
- SQL> /
- OBJECT_NAME
- -------------------------------------------------
- USER_SNAPSHOT_REFRESH_TIMES
- SQL> select * from (select object_name from zeeno
- 1 order by ceil(dbms_random.value(1,3))
- 2 )
- 3* where rownum=1
- OBJECT_NAME
- ----------------------------------------------------------
- UNDO$
- SQL> /
- OBJECT_NAME
- ----------------------------------------------------------
- I_USER1
一般狀況下我更喜歡使用SAMPLE,由於更加方便。
其餘數據庫隨機取出n條記錄:
一、SqlServer中隨機提取數據庫記錄
- select top n * from table_name order by newid()
二、mysql中隨機提取數據庫記錄
- Select * From table_name order By rand() Limit n
三、Access中隨機提取數據庫記錄
- Select top n * FROM table_name orDER BY Rnd(FId)
FId:爲你當前表的ID字段名