仅为个人学习笔记

ABS函数

在数据库获取数据时通常会遇到负数的情况,但客户要求的是不能有负数,那么可以使用abs函数进行处理

ABS 函数 返回一个数值的绝对值 |x|

select ABS(-3)

返回结果 3

随机函数

RAND随机函数

Rand()函数是获取随机数的函数,可直接运行select rand() 获取0~1之间float型的数字。
如果想要获取0~100之间的整数随机数,可以这样使用

select round(100*rand(),0)

为方便使用,下面延伸了一个方法:

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

这个方法通过传入最大值和最小值以及返回数保留几位小数,来获取对应的随机值。上面这个例子执行结果是获取60和100之间的随机数保留两位小数,如果将2改为-1,则变成获取60~100之间的10的倍数的整数,不信可以尝试一下!

其实rand函数有个弊端,获取的随机数可能是重复的。这并不是我们想要的结果。
如果换成是newid试试,就不会出现重复。
为什么会出现这样的结果?
一样的sql语法,使用newid出来的结果是“真随机”,而用rand出来的结果却是“伪随机”。
而我们需要的是一串纯数字,用newid出来的结果并不方便处理。所以,针对这种情景,我们还有一个方式获得随机数,那就需要引入另外一个函数 checksum 了,checksum可以和newid结合使用产生随机数。



Checksum(Newid()获取随机数(区别于Rand)

前面有介绍rand获取随机数的方法,因为rand本身有一个无法避免的尴尬问题,所以需要引入checksum结合newid的方法来获取随机数!

在此之前,先简单了解一下checksum吧!
Checksum:总和检验码,校验和。在数据处理和数据通信领域中,用于校验目的的一组 数据项的和。这些数据项可以是数字或在计算检验总和过程中看作数字的其它字符串。它通常是以十六进制为数制表示的形式, 如果校验和的数值超过十六进制的FF,也就是255. 就要求其补码作为校验和.通常用来在通信中,尤其是远距离通信中保证数据的完整性和准确性。
在SQLServer中Checksum()需要传入1个参数,可以是任何类型,如下示例:

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

可以看出,传入不同参数就有不同的返回值,每个参数的返回值都是固定的,而且还有可能会出现负数的,几乎看不出有什么规律~
因此,我们可以通过传入newid()来获得随机数,因为newid()每次获得的值都是唯一的随机的。
可以以此验证一下:

SELECT CHECKSUM(Newid()) union all
SELECT CHECKSUM(Newid()) union all
SELECT CHECKSUM(Newid()) union all
SELECT CHECKSUM(Newid())

返回值即为随机数。


稍加处理,就可以当作rand来使用了,而且还避免了在某些情景下rand获得一堆重复的随机数的尴尬局面:

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()

可以和Rand放在一起比较,看起来区别不大。

下面有一张临时表,只有id一个字段,我用checksum和rand两种方法分别给每个id附上一个随机数:

看出问题所在了吧!rand获得的随机数都是一样的,而checksum结合newid的方法获得的随机数才是我们想要的!

下面延伸一个方法,供将来有需要获得随机数的时候使用!新建一个标量值函数,通过传入参数最大值、最小值、保留几位小数、以及newid()来获得随机数:

Create FUNCTION Scalar_CheckSumNEWID
(@From int,@To int,@Keep int,@newid varchar(50)
)
RETURNS float
BEGINDECLARE @ResultVar floatSELECT @ResultVar=CONVERT(BIGINT,RIGHT(ABS(CHECKSUM(@newid)),9))*0.1/100000000RETURN @From+round((@To-@From)*@ResultVar,@Keep)
END
GO

注:newid之所以要放在传入参数中,是因为想newid和rand之类的不能放在函数的本身执行,只能通过传入参数带入

随机实例操作

向上取整随机整数

select cast (floor(rand()*80) AS datetime ) AS 大头儿子

向下取整随机整数

select  CEILING(rand()*100) as 小头爸爸

生成一段范围内的随机数字

declare@Result float DECLARE @Upper float DECLARE @Lower float SET @Lower = 50 SET @Upper = 100 SELECT @Result = ROUND(((@Upper - @Lower -1) * RAND() + @Lower), 3) SELECT @Result

生成一段时间内的随机时间

declare @Date_start datetime declare @Date_end datetime set @Date_start= '2021-01-01' set @Date_end=getdate() select 时间=dateadd(minute,abs(checksum(newid()))%(datediff(minute,@Date_start,@Date_end)+1),@Date_start)

这里我们引用到另一个时间差值函数

在下一篇笔记里讲

SQL中的随机函数-笔记相关推荐

  1. 【Flink】Flink 源码阅读笔记(18)- Flink SQL 中的流和动态表

    1.概述 转载:Flink 源码阅读笔记(18)- Flink SQL 中的流和动态表

  2. pl/sql 中关于exception的学习笔记

    1.异常的优点 如果没有异常,在程序中,应当检查每个命令的成功还是失败,如 BEGIN SELECT ... -- check for 'no data found' error SELECT ... ...

  3. sql 减法_SQL学习笔记整理(持更)

    从零开始学习SQL,在这里分享自己的笔记,主要通过自己看的.做的例题映射知识点.入门级SQL 应知应会Key Point与例题.虽然这个笔记不是最全面深入的,但一定必含小白入门必懂基础要点(非常基础) ...

  4. SQL零基础学习笔记(一)

    真的不知道我写了这么多不同的的学习笔记又没用..开始SQL零基础学习笔记 百度百科:SQL(Structured Query Language)结构化查询语言,是一种数据库查询和程序设计语言,用于存取 ...

  5. 使用集成SOA网关的PL / SQL中的REST

    使用集成SOA网关的PL / SQL中的REST Oracle电子商务套件集成SOA网关(ISG)是一款开箱即用的模块,支持在Oracle Integration Repository中发布支持的接口 ...

  6. thinkphp mysql存储过程_MySql存储过程的创建与使用及在thinkphp中如何调用笔记

    学习sql的存储过程,笔记总结如下: MySQL默认将分号,即";"作为语句的分隔符.如果是这样的话,则一个存储过程将很难正常创建,因为它的BEGIN和END之间可以是任意数量的S ...

  7. SQL常用用法相关笔记

    SQL常用用法相关笔记 1).----CAST和CONVERT的用法 SQL中的cast和convert都是用来将一种数据类型的表达式转换为另一种数据类型的表达式. CAST和CONVERT提供相似的 ...

  8. oracle同sql中isnull无法,SQL中的ISNULL函数使用介绍

    这篇文章主要为大家详细介绍了SQL中的ISNULL函数使用介绍,具有一定的参考价值,可以用来参考一下. 感兴趣的小伙伴,下面一起跟随512笔记的小编两巴掌来看看吧! ISNULL 使用指定的替换值替换 ...

  9. SQL及Excel函数笔记2022

    @[TOC](SQL及Excel函数笔记2022) Excel函数 使用场景:OA单据没有对应类型编码code 需要在表格中快速匹配出想要的输出可以使用一下IF函数 Excel if 公式使用 =IF ...

  10. SQL 中的 NULL 原来是这么回事

    在日常使用数据库时,你在意过NULL值么? 其实,NULL值在数据库中是一个很特殊且有趣的存在,下面我们一起来看看吧: 在查询数据库时,如果你想知道一个列(例如:用户注册年限 USER_AGE)是否为 ...

