MySQL数据库中随机获取一条或多条记录

2023-11-18

在开发过程中遇到了一个问题,使用MySQL数据库,用SQL语句在表中随机获取一条或多条数据,看似简单,但是往深层研究的话还是很有深度的,查了好多资料,接下来给大家分享一下: 

1. 随机获取单条数据

SELECT * FROM table_name ORDER BY RAND() LIMIT 1;

MySQL中的RAND()函数调用可以在0和1之间产生一个随机数。

这条SQL语句可以随机取出一条数据,而且将limit 1改为获取多条数据,得到的数据也是随机的。但是,在MYSQL的官方手册,里面针对RAND()的提示大概意思就是,在ORDER BY从句里面不能使用RAND()函数,因为这样会导致数据列被多次扫描。导致效率相当的低!但是在MYSQL 3.23版本中,仍然可以通过ORDER BY RAND()来实现随机。

尽量不用这种写法!

2. 随机获取单条数据

  1.  

    SELECT * FROM table_name AS t1 JOIN (SELECT ROUND(RAND()*((SELECT MAX(id)

  2.  

    FROM table_name)-(SELECT MIN(id) FROM table_name))+(SELECT MIN(id)

  3.  

    FROM table_name)) AS id)AS t2 WHERE t1.id>=t2.id ORDER BY t1.id LIMIT 1;

简写版:

  1.  

    SELECT * FROM table_name AS t1 JOIN (SELECT ROUND(RAND()*(SELECT MAX(id)

  2.  

    FROM table_name)) AS id) AS t2 WHERE t1.id>=t2.id ORDER BY t1.id LIMIT 1;

简化的写法将表中的MIN(id)看做0,是对整个数据表进行操作,而第一条可以对某一范围的数据进行操作,视情况而定。

在MySQL中,ROUND()函数用于数据的四舍五入。

这条sql语句的执行效率相当的高,但是,将limit 1改为获取多条数据后,取出的数据不是随机的,原因是order by引起的,

order by将t1.id给排序了,因此获取到的数据不是随机的。

如果是随机获取单条数据的话适用,获取多条的话不适用!

3.随机获取单条或多条数据

  1.  

    SELECT * FROM table_name as t1 WHERE t1.id>=(RAND()*((SELECT MAX(id) FROM

  2.  

    table_name)-(SELECT MIN(id) FROM table_name))+(SELECT MIN(id) FROM table_name)) LIMIT 1;

简写版:

SELECT * FROM table_name as t1 WHERE t1.id>=(RAND()*(SELECT MAX(id) FROM table_name))LIMIT 1;

简写效果同上,视情况而定。

这条sql语句的执行效率也是非常高,将limit 1改为获取多条数据,效率也是很高,而且得到的数据是随机的。

随机获取单条或多条数据都适用!

总结:语句1的效率低下,切忌使用,不过在数据量少,MYSQL版本支持的情况下可以使用;
            语句2的效率高,在随机取出一条记录的情况下可以使用;
            语句3的效率也高,在随机取出一条或多条记录的情况下都可以使用,不过在取出一条记录时优先使用语句2,因为采用        JOIN的语法比直接在WHERE中使用函数效率还是要高一些的。

