SQL语句,随机取多条数据

本文介绍了一种从数据库中随机选取新闻的方法,并展示了六条随机获取的新闻内容,包括食品药品监管、医疗改革等方面。
SELECT news_info.id , news_info.title FROM news_info WHERE (news_info.id >= ((SELECT MAX(id) FROM news_info)-(SELECT MIN(id) FROM news_info)) * RAND() + (SELECT MIN(id) FROM news_info)) AND news_info.isdel=0  LIMIT 6

这就是随机取6条新闻信息

32 食药品督总局提醒网上买药要注意六点
43 彩色视觉的损伤或与高血压有关
51 县级公立医院改革评价体系将出台
57 沈阳村卫生室启动国家基本药物制度
67 国家食药总局:勿滥用制氧机
72 揭秘!火锅底料有罂粟壳可快检

在 MySQL 中,**无法直接用一条标准 SQL 语句生成 1000 条完全随机数据**(如随机名字、随机年龄),因为标准 SQL 不支持循环或随机数据生成函数与 `INSERT` 的直接组合。但你可以通过 **MySQL 存储过程 + 循环** 或者 **利用系统表构造序列再配合随机函数** 的方式“近似”实现。 不过,从严格意义上说:✅ **可以通过一个包含 1000 行的 `INSERT ... VALUES` 语句来实现“一条 SQL 插入 1000 条”** —— 这是真正的一条 SQL 语句。 --- ### ✅ 方法一:使用单条 `INSERT` 语句插入 1000 条数据(真正的“一条 SQL”) ```sql INSERT INTO users (name, age) VALUES ('User1', FLOOR(RAND() * 48 + 18)), ('User2', FLOOR(RAND() * 48 + 18)), ('User3', FLOOR(RAND() * 48 + 18)), -- ... ('User999', FLOOR(RAND() * 48 + 18)), ('User1000', FLOOR(RAND() * 48 + 18)); ``` > 🔍 虽然 `RAND()` 每次调用都会产生不同的,所以每条记录的 `age` 是随机的。 > 名字也可以改为 `'User' + 序号` 形式,模拟唯一性。 📌 缺点:你需要手动或用脚本生成这 1000 行。 --- ### ✅ 方法二:使用数字序列生成器(CTE递归)+ 随机数据(MySQL 8.0+) 如果你使用的是 **MySQL 8.0 或以上版本**,可以使用 **公用表表达式(CTE)** 自动生成 1 到 1000 的序列,并基于此插入 1000 条随机数据。 ```sql WITH RECURSIVE nums AS ( SELECT 1 AS n UNION ALL SELECT n + 1 FROM nums WHERE n < 1000 ) INSERT INTO users (name, age) SELECT CONCAT('User', n), -- 生成 User1, User2, ..., User1000 FLOOR(RAND() * 48 + 18) -- 年龄在 18~65 之间 FROM nums; ``` ✅ 这是一条完整的 SQL 语句!它会自动插入 1000 条数据。 > 📝 注意: - `RAND()` 在每一行执行时都会重新计算,因此每个 `age` 是独立随机的。 - 必须启用递归 CTE 支持(默认开启,但有深度限制,默认 `cte_max_recursion_depth=1000`)。 - 如果你遇到错误,可先设置: ```sql SET SESSION cte_max_recursion_depth = 1000; ``` --- ### ✅ 方法三:使用现有大表生成序列(无需 CTE) 如果不能用 CTE,可以用系统表或任意大表生成行数: ```sql INSERT INTO users (name, age) SELECT CONCAT('User', @row := @row + 1), FLOOR(RAND() * 48 + 18) FROM information_schema.columns, (SELECT @row := 0) r LIMIT 1000; ``` > 💡 原理:`information_schema.columns` 通常有很多列,我们只前 1000 行,配合变量 `@row` 自增生成编号。 ⚠️ 注意:这种方法依赖于数据库中已有足够多的行,否则不够 1000 行。 --- ### ✅ 确保表存在 执行前请确保目标表已创建: ```sql CREATE TABLE IF NOT EXISTS users ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(100) NOT NULL, age INT NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); ``` --- ### 🧪 测试建议 推荐使用 **方法二(CTE)**,因为它简洁、安全、可重复,且是一条真正的 SQL 语句完成插入。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值