Oracle、MySql、SQLServer、Access等等各种数据库数据库取随机数和取随机条数

Oracle数据库

1、从表中随机取记录

 select * from (select * from staff order by dbms_random.random)      where rownum < 4

 表示从STAFF表中随机取3条记录

2、产生随机数

     SELECT DBMS_RANDOM.RANDOM FROM DUAL;          产生一个任意大小的随机数

    SELECT ABS(MOD(DBMS_RANDOM.RANDOM,100)) FROM DUAL;          产生一个100以内的随机数

     SELECT TRUNC(100+900*dbms_random.value) FROM dual;          产生一个100~1000之间的随机数

     SELECT dbms_random.value FROM dual;          产生一个0~1之间的随机数

     SELECT dbms_random.value(10,20) FROM dual;          产生一个10~20之间的随机数

     SELECT dbms_random.normal FROM dual;          NORMAL函数返回服从正态分布的一组数。此正态分布标准偏差为1,期望值为0。这个函数返回的数值中有68%是介于-1与+1之间,95%介于-2与+2之间,99%介于-3与+3之间。

3、产生随机字符串

     select dbms_random.string('P',20) from dual;          第一个参数 P 表示 printable,即字符串由任意可打印字符构成          第二个参数表示返回字符串长度

4、ceil( n )函数是返回大于或等于n的最小整数。

DBMS_RANDOM.VALUE()是随机产生( 0,1 )之间的数。
要产生两位的随机数,可以DBMS_RANDOM.VALUE()*100,这样产生( 0,100 )
的随机数,当产生( 0,10)之间的数时,只要加上10就可以保证产生的数都是两位了。

ORACLE的PL/SQL提供了生成随机数和随机字符串的多种方式,罗列如下:
1、小数( 0 ~ 1)
select dbms_random.value from dual
2、指定范围内的小数 ( 0 ~ 100 ) select dbms_random.value(0,100) from dual
3、指定范围内的整数 ( 0 ~ 100 )
select trunc(dbms_random.value(0,100)) from dual

4、长度为20的随机数字串

 select substr(cast(dbms_random.value as varchar2(38)),3,20) from dual

5、正态分布的随机数

 select dbms_random.normal from dual

6、随机字符串

 select dbms_random.string(opt, length) from dual
  opt可取值如下:       'u','U'    :    大写字母       'l','L'    :    小写字母       'a','A'    :    大、小写字母       'x','X'    :    数字、大写字母       'p','P'    :    可打印字符

7、随机日期

 select to_date(2454084+TRUNC(DBMS_RANDOM.VALUE(0,365)),'J') from dual
 通过下面的语句获得指定日期的基数
 select to_char(sysdate,'J') from dual

8、生成GUID

 select sys_guid() from dual

–生成带分隔符(-)的GUID的自定义函数 create or replace function my_guid return varchar2 is guid varchar(36); temp varchar(32); begin temp:=sys_guid(); guid:= substr(temp,1,8) || ‘-’ ||substr(temp,9,4) || ‘-’ ||substr(temp,13,4)|| ‘-’ ||substr(temp,17,4)|| ‘-’ ||substr(temp,21,12); return guid; end;

MySql数据库

一、总结

一句话总结:用随机函数newID(),select top N * from table_name order by newid() ----N是一个你指定的整数,表是取得记录的条数.
1、如何从mysql数据库中取到随机的记录(两种方法)?
2、如何取得真正的随机数(如果用rand())(多用手册,节约时间)?
二、如何从mysql数据库中取到随机的记录
三、mysql手册rand()函数

二、如何从mysql数据库中取到随机的记录

sql 的随机函数newID()和RAND()

sql server的随机函数newID()和RAND()

SELECT * FROM Northwind…Orders ORDER BY NEWID()

–随机排序

SELECT TOP 10 * FROM Northwind…Orders ORDER BY NEWID()

–从Orders表中随机取出10条记录

示例

