MySQL数据库中随机获取一条或多条记录
在开发过程中遇到了一个问题,使用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. 随机获取单条数据
-
SELECT * FROM table_name AS t1 JOIN (SELECT ROUND(RAND()*((SELECT MAX(id)
-
FROM table_name)-(SELECT MIN(id) FROM table_name))+(SELECT MIN(id)
-
FROM table_name)) AS id)AS t2 WHERE t1.id>=t2.id ORDER BY t1.id LIMIT 1;
简写版:
-
SELECT * FROM table_name AS t1 JOIN (SELECT ROUND(RAND()*(SELECT MAX(id)
-
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.随机获取单条或多条数据
-
SELECT * FROM table_name as t1 WHERE t1.id>=(RAND()*((SELECT MAX(id) FROM
-
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在任何情况下取出的都是所需要的随机数据。
希望对大家有所帮助!
相关文章
- MySQL在大数据、高并发场景下的SQL语句优化和"最佳实践"
- MySQL数据库学习笔记(一)----MySQL 5.6.21的安装和配置(setup版)
- MySQL选择数据库use与mysql_select_db使用详解
- 深入解析Mysql 主从同步延迟原理及解决方案
- MYSQL错误解决:ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
- gorm连接MySQL数据库:建表、查询单条数据
- Starting MySQL. ERROR! The server quit without updating PID file (/data/mysql/mysql.pid).
- Atitit mysql insert perf enhance 批量插入数据库性能 目录 1.1. 案一:使用ignore关键字1 2. 异步插入2 2.1. 其它关键:DELAYED 做为
- nodejs连接mysql数据库
- 【安装包】MySQL客户端
- 107.第十九章 MySQL数据库 -- MySQL高可用 MHA(十七)
- macos 安装 mysql
- mysql 主从不同步处理--数据库初始化
- Spring4 MVC+Hibernate4+MySQL+Maven使用注解集成实例
- MySQL数据库的使用(二)-表的增删改查