oracle max min 其他字段,Oracle的dbms_random.value(min,max)函数包括边界值吗?数据是如何分布的?...

事先申明下,我的DB环境是Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production,不保证在其它版本下也是同样的结果。

正文:

为了验证dbms_random.value是否包括边界值,我特意给下表填充了随机值,表结构是这样的:

CREATE TABLEtb_score

(

idNUMBER not null primary key,

studentidint not null,

courseidint not null,

scoreint not null)

大家只要关注courseid字段就好,其它与本次验证无关。

为了给此表充值(也就是装填数据,充值这个词用在这真是太好了),我使用了以下sql:

Insert intotb_scoreselect rownum,dbms_random.value(0,100000),dbms_random.value(1,5),dbms_random.value(0,150) fromdual

connectby level<=10000

order by dbms_random.random

执行完别忘了commit一下。

用以上语句,我给tb_score表的courseid字段填充了1~5的随机值,那么填完的一万条数据里,courseid字段里会是1~4,还是1~5,还是其它情况呢?

我用下面sql语句查了查:

SQL> select count(*) from tb_score where courseid=1;COUNT(*)----------

1258SQL> select count(*) from tb_score where courseid=2;COUNT(*)----------

2498SQL> select count(*) from tb_score where courseid=3;COUNT(*)----------

2492SQL> select count(*) from tb_score where courseid=4;COUNT(*)----------

2499SQL> select count(*) from tb_score where courseid=5;COUNT(*)----------

1253

另外还用下面SQL看看有无例外情况:

SQL> select count(*) from tb_score where courseid>5 or courseid<1;COUNT(*)----------

0

现在可以得出结论了,Oracle的dbms_random.value(min,max)函数是完全包括上下限,也就是边界值。如模拟学生考分的随机数,就可以用dbms_random.value(0,100)来做,只要数据量够大,0和100的边界值是都会出现的。

同时我们也发现了,dbms_random.value(1,5)的数据分布并不均匀,其中边界值1和5的加起来才达到2,3,4相同的级别,也就是说oracle把随机数据分成了四份,处于中间的2,3,4各享一份,剩下一份由1,5均分!

不知道oracle内部为什么要这么做,产生这样不均匀的数据分布是会给使用者带来一些困扰的,对此不可不知。

2020年1月23日

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值