A.对变量使用 NEWID 函数

以下示例使用 NEWID() 对声明为 uniqueidentifier 数据类型的变量赋值。在测试 uniqueidentifier 数据类型变量的值之前,先输出该值。

– Creating a local variable with DECLARESET syntax.

DECLARE @myid uniqueidentifier

SET @myid = NEWID()

PRINT 'Value of @myid is '+ CONVERT(varchar(255), @myid)

下面是结果集:

Value of @myid is 6F9619FF-8B86-D011-B42D-00C04FC964FF

注意:

NEWID 对每台计算机返回的值各不相同。所显示的数字仅起解释说明的作用。

随机函数:rand()

在查询分析器中执行:select rand(),可以看到结果会是类似于这样的随机小数:0.36361513486289558,像这样的小数在实际应用中用得不多,一般要取随机数都会取随机整数。那就看下面的两种随机取整数的方法:

1、

A:select floor(rand()*N) —生成的数是这样的:12.0

B:select cast( floor(rand()*N) as int) —生成的数是这样的:12

2、

A:select ceiling(rand() * N) —生成的数是这样的:12.0

B:select cast(ceiling(rand() * N) as int) —生成的数是这样的:12

其中里面的N是一个你指定的整数,如100,可以看出,两种方法的A方法是带有.0这个的小数的,而B方法就是真正的整数了。

大致一看,这两种方法没什么区别,真的没区别?其实是有一点的,那就是他们的生成随机数的范围:

方法1的数字范围:0至N-1之间,如cast( floor(rand()*100) as int)就会生成0至99之间任一整数

方法2的数字范围:1至N之间,如cast(ceiling(rand() * 100) as int)就会生成1至100之间任一整数

对于这个区别,看SQL的联机帮助就知了:

比较 CEILING 和 FLOOR

CEILING 函数返回大于或等于所给数字表达式的最小整数。FLOOR 函数返回小于或等于所给数字表达式的最大整数。例如,对于数字表达式 12.9273,CEILING 将返回 13,FLOOR 将返回 12。FLOOR 和 CEILING 返回值的数据类型都与输入的数字表达式的数据类型相同。

现在,各位就可以根据自己需要使用这两种方法来取得随机数了_

另外,还要提示一下各位,关于随机取得表中任意N条记录的方法,很简单,就用newid():

select top N * from table_name order by newid() ----N是一个你指定的整数,表是取得记录的条数.

access中的函数为Rnd()

SELECT top 10 表1.*, Rnd(id) AS bb FROM 表1 ORDER BY Rnd(id)

SELECT Rnd(id) as me,Rnd() as you from 表1

Select top 10 Tb_PESS_Paper.* FROM Tb_PESS_Paper orDER BY Rnd(isnull(id)*0+1);

http://blog.csdn.net/dainiao01/article/details/2865383

三、mysql手册rand()函数

RAND() RAND(N)
返回一个随机浮点值 v ,范围在 0 到1 之间 (即, 其范围为 0 ≤ v ≤ 1.0)。若已指定一个整数参数 N ,则它被用作种子值,用来产生重复序列。

mysql> SELECT RAND();

    -> 0.9233482386203

mysql> SELECT RAND(20);

    -> 0.15888261251047

mysql> SELECT RAND(20);

    -> 0.15888261251047

mysql> SELECT RAND();

    -> 0.63553050033332

mysql> SELECT RAND();

    -> 0.70100469486881

mysql> SELECT RAND(20);

    -> 0.15888261251047

若要在i ≤ R ≤ j 这个范围得到一个随机整数R ,需要用到表达式 FLOOR(i + RAND() * (j – i + 1))。例如, 若要在7 到 12 的范围(包括7和12)内得到一个随机整数, 可使用以下语句:

SELECT FLOOR(7 + (RAND() * 6));

在ORDER BY语句中,不能使用一个带有RAND()值的列,原因是 ORDER BY 会计算列的多重时间。然而,可按照如下的随机顺序检索数据行:

