热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

Oracle学习笔记之数据库获取随机的n条记录

Oracle学习笔记之数据库获取随机的n条记录最近在做公司的车联网服务系统,碰到一个需求,需要从数据库中获取随机的n条记录。我参照了《SQLCOOKBOOK》中提供的解决方案,现记笔记如下,分享给大家。www.2cto....SyntaxHighlighter.all();

Oracle学习笔记之数据库获取随机的n条记录
 
最近在做公司的车联网服务系统,碰到一个需求,需要从数据库中获取随机的n条记录。
我参照了《SQL COOKBOOK》中提供的解决方案,现记笔记如下,分享给大家。
  www.2cto.com  
解决方案
      使用DBMS支持的内置函数来产生随机数值。在ORDER BY字句中使用该函数,对记录进行随机排序,然后,使用ROWNUM限制返回的行(顺序随机)的数目。
 
探索步骤
1.查找满足条件的行
1 select  ename,job,sal from emp where sal>2000 
查询结果如下:
 
 
2.使用ORACLE支持的内置函数对记录进行排序
1 select  ename,job,sal from emp where sal>2000  order by dbms_random.value
查询结果如下:


 
 (每次生成的记录排序不同)
 
3.限制返回的行的数目
1 select * from 
2     (
3     select  ename,job,sal from emp where sal>2000  order by dbms_random.value
4     ) t 
5    where  rownum<=5;
查询结果如下:


 
 (每次生成的记录及排序不同)
 
拓展知识
1.关于ROWNUM
       许多数据库提供一些语句,比如FETCH FIRST和LIMIT,让用户指定从查询中返回的行数,Oracle的做法则不同,必须使用ROWNUM函数来得到每行的行号(从1开始递增数值)。
 
       在使用ROWNUM<=5来返回前5行时,会发生下面的操作:
 
Oracle执行查询
Oracle获取第1个符合条件的行,将它叫做第1行。
有5行了吗?如果没有,那么Oracle就再返回行,因为它要满足行号小于等于5的条件,如果到了5行,那么,Oracle将不再返回行。
Oracle获取下一行,并递增行号(从2,到3,再到4,等等)。
返回第3步。
 
       可以看到,Oracle的ROWNUM数值是在获取每行之后才赋予的,这非常重要,是一个关键点。比如说,许多Oracle开发人员想通过指定ROWNUM=5来返回第5行,这是错误的做法。下面说明使用ROWNUM=5会发生什么:
 
Oracle执行查询。
Oracle获取第一个符合条件的行,将它叫做第1行。
有5行了吗?如果没有,那么Oracle就丢弃这些行,因为它不满足条件。如果到了5行,那么,Oracle就返回该行。但是,答案是,永远也不会有"到了5行"的情况发生。
Oracle获取下一行,这是第一行。原因是,从查询中返回的必须是编号为1的行。
转向第3步。
      仔细看看这个过程,可以知道使用ROWNUM=5来返回第5行失败的原因。如果不返回第1行到第4行的话,就不会有第5行。
 
     ROWNUM=1确实是返回第1行,这似乎与前面的说明矛盾了。原因是,ROWNUM=1返回第1行,不管表中是否有行,Oracle都会尝试至少取1行。请仔细看前面叙述的过程,将5换成1,就可以理解指定ROWNUM=1作为条件来返回1行为什么是可行的了。
 
    如果要获取指定行数范围内的记录,可以采用分页查询的方式。
 
2.关于DBMS_RANDOM
      一个简单的示例,如下图所示:
 
 1 --DBMS_RANDOM
 2 --该包提供了内置的随机数生成器,可以用于快速生成随机数。
 3 --1.INITALIZE 该过程用于初始化DBMS_RANDOM包。在初始化DBMS_RANDOM包时,必须要提供随机数种子
 4 --2.SEED 该过程用于复位随机数种子
 5 --3.RANDOM 该过程用于生成随机数
 6 --4.TERMINATE 该过程用于关闭DBMS_RANDOM包
 7 --随机数使用示例
 8 DECLARE
 9    num INT;
