`

获取指定表中随机一行记录

    博客分类:
  • SQL
阅读更多

来源:http://www.hxstrive.com/article/48.htm

 

1、随机排序后获取第一行

        获取随机记录的常见SQL做法,就是对查询结果进行随机排序,然后获取第一行。如:select * from bugs order by rand() limit 1;

        这种方法在数据据量非常小的时候,性能不会有什么大的影响。如果数据量非常庞大时,这将是致命的(因为你需要遍历整个表进行排序)。如果采用随机函数的返回值进行排序,则排序就跟记录本身没有任何关系,则每次排序后的数据是不一样的,这样数据的排序就不能被复用。使用随机函数排序,则不能使用数据库的索引进行排序,索引排序是非常快的。不使用索引排序的后果就是不得不遍历整张表(这是非常慢的)。随机排序的另一个问题就是,好不容易对整个数据进行了排序,但是只用了一条数据,太浪费了。

 

2、在表格ID最大和最小值之间选择一个随机数

        通过数据库或者程序中的随机函数,生成一个指定表ID最小值到最大值之间的随机数。然后将显示这个随机数指定的记录。如下:

select b1.* from bugs as b1 join (select ceil(rand()*(select max(bug_id) from bugs)) as rand_id) as b2 on (b1.bug_id = b2.rand_id);

 

注意:

    要求主键值必须从1开始到最大值,且是连续的。如果漏掉了某些值,则可能获取不到数据(缺点)。如Bugs表:

bug_id(Bug编号) name(Bug名称)

1 BugName01

2 BugName02

4 BugName04

6 BugName06

 

随机获取Bugs表中的一条记录:

select ceil(rand()*(select max(bug_id) from bugs));

有rand() * 6 ==>,如果rand()=0.9,则0.9*6=5.4,向下取整后等于5,从上面的表中可以看出bug_id=5的记录不存在。

 

3、随机找到的下一个有效值

        与上面的方案类似,但解决了表中在最小值和最大值之间存在缝隙的情况,这个查询会返回它随机找到的第一个有效的值。如下:

select b1.* from bugs as b1 join (select ceil(rand()*(select max(bug_id) from bugs)) as rand_id) as b2 where b1.bug_id>=b2.bug_id order by b1.bug_id limit 1;

 

        这个方法解决了没有随机数对应的主键值,即方法2的问题。但是在缝隙后面的第一列的选中几率会随着缝隙的增大而增大。如下:

bug_id(Bug编号) name(Bug名称)

1 BugName01

2 BugName02

100 BugName001

        在上面这章表中随机数字位于3到100之间的都将选中bug_id=100的这条记录,那么bug_id=100这条记录的选中概率将非常高。

 

注意:

    当表中数据向ID值之间的缝隙不大并且每个值要被等概率选中的重要性不高时可以考虑这种方案

 

 

 

分享到:
评论

相关推荐

    SQL随机提取N条记录

    随机抽取大量数据时,使用RAND()函数可能会导致性能问题,因为它会为表中的每行计算一个随机值。为优化性能,可以尝试在WHERE子句中添加条件,减少需要排序的行数。 7. **分页和随机性**: 如果你需要从特定位置...

    易语言源码易语言大文本文件随机读取一行内容源码.rar

    从文件开头开始,每次读取一行,记录下当前行号,直到达到随机生成的行号。这里需要注意的是,文件的行号可能与文件偏移量不完全对应,因为不同行的长度可能不同,所以可能需要多次调整偏移量来精确定位到目标行。 ...

    ms sql语句怎么样对随机记录进行排序

    3. **数据量限制**:当使用`TOP`子句时,应确保指定的记录数量不会超过表中的实际记录数,否则查询可能无法返回预期的结果。 4. **多字段排序**:在进行二次排序时,选择合适的字段组合至关重要。正确的字段顺序...

    SQL 随机抽取数据

    例如,想要从`ywle`表中抽取`ywlename`为`'001'`的记录中的10条,可以这样写: ```sql SELECT TOP 10 *, NEWID() AS Random FROM ywle WHERE ywlename = '001' ORDER BY Random; ``` 这里通过`AS Random`为`NEWID...

    随机获取oracle数据库中的任意一行数据(rownum)示例介绍

    5. **获取特定行数据**:如果要获取指定行的数据,可以结合子查询和`ORDER BY`,如`SELECT * FROM (SELECT ROWNUM r, a FROM yourtable WHERE ROWNUM ) WHERE r > 4`,这将返回经过`name`排序后的第五行数据。...

    如何从数据库中随机取出10条记录的方法

    从数据库中随机取记录的基本思路是通过添加一个随机排序字段来打乱记录的顺序,然后通过限制查询结果的数量来获取指定数量的记录。 #### 2. SQL通用方法 在大多数关系型数据库中,可以通过以下SQL语句实现: ```...

    Oracle插入数据时获取自增ID

    在插入新记录前,该触发器会自动为每一行的新记录的`id`字段赋值为序列的下一个值。这种方式更加灵活且无需在每个插入语句中显式指定序列值。 #### 获取刚插入的ID 在Oracle中,如果需要获取刚插入的数据的ID值,...

    matlab矩阵运算-《如何随机打乱 MATLAB 矩阵中的行?》教程下载

    对于二维矩阵,我们可以将其想象为表格形式,其中每一行代表一个记录,每一列代表一个属性。打乱矩阵的行意味着重新排列这些记录,而保持列的相对顺序不变。 要随机打乱矩阵的行,MATLAB提供了一个非常便捷的函数`...

    SQL操作全集(包括:随机选择记录;四表联查问题;in 的使用方法;外连接查询;子查询等等)

    外连接是指当两个表进行联接时,除了返回两个表中的匹配行外,还会返回一个表中未匹配的行。 ##### 实现方法 1. **左外连接**: ```sql SELECT t1.*, t2.* FROM table1 AS t1 LEFT OUTER JOIN table2 AS t2 ON ...

    随机显示SQL Server网络数据.pdf

    - 在SQL Server 2005及更高版本中引入了TABLESAMPLE查询语句,它允许从表中随机抽取一定数量的行或百分比的数据。例如SELECT * FROM Orders TABLESAMPLE (20 ROWS),该语句使用SYSTEM抽样方法随机选取20行数据,...

    数据库SQL经典语句(包含几乎所有的经典操作语言).doc

    15. 每组最大值:在具有相同分组字段的记录中,选择每个组的最大值。 16. 选择唯一记录:通过`EXCEPT`操作符,可以从多个表中选择唯一的、不存在于其他表中的记录。 17. 随机选择记录:`ORDER BY NEWID()`可以用于...

    mysql获取随机数据的方法

    在MySQL中,获取随机数据是一项常见的需求,但处理大规模数据时需要特别的策略,因为简单地使用`ORDER BY RAND()`可能会导致性能问题。当数据量达到百万级别时,这种做法会变得极其缓慢,因为它需要对整个表进行排序...

    MYSQL获取行号row_no

    在数据库操作中,有时候我们需要为查询结果集中的每一行添加一个行号(或行序号),类似于Oracle中的`ROW_NUMBER()`功能。然而MySQL并未直接提供与Oracle完全相同的功能,因此我们需要通过其他方式来实现这一需求。...

    大数据技术-教案设计-源数据获取-学习

    - 创建一个转换工程,随机生成整型ID和随机字符串作为名称的一行数据,并预览结果。 #### 教学方法与手段 - **讲授法**:通过PPT演示和口头讲解的方式介绍各个知识点。 - **实操演示**:教师通过实际操作展示如何...

    sql 数据库使用游标 随机插入数据

    -- 从游标中获取第一行数据 FETCH CUR2 INTO @corrd_x, @corrd_y, @spcName; -- 循环处理数据 WHILE @@FETCH_STATUS = 0 BEGIN DECLARE @ddx float; DECLARE @ddy float; -- 如果没有更多数据,则跳出循环 IF ...

    SQL精编语句实例(学习SQL必备)

    - 若要随机选择表中的记录,可以使用`ORDER BY NEWID()`,`NEWID()`函数会生成一个新的唯一标识符,从而实现随机排序。 18. **生成随机ID**: - `NEWID()`函数可以单独使用,生成一个新的全局唯一标识符(GUID)...

    易语言任意行文本读取

    4. **循环结构**:为了读取任意行,你可能需要使用循环结构(如“循环”或“条件循环”),从文件的第一行开始,通过判断每一行的内容来确定是否到达目标行。 5. **错误处理**:在进行文件操作时,应考虑可能出现的...

Global site tag (gtag.js) - Google Analytics