PostgreSQL-隨機查詢N條記錄
前言
利用一條SQL語句從數據庫Table表中隨機獲取N條記錄,各數據庫的SQL語句略有不同,如下:
目錄
1. MySql
2. SQL Server
3. Access
4. Oracle
5. postgreSQL
1、MySql
Select * From TABLE Order By Rand() Limit N
以上代碼效率不高,自己對1000條數據表隨機取10條的測試結果為耗時0.125s,有網友推薦改為以下代碼效率有大幅提高,耗時為0.005s,不過結果是隨機從某個位置開始取N條記錄,而不是隨機取N條記錄,略有差異。詳細說明見mysql使用rand隨機查詢記錄效率測試。
SELECT * FROM TABLE
a join (SELECT ROUND(RAND() * ((SELECT MAX(id) FROM TABLE
)-(SELECT MIN(id)FROM TABLE
))+(SELECT MIN(id) FROM TABLE
)) AS id) AS b WHERE a.id >= b.id ORDER BY a.id LIMIT N;
2、SQL Server
Select TOP N * From TABLE Order By NewID()
NewID()函數將創建一個 uniqueidentifier 類型的唯一值。
3、Access
Select TOP N * From TABLE Order By Rnd(ID)
Rnd(ID) 其中的ID是自動編號字段,可以利用其他任何數值來完成,比如用姓名字段(UserName)
Select TOP N * From TABLE Order BY Rnd(Len(UserName))
4、Oracle
1)dbms_random包
select * from (select * from Table order by dbms_random.value) where rownum < N;
注:dbms_random包需要手工安裝,位於$ORACLE_HOME/rdbms/admin/dbmsrand.sql
dbms_random.value(100,200)
可以產生100到200范圍的隨機數
2)按概率抽取:
select * from Table sample(百分比);
例:
select * from Table sample(10);
取表Table中記錄條數的10%條記錄
3)sys_guid
select * from (select * from Table order by sys_guid()) where rownum<N;
5、postgreSQL
select * from Table order by random() limit N