mysql> SELECT * FROM tbl_name ORDER BY RAND();

ORDER BY RAND()同 LIMIT 的结合从一组列中选择随机样本很有用:

mysql> SELECT * FROM table1, table2 WHERE a=b AND c<d

-> ORDER BY RAND() LIMIT 1000;

注意,在WHERE语句中,WHERE每执行一次, RAND()就会被再计算一次。

RAND()的作用不是作为一个精确的随机发生器,而是一种用来发生在同样的 MySQL版本的平台之间的可移动ad hoc随机数的快速方式。

一、总结(点击显示或隐藏总结内容)

一句话总结:用随机函数newID(),select top N * from table_name order by newid() ----N是一个你指定的整数,表是取得记录的条数.

1、如何从mysql数据库中取到随机的记录(两种方法)?
a、用rand方法:$data=Db::query(“SELECT * FROM lg_blog_question WHERE bq_id >= (((SELECT MAX(bq_id) FROM lg_blog_question)-(SELECT MIN(bq_id) FROM lg_blog_question)) * RAND() + (SELECT MIN(bq_id) FROM lg_blog_question)) LIMIT ?”,[5]);

b、用newid()方法:select top N * from table_name order by newid()

2、如何取得真正的随机数(如果用rand())(多用手册,节约时间)?
给rand加一个参数,做随机种子,这个参数可以是当前时间的时间戳

SQLServer取随机数

SQLServer获得随机数有两种方法:
一、使用rand获得随机数
二、使用Checksum结合NewID获得随机数

一、使用rand
(1)Rand()函数是系统自带的获取随机数的函数,可以直接运行select rand() 获取01之间的float型的数字,类似的,如果想获得例如1100之间的整数随机数可以运行 select round(100*rand(),0)
eg:得到60~100的随机数,小数点后保留两位

DECLARE @NumBegin Int=60    --随机数的最小值 
DECLARE @NumEnd Int=100     --随机数的最大值 
DECLARE @Decimal Int=2      --保留小数点几位 
SELECT @NumBegin+round((@NumEnd-@NumBegin)*rand(),@Decimal)

如果将2改为-1,则变成获取60~100之间的10的倍数的整数,原因在于:这里的round(表达式,长度,操作方式)函数会返回一个数值,舍入到指定的长度,这里的操作方式默认为0,操作方式为0遵循的是四舍五入,指定其他整数值则直接截断。
(返回的数值和原数值的总位数始终没有变化)
关于长度:舍入精度
a)如果长度为正数,则将数值舍入到长度指定的小数位数。
b)如果长度为负数,则将数值小数点左边部分舍入到长度指定的长度。注意如果长度为负数,并且大于小数点前的数字个数,则将返回 0。
c)如果长度为负数并且等于小数点前的数字个数且操作方式为四舍五入时,最前面的一位小于5返回0,大于等于5会导致错误出现,如果操作方法不是四舍五入时则不会出现错误,返回结果一律为0。

(2)rand()函数用在函数内部会报错“在函数内对带副作用的运算符‘rand’的使用无效”,但可以通过作为参数传参实现:
eg:

CREATE FUNCTION Scalar_CheckSumNEWIDQ  
(  
    @From int,  
    @To int,  
    @Keep int,  
    @RAND float 
)  
RETURNS float  
BEGIN    
    RETURN @From+round((@To-@From)*@RAND,@Keep)  
END  
GO 
SELECT  dbo.Scalar_CheckSumNEWIDQ(20,30,6,RAND())

这里即使参数相同,多次运行都可以得到范围内不同的随机数
二、使用Checksum结合NewID
(1) Checksum:总和检验码,校验和。在数据处理和数据通信领域中,用于校验目的的一组数据项的和。这些数据项可以是数字或在计算检验总和过程中看作数字的其它字符串。它通常是以十六进制为数制表示的形式,如果校验和的数值超过十六进制的FF,也就是255. 就要求其补码作为校验和.通常用来在通信中,尤其是远距离通信中保证数据的完整性和准确性

