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 al 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 al 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语句转oracleMySql数据库
⼀、总结
⼀句话总结:⽤随机函数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);
三、mysql⼿册rand()函数
RAND() RAND(N)jquery的ui框架有什么
返回⼀个随机浮点值 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
sql数据库导入脚本方法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() 获取0100之间的整
1之间的float型的数字,类似的,如果想获得例如1
数随机数可以运⾏ 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())
这⾥即使参数相同,多次运⾏都可以得到范围内不同的随机数
linux系统安装360wifi⼆、使⽤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:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论