利用sql語句隨機(jī)抽取記錄

2022-06-06    分類: 網(wǎng)站建設(shè)

數(shù)據(jù)庫的隨機(jī)查詢SQL

1. Oracle,隨機(jī)查詢20條

select * from

(
 select  *  from 表名
 order by dbms_random.value

)
 where rownum <= 20;


2.MS SQL Server,隨機(jī)查詢20條

select top 20  * from  表名order by newid()


3.My SQL:,隨機(jī)查詢20條

select  *  from  表名 order by rand() limit 20


隨機(jī)查詢指定人員的一條未讀消息

幫助消息表 S_MSG_HINT
幫助消息ID SMH_ID NUMBER(20) PK
幫助消息內(nèi)容 SMH_TEXT VARCHAR2(200)

人員幫助消息表 S_HINTPEOPLE
人員ID SHP_UID VARCHAR2(20) PK
當(dāng)前幫助消息ID SMH_ID NUMBER(20)  PK FK

如果為已讀消息會(huì)在 人員幫助消息表里面生成記錄

select
    *
from
    (select
        smh.*,
        nvl2( shp.smh_id,1,0) as status --0:未讀 1:已讀
    from
        s_msg_hint smh
                left join s_hintpeople shp
                    on smh.smh_id = shp.smh_id
                    and shp.shp_uid = 'p_chencc'
    order by
        dbms_random.value  --隨機(jī)數(shù)值排序
    )
where
    status = 0 and --未讀消息
    rownum <= 1  --取一條


########################################################################


我們經(jīng)常想在一個(gè)數(shù)據(jù)表中隨機(jī)地選取出數(shù)據(jù)來,比如隨機(jī)生成考試試卷等。

利用 SQL Server 的 NewID() 方法就可以很輕松地達(dá)到這個(gè)目的。

NewID() 方法返回一個(gè) GUID,如:EE95A489-B721-4E8A-8171-3CA8CB6AD9E4

在 select 表的時(shí)候,再增加一列為 NewID() 就可以了。

SQL 語句:select *, NewID() from table

這樣每條記錄后就會(huì)有一個(gè)隨機(jī)的 GUID 值,我們?cè)侔催@個(gè) GUID 排一下序就可以達(dá)到亂序的效果。

SQL 語句:select *, NewID() as random from table order by random

我們要想隨機(jī)取出 10 條數(shù)據(jù),只要加上 TOP 10 就行了:

SQL 語句:select top 10 *, NewID() as random from table order by random

篩選唯一記錄

SELECT * FROM tablename ORDER BY NEWID()

這個(gè)方法只適用于 SQL Server。

SELECT top 4 * FROM 表 ORDER BY Rnd(id)

這句適用于ACCESS的,大家能參考

select * from table_name order by rand() [limit num];

mysql的隨機(jī)查詢語句。

SQL隨機(jī)選取記錄


今天在動(dòng)易的論壇上看到有人問如何隨機(jī)選取記錄的問題,上網(wǎng)查了一下資料,網(wǎng)上的資料比較散,所以整理了一下,權(quán)當(dāng)做個(gè)筆記,將來做考試系統(tǒng)的時(shí)候肯定是要用到的。

SQL Server:

SQL Server數(shù)據(jù)庫有個(gè)NewID函數(shù),可以很方便的用SQL語句得到數(shù)據(jù)表中的隨機(jī)數(shù)據(jù)。

Select TOP N * From TABLE Order By NewID()

Access:

Access數(shù)據(jù)庫雖然有個(gè)Rnd,可以通過“select top 10 * from tb order by rnd(id)”得到隨機(jī)數(shù)據(jù),VBA環(huán)境下使用沒有問題,可惜在VB中使用,產(chǎn)生的隨機(jī)序列是一樣的,每次調(diào)用返回的數(shù)據(jù)相同。

有人說在程序中加上Randomize初始化隨機(jī)種子,那么這只說對(duì)了一半,在程序中簡(jiǎn)單的加上Randomize,是沒作用的,道理很簡(jiǎn)單,Randomize不可能影響SQL語句中的Rnd,這個(gè)Rnd只不過是個(gè)字符串,SQL語句是通過數(shù)據(jù)庫引擎去執(zhí)行的,正因?yàn)槿绱?,無法初始化種子,致使每次應(yīng)用產(chǎn)生的隨機(jī)序列是一樣的。

由此可見,解決問題的關(guān)鍵就是如何初始化隨機(jī)種子。Rnd函數(shù)語法是Rnd(number),它有一個(gè)特性,就是如果使用了負(fù)參數(shù)的number,那么就會(huì)產(chǎn)生一個(gè)固定的隨機(jī)序列。利用這個(gè)特性,我們的問題就迎刃而解了,這就是每次調(diào)用Rnd函數(shù)時(shí),使用一個(gè)負(fù)的不同的number,從而達(dá)到產(chǎn)生不同隨機(jī)序列的目的。經(jīng)過測(cè)試,問題解決。示例代碼如下:

’......

Dim sql As String

Dim r As Single

Randomize

r = Rnd

sql = 'select top 1 * from tb order by rnd(' & r & '-id)'

’......

代碼說明:SQL語句中的Rnd的參數(shù)是一個(gè)數(shù)值表達(dá)式,必須包含表中的一個(gè)字段(最好是主鍵),因?yàn)樽兞縭返回的是一個(gè)隨機(jī)的0到1之間的single,(一般情況下表中的ID值都是大于1的),從而使參數(shù)的值是個(gè)小于0的隨機(jī)數(shù),由此產(chǎn)生了不同的隨機(jī)序列。

補(bǔ)充一點(diǎn),有一種提議用time來解決這個(gè)問題,就是'select top 10 * from tb order by rnd(' & time & '- id) '。在某些情況下是可以的,但是,如果你需要快速連續(xù)的查詢信息,比如一些搖號(hào)程序需要連續(xù)滾動(dòng)地顯示信息,這種情況下,就會(huì)出現(xiàn)連續(xù)幾次返回重復(fù)的信息。究其原因,就是time在做數(shù)值運(yùn)算的時(shí)候,會(huì)轉(zhuǎn)換為一個(gè)小于1的Double,而rnd返回的是一個(gè)Single,顯然,rnd返回的結(jié)果有可能會(huì)截去time-id運(yùn)算后的尾數(shù),在time變化很小的情況下,使rnd返回的值與前次相同,從而返回的查詢結(jié)果相同。

MySql:

Select * From TABLE Order By Rand() Limit 10

本文標(biāo)題:利用sql語句隨機(jī)抽取記錄
本文地址:http://www.muchs.cn/news10/164160.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站建設(shè)、軟件開發(fā)Google、網(wǎng)站導(dǎo)航移動(dòng)網(wǎng)站建設(shè)、建站公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

小程序開發(fā)