注:语句2和语句3在操作数据库时,数据都是同一种类型或者某一类型的数据是连续存放在一起的,否则取出的数据可能不是所 需类型的随机数据,而语句1在任何情况下取出的都是所需要的随机数据。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MySQL数据库中随机获取一条或多条记录 的相关文章

  • 在恢复 mongodb 转储的单个命令中删除整个数据库

    我正在尝试恢复 mongodb 的目录转储 我在做 mongorestore db mydb drop path to mydb dump 但两者都无法恢复我的转储的状态 即使恢复数据库后 任何新记录仍然可见 但控制台上没有显示错误 我没有
  • 如何定义导入mongodb的分隔符

    我有一个数据集合 它由 特点 我将把数据收集添加到mongodb 所以我需要通过分离数据 特点 怎么样我的蒙戈进口公司命令看起来像 之前我已经成功导入csv通过以下命令创建文件 mongoimport d mydb c things typ
  • 如何 $filter where 条件与数组匹配?

    在 lookup 之后 我将得到一个名为 lastViewed 的连接 如下所示 id 5955ea4fd8099718330ab191 lastViewed id ObjectId 595218a7d346d27fb0bc1705 use
  • 选择 MYSQL 行,但将行转换为列,将列转换为行

    我想选择数据库中的所有行 但我希望它们按相反的顺序排列 意思是 我想使用第一列数据作为新实体 并将实体作为第一列 我想你明白我的意思 这是一个例子 id name marks 1 Ram 45 2 Shyam 87 to id 1 2 Na
  • HQL 中的日期比较(不带时间戳)

    我必须比较 hibernate hql 查询中的两个日期 我在 java bean 中使用 java util Date 并在 mysql 数据库中使用时间戳作为数据类型 select t from Task t where t modif
  • 更改 MySQL 中的列名称 [重复]

    这个问题在这里已经有答案了 搜索后我不知道我需要在 ALTER TABLE 中做什么genres更改列id to genre id有任何想法吗 alter table genres change id genre id int 10 aut
  • 将 1 添加到字段

    如何将以下 2 个查询变成 1 个查询 sql SELECT level FROM skills WHERE id id LIMIT 1 result db gt sql query sql level int db gt sql fetc
  • 如何轻松地将多个sql文件导入MySQL数据库?

    我有一些sql文件 我想要import将它们全部一次性存入 MySQL 数据库 I go to PHPMyAdmin 访问数据库 点击import 选择一个文件并导入 当我有多个文件时 需要很长时间 我想知道是否有更好的方法来导入多个文件
  • MySQL为什么在插入时我的自动增量不是从1开始?

    为什么当我使用 jdbc 向数据库中插入数据时 我的表 auto increment 会被提升 填充完全空表的示例 狗桌 DogId DogName 3 Woofer 4 Kujo 5 Spike 所有者表 OwnerId DogID Ow
  • 我将 MySQL 列设置为“NOT NULL”,但我仍然可以插入空值

    在 MySQL 中 我有一个 Column1 为 NOT NULL 的表 create table myTable Column1 int not null Column2 int not null 我仍然可以像这样插入一个空值 INSER
  • Cygnus版本升级导致STH-Comet读取查询日志差异

    我正在研究 Cygnus 和 STH Comet 想了解 Cygnus 版本升级的影响 我使用以下 docker compose yml 创建了一个环境 而且 我已经在注释掉的部分中切换了 Cygnus 版本来进行调查 docker com
  • PHP MySQL从2个表中获取数据

    我正在尝试合并数据库中的 2 个表 文件表 id file name file description file url access files 表 id student id file id 这是我的sql代码 当前从文件表中获取所有文
  • 按 sum mongodb 分组[重复]

    这个问题在这里已经有答案了 这是我以前的 MySQL 查询 SELECT Count status as amt status FROM users GROUP BY status 这会返回类似的东西 amt status 3 0 210
  • 如何删除 utf-8 中无法识别的字符? mysql/php

    我有一个设置为 utf 8 的 mysql 数据库 我已将 php 标头设置为 header Content Type text html charset utf 8 在我的html中 当我返回任何带有圆引号或撇号的内容时 它们显示为无法识
  • PHP:如果记录存在则显示 HTML,否则不显示任何内容

    我是 PHP 新手 我正在尝试构建一个小型客户数据库 在我的数据库中 我有一个名为 suspended state 的列 其值可以是 yes 或 no 如果是 我希望它显示 暂停 如果不是 我希望它显示 活动 这是我的代码 但是 无论列是
  • MySQL LOAD_FILE 返回 NULL

    我正在做这个SELECT LOAD FILE home user domains example com public html robots txt AS tmp FROM tmpTable但它返回 NULL 如何检查这是因为我没有 FI
  • MySQL数据文件不会收缩

    随着时间的推移 我的 MySQL 数据库 ibdata1 文件增长到大约 32GB 最近我从数据库中删除了大约 10GB 的数据 并重新启动了 mysql 以达到更好的效果 但文件不会缩小 有什么办法可以减小这个文件的大小 无论删除多少数据
  • 如何在 Laravel 5.4 中播种数据透视表?

    我正在关注 Jeffrey Way 撰写的名为 Laracasts 中的增量 API 的教程 Laravel 4 faker 类播种和 Laravel 5 4 之间有不同的编码 我仍然遵循教程 Seeders Reloaded 中的相同代码
  • 将 MongoDb 同步到 ElasticSearch

    我正在寻找一种将 MongoDB 中的集合与 Elastic Search ES 同步的方法 目标是以 MongoDB 作为主要数据源 并使用 MongoDB 作为全文搜索引擎 我的项目的业务逻辑是用python写的 网上有多种方法可供选择
  • 如何在 JPA 2 / Hibernate 中进行可移植和本机 ID 生成?

    我希望在当前运行 Hibernate 和 MySQL 的 JPA 2 实体上生成本机和可移植的 ID 当使用 GenerateValue strategy AUTO 时 hibernate 默认为 MySQL 上的 hibernate se

随机推荐