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

本文介绍了SQL中生成随机数的两种方法:使用RAND()函数和NEWID()函数,并通过实例展示了如何在查询中实现随机排序及随机选择记录。同时对比了两者之间的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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之间任一整数

[color=blue]rand()和newid()区别:
1、rand()每个查询只调用一次,所有行会得到相同的rand值,而newid(),每一行都会单独计算newid的值[/color]

注意:
1、newid函数不保证在同一台机器上生成的新GUID大于上一次生成的GUID。如果你需要这样生成GUID,应该使用新的NEWSEQUENTIALID()函数.
2、newsequentialid() 内置函数只能在 CREATE TABLE 语句或 ALTER TABLE 语句中 'uniqueidentifier' 类型的列的 DEFAULT 表达式中使用。不能与其他运算符一起用来构成复杂的标量表达式。
<think>好的,我现在需要回答用户关于在SQL中使用随机函数生成随机数的问题。首先,我得回忆一下不同数据库系统中随机函数的使用方法,比如SQL Server、MySQL、Oracle等,因为它们可能有不同的函数语法。 用户提到了引用[1][2],其中引用[1]讲的是SQL Server生成指定范围的随机数,而引用[2]是关于PL/SQL的有名块语法,包括自定义函数存储过程。可能需要结合这些信息来回答。 首先,我需要确认各个数据库的随机函数。比如,SQL Server使用RAND(),可能还需要结合CHECKSUM(NEWID())来生成随机数。而MySQLRAND()函数可以直接使用,Oracle可能是DBMS_RANDOM包。然后生成指定范围的随机数通常涉及调整随机数到所需区间,比如乘以范围大小并加上最小值。 接下来,用户可能需要具体的示例,比如生成0到1之间的随机小数,者生成某个整数范围内的随机数。此外,可能还需要提到如何在不同数据库中实现,比如在Oracle中使用DBMS_RANDOM.VALUE,者在PostgreSQL中使用RANDOM()函数。 另外,需要注意用户提到的引用内容,引用[1]中提到生成指定范围的随机数,可能需要详细说明如何从0到1的小数扩展到特定范围。例如,生成a到b之间的数可以用公式:随机数*(b-a) + a。如果是整数,可能需要使用FLOORCEIL函数。 还需要考虑性能问题,比如在SQL Server中使用NEWID()可能影响性能,因为会导致行排序变化。此外,用户可能想知道如何创建自定义函数来简化随机数的生成,这时候可以结合引用[2]中的存储过程自定义函数的方法,比如在PL/SQL中创建函数来返回随机数。 最后,应该总结不同数据库的实现方法,并给出相关的问题,帮助用户进一步学习。例如,如何在不同数据库中生成随机整数,者如何确保随机数的均匀分布等。</think>在 SQL 中生成随机数的方法因数据库系统不同而有所差异。以下是常见数据库的实现方式及示例: --- ### 一、通用随机函数实现原理 SQL 中通常通过内置函数生成 $[0,1)$ 范围内的随机小数,再通过数学运算转换到目标范围。例如生成 $[a,b)$ 范围的公式为: $$随机数 = a + (b-a) \times 随机小数$$ 若需要整数,则需结合 `FLOOR()` `CEIL()` 函数处理[^1]。 --- ### 二、各数据库具体实现 #### 1. **SQL Server** - 生成随机小数: ```sql SELECT RAND(); -- 生成[0,1)随机数 SELECT RAND()*(100-50)+50; -- 生成[50,100)随机数 ``` - 生成随机整数: ```sql SELECT FLOOR(RAND()*(100-50+1))+50; -- 生成50-100的整数 -- 使用NEWID()实现表内随机排序 SELECT TOP 10 * FROM table ORDER BY NEWID(); ``` #### 2. **MySQL** - 生成随机小数: ```sql SELECT RAND(); -- 基础随机数 SELECT RAND()*(200-150)+150; -- 生成[150,200)随机数 ``` - 生成随机整数: ```sql SELECT FLOOR(RAND() * (100 - 50 + 1)) + 50; -- 50-100整数 ``` #### 3. **Oracle** - 使用 `DBMS_RANDOM` 包: ```sql SELECT DBMS_RANDOM.VALUE(10, 20) FROM DUAL; -- 10到20的小数 SELECT TRUNC(DBMS_RANDOM.VALUE(50, 100)) FROM DUAL; -- 50-99整数 ``` #### 4. **PostgreSQL** - 标准随机函数: ```sql SELECT RANDOM(); -- 生成[0,1)随机数 SELECT (RANDOM()*(100-50))+50; -- 50-100随机数 ``` --- ### 三、高级应用示例 #### 生成随机字符串(Oracle): ```sql SELECT DBMS_RANDOM.STRING('A', 10) FROM DUAL; -- 10位字母字符串 ``` #### 创建可复用的随机函数(PL/SQL)[^2]: ```sql CREATE OR REPLACE FUNCTION get_random_int( min_val INT, max_val INT ) RETURN INT IS BEGIN RETURN FLOOR(DBMS_RANDOM.VALUE(min_val, max_val+1)); END; / -- 调用示例 SELECT get_random_int(1,100) FROM DUAL; ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值