最新文章

  1. MySQL常见面试题解析
  2. oracle reverse 反转函数
  3. linux信号使用,linux信号使用注意事项
  4. 成功解决AttributeError: 'DataFrame' object has no attribute 'tolist'
  5. Java静态域与静态方法
  6. django12:form 组件/渲染标签/数据校验/钩子函数/
  7. Java中的注解以及应用 @Deprecated @SupressWarning @Override
  8. SQL2008无法连接到(local),该账户当前被锁定,所以Sa用户登陆失败
  9. SpringCloud 从菜鸟到大牛之六 消息和异步 MQ
  10. python 字典处理_Python 6 个字典操作你必须知道
  11. break 和 continue
  12. Atitit  hre框架v5 新特性  HREv5
  13. 盘点那些没用的上网小技巧-主流直播平台直播源的获取(适用potplayer)
  14. 智能手机和平板电脑设计中的单键开/关机和复位的智能方案
  15. java mail张_javaMail操作QQ邮箱发送邮箱 Demo
  16. ccf201809-2买菜
  17. 7-2 二叉搜索树的删除操作
  18. 网站内嵌百度地图定向到公司位置
  19. python泊松分布_常见概率分布的Python实现
  20. pmp-关键路径法之顺推和逆推

热门文章

  1. 如何注册阿里大于申请签名和短信模板
  2. windows10系统插耳机有回声解决办法?
  3. wiresshark抓包
  4. Python入门-网络编程
  5. 毕达哥拉斯定理a^2 + b^2 =c^2
  6. 核磁共振设备工作过程人体温度监控中应用的光纤温度传感器
  7. Golang:后台管理系统Revel搭建教程
  8. ORACLE 完美卸载
  9. HDU 1069 Monkey and Banana(二维偏序LIS的应用)
  10. 显卡驱动卸载工具DDU