随机读取数据表记录的整理 [转]

来源:互联网 发布:傻瓜软件 编辑:程序博客网 时间:2024/05/16 03:49

ORACLE的写法

ORDER BY DBMS_RANDOM.VALUEdbms_random.value(100,200),dbms_random.string('A',10) 
SELECT *
FROM (SELECT EMPNO, ENAME FROM SCOTT.EMP ORDER BY DBMS_RANDOM.VALUE)
WHERE ROWNUM <3> 注:dbms_random包需要手工安装,位于$ORACLE_HOME/rdbms/admin/dbmsrand.sql 
dbms_random.value(100,200)可以产生100到200范围的随机数
取排序后的前3条记录:
SELECT *
FROM (SELECT EMPNO, ENAME, rownum rn FROM SCOTT.EMP ORDER BY 1)
WHERE rn 取排序后的第4-6条记录:
SELECT *
FROM (SELECT EMPNO, ENAME, rownum rn FROM SCOTT.EMP ORDER BY 1)
WHERE rn between 4 and 6;
11.13 随机产生N个字符串
select dbms_random.string('A',10) from dual; 

 

--测试通过,随机取5条

select   *   from  (select   table.*,dbms_random.random   num   from   table order  
  by   num) where  rownum<=5;

--取随机数10与36之间的数字

SELECT  FLOOR(DBMS_RANDOM.VALUE(10,36)) into v_count FROM DUAL;

 

My sql 2000的写法

方法一、
select top 1 * from yourtable  order by newid()
方法二、
set rowcount 1
select * from run2k..fsjour  order by newid()
set rowcount 0

ACCESS的写法

1。通过recordset游标可移动的特性,在已打开记录集里移动到随机位置读取记录。而且可以将就使用页面中已打开的RS对象。
2。将出现过的随机数保存到一个字符串中,通过instr函数来检查是否重复,重复则递归调用函数至不重复。
数据库打开查询若干,省略... ...
Set rs = Server.CreateObject("Adodb.RecordSet")
rs.open sql,conn,1,1

DIM Appeared
Call DisRndRecord(10,rs.recordCount)'调用函数该位置显示记录

'################SUBS################
'#DisRndRecord(DisNum,rsBound)
'#参数DisNum:显示数量
'#参数rsBound:随机数产生范围
Sub DisRndRecord(DisNum,rsBound)
 DIM i,ThisRnd
 If rsBound < DisNum Then DisNum = rsBound'记录总数小于要抽取记录条数的情况
 For i = 0 To DisNum - 1
  ThisRnd = GetRnd(rsBound)'取得一个不重复的随机数
  rs.Move(ThisRnd)'游标移动到随机数位置数读取
  Response.Write("<br>("&rs("id")&")"&rs("Title"))
  rs.Move(-ThisRnd)
 Next
End Sub
'# 函数GetRnd(bound)返回一个不重复的随机数字
'#参数bound:随机范围
Function GetRnd(bound)
 DIM ranNum
 Randomize()
 ranNum=int(bound*rnd)
 If Instr(Appeared,"["&ranNum&"]") Then'产生的随机数是否出现过
  ranNum = getRnd(bound)
 End If
 Appeared = Appeared & "["&ranNum&"]"'记录已出现的随机数
 GetRnd = ranNum
End Function

 

MySQL的写法

SELECT * FROM table_name ORDER BY rand() LIMIT 5;
  rand在手册里是这么说的:
  RAND() 
  RAND(N) 
  返回在范围0到1.0内的随机浮点值。如果一个整数参数N被指定,它被用作种子值。 
mysql> select RAND();
-> 0.5925
mysql> select RAND(20);
-> 0.1811
mysql> select RAND(20);
-> 0.1811
mysql> select RAND();
-> 0.2079
mysql> select RAND();
-> 0.7888

  你不能在一个ORDER BY子句用RAND()值使用列,因为ORDER BY将重复计算列多次。然而在MySQL3.23中,你可以做: SELECT * FROM table_name ORDER BY RAND(),这是有利于得到一个来自SELECT * FROM table1,table2 WHERE a=b AND c<d ORDER BY RAND() LIMIT 1000的集合的随机样本。注意在一个WHERE子句里的一个RAND()将在每次WHERE被执行时重新评估。 

  试了一下,8千条记录的表,执行一次需要0.08 sec,.慢了些

  请教了google,得到如下代码

SELECT * FROM table_name AS r1 JOIN ( SELECT ROUND(RAND() * (SELECT MAX(id) FROM table_name)) AS id) AS r2 WHERE r1.id >= r2.id ORDER BY r1.id ASC LIMIT 5;