- 浏览: 1493112 次
- 性别:
- 来自: 大连
文章分类
- 全部博客 (460)
- java (148)
- javascript (34)
- Flex文章 (4)
- css+div (2)
- ajax (6)
- extjs (11)
- 人生感悟 (9)
- struts2.0 (6)
- IT之路,生活 (15)
- hibernate (6)
- struts1 (1)
- spring (5)
- j2ee错误 (3)
- Dwr (5)
- Linux (33)
- C++ (3)
- SWT Win32 (2)
- EJB (1)
- JPA (4)
- C语言和LinuxC (7)
- SQL (13)
- 项目经理 (6)
- db2 (2)
- java数据结构 (2)
- 网页播放器flv (1)
- 数据库 (24)
- 用户体验设计学习 (2)
- 网络电话 (5)
- 军事理论 (4)
- android (3)
- oracle (18)
- oracle ebs form (11)
- oracle ebs oaf (4)
- erp (20)
- DBA (9)
- java中URL 的编码和解码函数 (1)
- 铁血丹心 (1)
- excel 单元格格式不能立即生效 (1)
- Java调用bat文件 (1)
- 如何把本地outlook中的邮件上传到网络邮箱中 (1)
- java 报表 打印 (1)
- 创建dblink (1)
- 图标前台框架 (1)
- vnc (1)
- FORM (1)
- MYSQL (1)
最新评论
-
July01:
推荐用StratoIO打印控件,支持网页、URL、图片、PD、 ...
web打印不显示页眉页脚 -
July01:
推荐用StratoIO打印控件,浏览器和系统的兼容性都很好,而 ...
Javascript网页打印大全 -
hardyer:
大哥写的很实在,受教了,提前祝你元旦快乐!
黎活明给程序员的忠告 -
cxysilahi:
请问WIN7 64位,调用报错Exception in thr ...
JNative的初步使用 -
action1949:
好东西,解决问题
JFreeChart乱码解决方法
转载来源:http://www.orafans.org/2006/09/oracle-random-record.html
转载来源:http://kb.cnblogs.com/a/1443619/
一、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>create table zeeno as select * from dba_objects;
1)、sample(sample_percent):
- -- 从表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#
-- 从表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)
- -- 从表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
-- 从表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)
- -- 使用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
-- 使用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> select dbms_random.value() from dual;
- DBMS_RANDOM.VALUE()
- -------------------
- 0.146123095968043
- SQL> select dbms_random.value() from dual;
- DBMS_RANDOM.VALUE()
- -------------------
- 0.90175764902345
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> 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> 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> 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> 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> 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> 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> 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> 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> 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> 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字段名
发表评论
-
OPatch(6880880)
2020-09-27 09:32 6041) 使用下面的链接从 My Oracle Support( ... -
POI3.8中 大数据量的处理
2016-03-21 15:34 703package cn.cy.codeTest; i ... -
Navicat Premium导数据的方法
2016-03-21 10:05 3577转:http://baohua.me/database/or ... -
Oracle 动态创建表和表名
2013-11-28 11:05 2442http://blog.csdn.net/pingdan_y ... -
DBMS_OUTPUT包学习
2012-06-26 11:18 0http://www.blogjava.net/decode3 ... -
oracle查询约束
2012-05-09 22:49 1145select distinct constraint_type ... -
sql server 函数
2011-03-23 15:25 1139go drop function gethystr go ... -
详解NoSQL数据库使用实例
2011-03-22 16:08 4073一、NoSQL基础知识 1.关于在"NoSQL ... -
NoSQL数据库探讨之一 - 为什么要用非关系数据库?
2011-03-22 16:06 1121随着互联网web2.0网站的兴起,非关系型的数据库现在成了一个 ... -
Oracle中游标的使用
2011-03-12 17:41 14601;字符串变量例子2 给 ... -
Mysql建立索引
2010-10-13 10:02 2055最普通的情况,是为出 ... -
SELECT INTO 和 INSERT INTO SELECT 两种表复制语句
2010-09-29 11:40 13221.INSERT INTO SELECT语句 ... -
数据库查询速度慢的原因
2010-09-20 11:24 1530查询速度慢的原因很多 ... -
Oracle函数分类总结.
2010-09-19 15:47 1484Oracle内置SQL函数-分类整理大全F.1字符函数——返回 ... -
oracle函数详解
2010-09-19 15:31 16301、SQL 语句基础下面给出SQL语句的基本介绍。1.1、SQ ... -
mysql和sql时间 字段比较大小的问题
2010-09-19 13:46 8455不能用两个字符串比较的小的方法来做。例如:‘2010-10-2 ... -
mysql常用函数
2010-09-07 10:36 1673一、数学函数 ABS(x) ... -
mysql常用函数详解和实例
2010-09-07 10:25 3027结合MySQL自带的帮助文 ... -
sql server 2000行转化成列笔记 还有其中的错误
2010-07-21 15:12 1628select 姓名 From t1 Group By ... -
sql条件语句
2010-07-21 11:48 1948Transact-SQL 语言使用的流程控制命令与常见的程序设 ...
相关推荐
这里我们将深入探讨如何在SQL中实现这一功能,以满足“SQL随机抽取N条记录”的需求。 首先,我们需要理解SQL的基本查询结构。SQL查询通常包括SELECT语句,用于指定要从数据库中检索哪些列;FROM语句,指定数据源;...
在 Oracle 中抽取随机数是许多应用场景中常见的问题,例如在某个活动中需要随机取出一些符合条件的用户,以颁发获奖通知或其它消息。本文将通过实例讲解如何抽取随机数的多种方法。 首先,我们可以使用 Oracle 自带...
**问题**: 如何在Oracle中随机抽取前N条记录? **解答**: 可以使用`RAND`函数配合`RANK`函数来实现。 - **示例**: 抽取前5条记录: ```sql SELECT * FROM ( SELECT t.*, RANK() OVER (ORDER BY DBMS_RANDOM.VALUE...
9. **随机抽取记录**:要随机抽取前N条记录,可以结合`ROWNUM`和`ORDER BY DBMS_RANDOM.VALUE`实现。 10. **指定范围抽取记录**:从N行到M行的记录可通过子查询配合`ROWNUM`实现,如 `(SELECT * FROM table WHERE ...
25. 随机值查询处理在数据库中生成随机数据的需求,如随机数或随机抽取记录等。 在学习这些高级SQL技能的过程中,建议通过大量的实践练习,结合具体的应用场景来加深理解,从而有效地掌握这些复杂的数据库操作技术...
9. **随机抽取N条记录**:可以使用`ROWNUM`配合子查询实现,如`SELECT * FROM (SELECT * FROM table ORDER BY DBMS_RANDOM.VALUE) WHERE ROWNUM <= N`。 10. **抽取N到M行**:使用`ROWNUM`和`WHERE`子句筛选范围,...
题目表(QUESTION)应包含题目ID、题目内容、答案、分值等,便于随机抽取试题。最后,成绩表(SCORE)用于存储用户考试成绩,包括用户ID、考试ID、得分等字段。 二、创建视图 视图是数据库中的虚拟表,它根据用户...
#### 三、随机抽取N条记录 在Oracle中,随机抽取数据可以通过`SYS_GUID()`或`DBMS_RANDOM.VALUE`函数实现。以下是两种方法: 1. 使用`SYS_GUID()`函数: ```sql SELECT * FROM ( SELECT * FROM TABLENAME ORDER...
9. **随机抽取记录**:可以使用`ROWNUM`结合子查询来随机抽取前N条记录。抽取特定范围的记录可以使用`ROWNUM BETWEEN`。 10. **抽取重复记录**:使用`GROUP BY`和`HAVING`结合可以找出表中的重复记录。 11. **自治...
实例132 随机抽取数组中元素 161 实例133 二维数组的输出 162 实例134 获取数组当前的键名和值 162 实例135 检测数组中是否存在某个值 163 实例136 获取数组中的当前单元 164 实例137 从数组中随机取出元素 165 实例...
实例132 随机抽取数组中元素 161 实例133 二维数组的输出 162 实例134 获取数组当前的键名和值 162 实例135 检测数组中是否存在某个值 163 实例136 获取数组中的当前单元 164 实例137 从数组中随机取出元素 165 实例...
- **详细说明**: 常见的缺失值处理方法包括删除含有缺失值的记录、使用平均值/中位数填充等。对于半结构化数据,XML或JSON等格式提供了灵活的数据组织方式,便于使用Python等语言进行处理。 #### 12. 编程语言偏好 ...