随机读取数据表记录的整理 [转]
2009-03-05 17:36
281 查看
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;
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;
相关文章推荐
- 【转载】SQL 随机读取数据表中N条不重复记录
- SQLite 读取数据时,随机顺序
- 分页从-1开始读取数据只会重复一条记录
- SQL SERVER2000教程-第五章 处理数据 第二十五节从SQLSERVER2000中随机提取N条记录
- 随机获取Mysql数据表的一条或多条记录
- DataTable创建、数据的添加及数据记录的排序,检索,合并,分页,统计(整理)
- 最最最简单的用SQL语句选则数据表中的随机N条记录
- linq 随机读取数据库中的数据
- 转: 从Mysql某一表中随机读取n条数据的SQL查询语句
- MySql 100万级别数据中随机获取一条或多条记录之RAND()优化
- 删除数据库表中的重复冗余记录,以及随机取N条数据的方法
- 如何在MySQL随机读取数据?
- SQL在各种数据库中获取随机数据记录
- [原创]如何实现MySQL表数据随机读取
- 详细整理Java 从命令控制台输入数据读取输入流System.in的几种常用方法
- 从数据库里随机读取几条数据
- 随机获取Mysql数据表的一条或多条记录
- PHP实现在数据库百万条数据中随机获取20条记录的方法
- 分页读取数据记录(row_number()函数)
- Linq随机读取数据浅析