10    seed NUMBER:=10000000;
11 BEGIN
12    dbms_random.initialize(seed);
13    FOR i IN 1..10 LOOP
14        num:=abs(dbms_random.random()/seed);
15        dbms_output.put_line(num);
16    END LOOP;
17    dbms_random.terminate;
18 END;
 
运行结果如下:
 

 

推荐阅读
  • 本文深入探讨了在MySQL数据库中利用innobackupex工具进行备份,并结合binlog日志实现数据库的完整恢复过程。适合对数据库管理和维护有一定需求的技术人员阅读。 ... [详细]
  • Pikachu SQL注入实战解析
    作为一名网络安全新手,本文旨在记录个人在SQL注入方面的学习过程与心得,以备后续复习之用。通过逐步深入的学习,力求掌握每个知识点后再向下一个挑战迈进。 ... [详细]
  • 自SQL Server 2005以来,微软的这款数据库产品逐渐崭露头角,成为企业级应用中的佼佼者。本文将探讨SQL Server 2008的革新之处及其对企业级数据库市场的影响。 ... [详细]
  • 深入解析Apache SkyWalking CVE-2020-9483 SQL注入漏洞
    本文详细探讨了Apache SkyWalking中的SQL注入漏洞(CVE-2020-9483),特别是其影响范围、漏洞原因及修复方法。Apache SkyWalking是一款强大的应用性能管理工具,广泛应用于微服务架构中。然而,该漏洞使得未经授权的攻击者能够通过特定的GraphQL接口执行恶意SQL查询,从而获取敏感信息。 ... [详细]
  • 使用RODBC库将数据导入R时遇到的问题:如何在长查询中传递变量而不产生换行符。 ... [详细]
  • 本文旨在探讨机器学习与数据分析之间的差异,不仅在于它们处理的数据类型,还包括技术背景、业务应用场景以及参与者的不同。通过深入分析,希望能为读者提供清晰的理解。 ... [详细]
  • 导入大csv文件到mysql(CSV导入) ... [详细]
  • 当 MySQL 的 autocommit 设置为 1 时,如果在一个事务中执行了 DDL 语句,那么该事务中从开始到执行 DDL 语句之前的所有 DML 操作将自动提交。随后的 DML 操作则需要在新的事务中进行。 ... [详细]
  • 本文档详细介绍了2017年8月31日关于MySQL数据库备份与恢复的教学内容,包括MySQL日志功能、备份策略、备份工具及实战演练。 ... [详细]
  • NIO 通道接口详解
    本文介绍了NIO(New Input/Output)中的通道接口及其相关概念,包括通道的基本功能、接口设计以及各类通道接口的具体用途。通过本文,读者可以深入了解NIO通道的设计原理及其在实际项目中的应用。 ... [详细]
  • 深入探讨PHP中的输出缓冲技术(Output Buffering)
    本文深入解析了PHP中输出缓冲(Output Buffering)的原理及其在Web开发中的应用,特别是如何通过输出缓冲技术有效管理HTTP头部信息,提高代码的灵活性与健壮性。 ... [详细]
  • 本文详细介绍了如何解决Oracle数据库中出现的ORA-28002错误,即密码将在1天内过期的问题,包括原因分析及解决方案。 ... [详细]
  • 本文提供了一套实用的方法论,旨在帮助开发者构建能够应对高并发请求且易于扩展的Web服务。内容涵盖了服务器架构、数据库管理、缓存策略以及异步处理等多个方面。 ... [详细]
  • 作为一名计算机科学专业的大三学生,我在过去的一年里自学了Visual Basic (VB),但感觉进展缓慢。VB的学习是否仅仅局限于控件的使用?如何有效地学习API?此外,有人认为Basic语言已经过时,这对VB的未来意味着什么? ... [详细]
  • 本文探讨了在Python中利用sqlite3库创建或重定义SQLite函数的方法,包括自定义函数和修改现有函数的行为。 ... [详细]
author-avatar
丹愿人常久6688
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有