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

SQL随机数生成与应用
本文介绍了SQL中生成随机数的两种方法:使用RAND()函数和NEWID()函数,并通过实例展示了如何在查询中实现随机排序及随机选择记录。同时对比了两者之间的区别。
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中的RAND函数。用户询问的是RAND随机函数的使用方法。根据引用,我们知道RAND函数用于生成随机数,且是伪随机数。下面我将详细说明。 引用[1]提到:Rand()函数是获取随机数的函数,可直接运行select rand() 获取0~1之间的float型的数字。 引用[2]说明:RAND()函数生成的随机数是伪随机数,通过算法生成。如果在查询中多次调用RAND()而不设置种子,每次调用都会返回新的随机数。使用相同的种子则得到可预测的序列。 引用[3]介绍了Hive中rand()的用法,同样说明指定种子会得到不变的随机数。 引用[4]提到了CEILINGFLOOR函数,这两个函数在处理由RAND生成的随机数时可能有用,用于取整。 因此,我们可以这样组织回答: 1. 基本用法:生成0到1之间的随机浮点数。 2. 指定种子:生成可重复的随机数序列。 3. 生成指定范围的随机整数:通常结合乘法、加法以及取整函数(如FLOOR, CEILING, ROUND)来实现。 4. 注意点:伪随机性,以及在不同数据库中的使用差异。 由于引用中提到了不同的数据库(SQL Server, Hive),但用户没有明确指定数据库,我们以标准SQL为基础,同时说明不同数据库可能存在的差异。 我们参考引用[1][2]中的例子: - 生成0~100之间的随机整数:可以使用 `FLOOR(RAND() * 100) + 1`(生成1到100的整数)者 `ROUND(100 * RAND(), 0)`(四舍五入取整,但注意这样0100的概率会减半)[^1][^2]。 - 注意:使用FLOOR函数时,通常乘以范围大小并加上偏移量。 另外,引用[3]中Hive的示例表明,rand()可以指定种子,这在需要重现随机序列时有用。 因此,回答将包括: - RAND函数的基本语法 - 生成随机浮点数 - 生成随机整数(包括不同范围) - 设置种子 - 注意事项(伪随机性、性能、数据库差异) 最后,根据要求生成相关问题。 注意:在标准SQL中,RAND()函数并不是所有数据库都支持,但大多数主流数据库都实现了。在MySQLSQL Server、PostgreSQL等中都有,但语法可能略有不同。 </think> ### SQL RAND() 随机函数详解与使用指南 `RAND()` 是 SQL 中生成随机数的核心函数,用于获取 **0~1 之间的随机浮点数**(包含 0 但不包含 1)。以下是详细使用方法: --- #### 一、基础用法 ```sql -- 生成 0~1 之间的随机浮点数 SELECT RAND() AS RandomNumber; -- 结果示例 → 0.5577432776034763 [^1][^3] ``` --- #### 二、设置随机种子 通过指定种子值可获得**可重现的随机序列**(适用于测试场景): ```sql -- 固定种子生成可预测随机数 SELECT RAND(123) AS FixedSeed1, -- 始终返回相同值 RAND(123) AS FixedSeed2; -- 与FixedSeed1结果相同 [^2][^3] ``` --- #### 三、生成随机整数 结合数学运算生成特定范围的整数: ```sql /* 生成 1~100 的随机整数 */ SELECT FLOOR(RAND() * 100) + 1 AS RandomInt; -- 使用 FLOOR 确保整数 [^2][^4] /* 生成 0~999 的随机整数 */ SELECT CAST(RAND() * 1000 AS INT) AS RandomInt; ``` > ⚠️ 重要区别: > - `FLOOR(x)`:向下取整(最大整数 ≤ x) > - `CEILING(x)`:向上取整(最小整数 ≥ x) > - `ROUND(x,0)`:四舍五入取整 [^4] --- #### 四、高级应用场景 1. **随机排序查询结果** ```sql SELECT * FROM Employees ORDER BY RAND(); -- 每次执行顺序不同 ``` 2. **随机抽样数据** ```sql -- 抽取10%的样本 SELECT * FROM Sales WHERE RAND() < 0.1; ``` 3. **生成测试数据** ```sql -- 插入100条随机价格订单 (10~1000) INSERT INTO Orders(price) SELECT FLOOR(RAND(CHECKSUM(NEWID())) * 990) + 10 FROM GenerateSeries(1,100); ``` --- #### 五、注意事项 1. **伪随机性** 生成的随机数基于算法(非真随机),对安全敏感场景不适用 [^2] 2. **性能影响** 在大型数据集使用 `ORDER BY RAND()` 会导致全表扫描 3. **数据库差异** | 数据库 | 语法 | 备注 | |--------------|-------------------------|--------------------------| | MySQL | `RAND()` / `RAND(N)` | 支持种子参数 | | SQL Server | `RAND()` / `RAND(seed)`| 同MySQL | | PostgreSQL | `RANDOM()` | 函数名为RANDOM() | | Oracle | `DBMS_RANDOM.VALUE()` | 需使用专用包 | --- #### 六、替代方案(避免性能问题) ```sql /* 高效随机抽样 (SQL Server) */ SELECT TOP 10 * FROM Products TABLESAMPLE (100 ROWS); /* 高效随机排序 (MySQL) */ SELECT * FROM Users ORDER BY RAND() LIMIT 5; -- 小数据集适用 ``` > 💡 最佳实践: > 大数据集优先使用 `TABLESAMPLE` `WHERE RAND() < n` 过滤,避免直接排序
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值