(2) 在SQLServer中Checksum()需要传入1个参数,可以是任何类型
eg:

SELECT CHECKSUM(1)          --1  
SELECT CHECKSUM('A')        --114  
SELECT CHECKSUM('AA')       --34472462  
SELECT CHECKSUM(GETDATE())  --18516390

可以看出传入不同参数就有不同的返回值,每个参数的返回值都是固定的,而且还有可能会出现负数的,并看不出有什么规律

(3)因此,我们可以通过传入newid()来获得随机数,因为newid()每次获得的值都是唯一的随机的。
eg:

SELECT CHECKSUM(NEWID()) UNION ALL
SELECT CHECKSUM(NEWID()) UNION ALL
SELECT CHECKSUM(NEWID()) UNION ALL
SELECT CHECKSUM(NEWID()) 

结果是
在这里插入图片描述
注:这里的UNION ALL只是结果集的堆叠输出,要与之区别的还有union:
1.union会去除结果集中重复的部分,相当于进行一个distinct(去重),并且union 会自带排序功能;
2.union all 会不管是否重复,都会将结果合并在一起输出,没有排序功能,只是结果集的堆叠输出
(4)在函数中的使用,也只能通过传参的方法
eg:

CREATE FUNCTION aaa  
(  
    @From int,  
    @To int,  
    @Keep int,  
    @newid varchar(50)  
)  
RETURNS float  
BEGIN  
    DECLARE @ResultVar float  
    SELECT @ResultVar=CONVERT(BIGINT,RIGHT(ABS(CHECKSUM(@newid)),9))*0.1/100000000  
    RETURN @From+round((@To-@From)*@ResultVar,@Keep)  
END  
SELECT  dbo.aaa(20,30,6,'NEWID()')

由于CHECKSUM()得到的数是固定的,所以同一组参数多次运行出现的结果是相同的

注:ABS() 绝对值函数
RIGHT(表达式,n) 取表达式从右数起n个字符
CONVERT() 数据类型转换
9与*0.1/100000000 对应,使得@ResultVar随机得到的数是0~1之间的数,类似于函数rand()的功能

三、两种方法的比较

(1)稍加处理,CHECKSUM也可以当作rand来使用
eg:从结果看出都可以得到随机数

SELECT CHECKSUM=CONVERT(BIGINT,RIGHT(ABS(CHECKSUM(NEWID())),9))*0.1/100000000 ,RAND=RAND()  UNION ALL
SELECT CHECKSUM=CONVERT(BIGINT,RIGHT(ABS(CHECKSUM(NEWID())),9))*0.1/100000000 ,RAND=RAND()  UNION ALL
SELECT CHECKSUM=CONVERT(BIGINT,RIGHT(ABS(CHECKSUM(NEWID())),9))*0.1/100000000 ,RAND=RAND()  UNION ALL
SELECT CHECKSUM=CONVERT(BIGINT,RIGHT(ABS(CHECKSUM(NEWID())),9))*0.1/100000000 ,RAND=RAND() 

结果为
在这里插入图片描述
(2)但rand函数有个弊端,若我们想在一张表的每一元组后面生成一个唯一的随机数时(即在表中添加一列随机数),只能用CHECKSUM和NEWID来实现
原因在于:使用rand会出现相同的随机数,然而这并不是我们想要的
eg:

 SELECT *,RAND() '随机数' FROM Product

结果为:
在这里插入图片描述

SELECT *,NEWID() '随机数' FROM Product

结果为:
在这里插入图片描述
类似的:

SELECT id ,CHECKSUM=CONVERT(BIGINT,RIGHT(ABS(CHECKSUM(NEWID())),9))*0.1/100000000 ,RAND=RAND() from Product

得到的结果是:
在这里插入图片描述

Access 数据库

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

从入门小白到小黑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值