一、Oracle取隨機數據
1、Oracle訪問數據的基本方法:
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代碼
-
SQL>create table zeeno as select * from dba_objects;
Sql代碼
-
SQL>create table zeeno as select * from dba_objects;
1)、sample(sample_percent):
Sql代碼
-
-- 從表zeeno中“全表掃描”隨機抽取10%的記錄,隨機查詢5條記錄
-
SQL>select object_name from zeeno sample(10) where rownum<6;
-
-
OBJECT_NAME
-
--------------------------------------------------------------------------------
-
UET$
-
VIEW$
-
I_SUPEROBJ2
-
TRIGGERCOL$
-
I_VIEW1
-
-
SQL> /
-
-
OBJECT_NAME
-
--------------------------------------------------------------------------------
-
I_FILE1
-
IND$
-
CLU$
-
FET$
-
I_COBJ#
-
Sql代碼
-
-- 從表zeeno中“全表掃描”隨機抽取10%的記錄,隨機查詢5條記錄
-
SQL>select object_name from zeeno sample(10) where rownum<6;
-
-
OBJECT_NAME
-
--------------------------------------------------------------------------------
-
UET$
-
VIEW$
-
I_SUPEROBJ2
-
TRIGGERCOL$
-
I_VIEW1
-
-
SQL> /
-
-
OBJECT_NAME
-
--------------------------------------------------------------------------------
-
I_FILE1
-
IND$
-
CLU$
-
FET$
-
I_COBJ#
-
2)、sample block(sample_percent)
Sql代碼
-
-- 從表zeeno中“採樣表掃描”隨機抽取10%的記錄,隨機查詢5條記錄
-
SQL> select object_name from zeeno sample block(10) where rownum<6;
-
-
OBJECT_NAME
-
--------------------------------------------------------------------------------
-
URIFACTORY
-
DBMS_XMLGEN
-
DBMS_XMLGEN
-
DBMS_XMLSTORE
-
DBMS_XMLSTORE
-
Sql代碼
-
-- 從表zeeno中“採樣表掃描”隨機抽取10%的記錄,隨機查詢5條記錄
-
SQL> select object_name from zeeno sample block(10) where rownum<6;
-
-
OBJECT_NAME
-
--------------------------------------------------------------------------------
-
URIFACTORY
-
DBMS_XMLGEN
-
DBMS_XMLGEN
-
DBMS_XMLSTORE
-
DBMS_XMLSTORE
-
3)、sample block(sample_percent) seed(seed_value)
Sql代碼
-
-- 使用seed,返回固定的結果集。從表zeeno中“採樣表掃描”隨機抽取10%的記錄,隨機查詢5條記錄。
-
SQL> select object_name from zeeno sample(10) seed(10) where rownum<6;
-
-
OBJECT_NAME
-
--------------------------------------------------------------------------------
-
UET$
-
I_CON1
-
I_FILE2
-
FET$
-
I_COL1
-
-
SQL> select object_name from zeeno sample(10) seed(10) where rownum<6;
-
-
OBJECT_NAME
-
--------------------------------------------------------------------------------
-
UET$
-
I_CON1
-
I_FILE2
-
FET$
-
I_COL1
-
Sql代碼
-
-- 使用seed,返回固定的結果集。從表zeeno中“採樣表掃描”隨機抽取10%的記錄,隨機查詢5條記錄。
-
SQL> select object_name from zeeno sample(10) seed(10) where rownum<6;
-
-
OBJECT_NAME
-
--------------------------------------------------------------------------------
-
UET$
-
I_CON1
-
I_FILE2
-
FET$
-
I_COL1
-
-
SQL> select object_name from zeeno sample(10) seed(10) where rownum<6;
-
-
OBJECT_NAME
-
--------------------------------------------------------------------------------
-
UET$
-
I_CON1
-
I_FILE2
-
FET$
-
I_COL1
-
注意以下幾點:
1.sample只對單表生效,不能用於表連接和遠程表
2.sample會使SQL自動使用CBO
3、使用DBMS_RANDOM包
DBMS_RANDOM有兩種主要的使用方法分別是:DBMS_RANDOM.VALUE()和DBMS_RANDOM.RANDOM
3.1、取隨機數
Sql代碼
-
SQL> select dbms_random.value() from dual;
-
-
DBMS_RANDOM.VALUE()
-
-------------------
-
0.146123095968043
-
-
SQL> select dbms_random.value() from dual;
-
-
DBMS_RANDOM.VALUE()
-
-------------------
-
0.90175764902345
Sql代碼
-
SQL> select dbms_random.value() from dual;
-
-
DBMS_RANDOM.VALUE()
-
-------------------
-
0.146123095968043
-
-
SQL> select dbms_random.value() from dual;
-
-
DBMS_RANDOM.VALUE()
-
-------------------
-
0.90175764902345
Sql代碼
-
SQL> select dbms_random.value(1,10) from dual;
-
-
DBMS_RANDOM.VALUE(1,10)
-
-----------------------
-
9.86601968210438
-
-
SQL> select dbms_random.value(1,10) from dual;
-
-
DBMS_RANDOM.VALUE(1,10)
-
-----------------------
-
3.43475105499398
Sql代碼
-
SQL> select dbms_random.value(1,10) from dual;
-
-
DBMS_RANDOM.VALUE(1,10)
-
-----------------------
-
9.86601968210438
-
-
SQL> select dbms_random.value(1,10) from dual;
-
-
DBMS_RANDOM.VALUE(1,10)
-
-----------------------
-
3.43475105499398
3.2、舉例說明
Sql代碼
-
SQL> select * from (select object_name from zeeno order by dbms_random.random) where rownum<6;
-
-
OBJECT_NAME
-
--------------------------------------------------------------------------------
-
/6dd0fe0e_CertificateCertifica
-
/cf5224d7_SunJSSE_a4
-
KU$_PARSED_ITEMS
-
javax/swing/text/IconView
-
oracle/xml/jdwp/XSLJDWPString
-
-
SQL> select * from (select object_name from zeeno order by dbms_random.random) where rownum<6;
-
-
OBJECT_NAME
-
--------------------------------------------------------------------------------
-
java/io/ObjectOutputStream$1
-
sun/security/krb5/KrbAsReq
-
/2d52a21c_Last
-
SYS_YOID0000006594$
-
/308fbfa1_BeanContextServices
Sql代碼
-
SQL> select * from (select object_name from zeeno order by dbms_random.random) where rownum<6;
-
-
OBJECT_NAME
-
--------------------------------------------------------------------------------
-
/6dd0fe0e_CertificateCertifica
-
/cf5224d7_SunJSSE_a4
-
KU$_PARSED_ITEMS
-
javax/swing/text/IconView
-
oracle/xml/jdwp/XSLJDWPString
-
-
SQL> select * from (select object_name from zeeno order by dbms_random.random) where rownum<6;
-
-
OBJECT_NAME
-
--------------------------------------------------------------------------------
-
java/io/ObjectOutputStream$1
-
sun/security/krb5/KrbAsReq
-
/2d52a21c_Last
-
SYS_YOID0000006594$
-
/308fbfa1_BeanContextServices
Sql代碼
-
SQL> select * from (select object_name from zeeno order by trunc(dbms_random.value(1,3))) where rownum<6;
-
-
OBJECT_NAME
-
--------------------------------------------------------------------------------
-
ICOL$
-
C_COBJ#
-
PROXY_ROLE_DATA$
-
I_OBJ#
-
UET$
-
-
SQL> select * from (select object_name from zeeno order by trunc(dbms_random.value(1,3))) where rownum<6;
-
-
OBJECT_NAME
-
--------------------------------------------------------------------------------
-
ICOL$
-
UNDO$
-
I_PROXY_ROLE_DATA$_1
-
I_CDEF2
-
UET$
Sql代碼
-
SQL> select * from (select object_name from zeeno order by trunc(dbms_random.value(1,3))) where rownum<6;
-
-
OBJECT_NAME
-
--------------------------------------------------------------------------------
-
ICOL$
-
C_COBJ#
-
PROXY_ROLE_DATA$
-
I_OBJ#
-
UET$
-
-
SQL> select * from (select object_name from zeeno order by trunc(dbms_random.value(1,3))) where rownum<6;
-
-
OBJECT_NAME
-
--------------------------------------------------------------------------------
-
ICOL$
-
UNDO$
-
I_PROXY_ROLE_DATA$_1
-
I_CDEF2
-
UET$
Sql代碼
-
SQL> select trunc(dbms_random.value(0, 1000)) randomNum from dual; --(0-1000的整數)
-
-
RANDOMNUM
-
----------
-
790
-
-
SQL> select dbms_random.value(0, 1000) randomNum from dual; --(0-1000的浮點數)
-
-
RANDOMNUM
-
----------
-
997.876726
Sql代碼
-
SQL> select trunc(dbms_random.value(0, 1000)) randomNum from dual; --(0-1000的整數)
-
-
RANDOMNUM
-
----------
-
790
-
-
SQL> select dbms_random.value(0, 1000) randomNum from dual; --(0-1000的浮點數)
-
-
RANDOMNUM
-
----------
-
997.876726
4、使用內部函數sys_guid()
Sql代碼
-
SQL> select * from (select OBJECT_NAME from zeeno order by sys_guid()) where rownum < 6;
-
-
OBJECT_NAME
-
--------------------------------------------------------------------------------
-
/6bedadd5_KeyManagerFactory1
-
/ffd795c8_AddCRIF
-
TABLE_EXPORT_OBJECTS
-
/278cd3a4_CGParselet
-
KU$_REFCOL_T
-
-
SQL> select * from (select OBJECT_NAME from zeeno order by sys_guid()) where rownum < 6;
-
-
OBJECT_NAME
-
--------------------------------------------------------------------------------
-
sun/awt/InputMethodSupport
-
V_$RESTORE_POINT
-
COLORSLIST
-
java/util/WeakHashMap$Entry
-
DBMSOUTPUT_LINESARRAY
Sql代碼
-
SQL> select * from (select OBJECT_NAME from zeeno order by sys_guid()) where rownum < 6;
-
-
OBJECT_NAME
-
--------------------------------------------------------------------------------
-
/6bedadd5_KeyManagerFactory1
-
/ffd795c8_AddCRIF
-
TABLE_EXPORT_OBJECTS
-
/278cd3a4_CGParselet
-
KU$_REFCOL_T
-
-
SQL> select * from (select OBJECT_NAME from zeeno order by sys_guid()) where rownum < 6;
-
-
OBJECT_NAME
-
--------------------------------------------------------------------------------
-
sun/awt/InputMethodSupport
-
V_$RESTORE_POINT
-
COLORSLIST
-
java/util/WeakHashMap$Entry
-
DBMSOUTPUT_LINESARRAY
注:
在使用sys_guid() 這種方法時,有時會獲取到相同的記錄,即和前一次查詢的結果集是一樣的,查找相關資料,有些說是和操作系統有關,在windows平臺下正常,獲取到的數據是隨機的,而在linux等平臺下始終是相同不變的數據集,有些說是因爲sys_guid()函數本身的問題,即sys_guid()會在查詢上生成一個16字節的全局唯一標識符,這個標識符在絕大部分平臺上由一個宿主標識符和進程或進程的線程標識符組成,這就是說,它很可能是隨機的,但是並不表示一定是百分之百的這樣。
所以,爲確保在不同的平臺每次讀取的數據都是隨機的,我們大多采用使用sample函數或者DBMS_RANDOM包獲得隨機結果集,其中使用sample函數更常用,因爲其查詢時縮小了查詢範圍,在查詢大表,且要提取數據不是很不多的情況下,會對查詢速度上有明顯的提高。
二、其他數據庫隨機取出n條記錄:
1、SqlServer中隨機提取數據庫記錄
select top n * from 表 order by newid()
--------------------------------------------------------------------------------
select top 10 * from tablename order by NEWID()
select top 10 * from tablename order by NEWID()
2、mysql中隨機提取數據庫記錄
Select * From 表 order By rand() Limit n
-------------------------------------------------------------------------------
select * from tablename order by rand() limit 10
select * from tablename order by rand() limit 10
3、Access中隨機提取數據庫記錄
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字段名