对课上SQL使用技巧示例补充

一:用UPDATE批量更新score is null的记录

通过 RAND() 生成符合要求的成绩,百万级数据几秒内就能完成,完全不用手动操作。

关键:必须加 WHERE score is null,只更新空值,不覆盖已有成绩

方案1:快速填随机数

sql 复制代码
UPDATE t_course_selection
SET score = ROUND(RAND() * 100, 1)  -- 保留1位小数,生成0.0~100.0的随机数
--如果整数
-- SET score = FLOOR(RAND() * 101)  -- 生成0~100的整数(RAND()生成0~1随机数,*101后向下取整)
WHERE score IS NULL;

效果:

方案2:模拟真实学生成绩分布

sql 复制代码
UPDATE t_course_selection
SET score = CASE
    -- 5%概率:0-60分(不及格)
    WHEN RAND() < 0.05 THEN ROUND(RAND() * 60, 1)
    -- 80%概率:60-90分(中等,大部分学生)
    WHEN RAND() < 0.85 THEN ROUND(60 + RAND() * 30, 1)
    -- 15%概率:90-100分(高分段)
    ELSE ROUND(90 + RAND() * 10, 1)
END
WHERE score IS NULL;

二:一键清空所有 score 成绩(保留字段结构,所有记录设为 NULL)

1. 【必做】先备份数据(防止误操作不可逆)

sql 复制代码
CREATE TABLE t_course_selection_bak AS SELECT * FROM t_course_selection;

2.批量清空所有 score 成绩

sql 复制代码
UPDATE t_course_selection SET score = NULL;

执行成功显示为null

3.【验证】确认清空成功

sql 复制代码
SELECT COUNT(*) AS 总记录数, COUNT(score) AS 非空成绩数 FROM t_course_selection;

三:COUNT查询数据是否存在优化

比如我想判断课号是'A1LSC27'课程是否存在

方案一:课程开设的数量

SELECT COUNT(*) FROM t_courseinfo WHERE CourseNumber = 'A1LSC27'

技能证书课程有18个老师开设,但是只是想看看有没有这门课,可以用

方案二:课程是否开设

sql 复制代码
--不读实际数剧 只返回常量 1,不访问列存储;最多返回 1 条记录(找到即停)
SELECT 1 FROM t_courseinfo WHERE CourseNumber = 'A1LSC27' LIMIT 1

四、小表驱动大表

"从学生主表中,查出所有在特殊学生名单里的人" ------ 相当于用一份"小名单"去大表中"挑人"。SQL如下:

sql 复制代码
SELECT * FROM student WHERE id 
IN (SELECT stu_id FROM special_student)

special_student 表通常存储特殊标记的学生(如:贫困生、特长生、留学生、获奖学生等)

内层子查询(先执行):SELECT stu_id FROM special_student,子查询语句的数据量很少,所以查询速度会很快!

|------|-------------------------------------|
| 作用 | 从 special_student 表中提取所有学生的 ID |
| 返回结果 | 一组 stu_id 值,例如:[1, 3, 5, 8, 10] |

外层主查询

|-------------------|----------------------------|
| SELECT * | 返回 student 表的所有列(完整学生信息) |
| WHERE id IN (...) | 筛选条件:只保留 id 在子查询结果中的记录 |

五、字符串字段优化

加引号 = 按字符串匹配 → 走索引 = 飞快

不加引号 = 隐式类型转换 → 索引失效 = 全表扫描 = 很慢

  • 写 number = 200000929(不加引号)→ 数据库要把每一行的 number 都转成数字 再对比→ 索引失效,必须扫完整张百万表→ 慢!

  • 写 number = '200000929'(加引号)→ 直接字符串匹配 → 索引直接命中

  • 字段是 varchar/char → 值必须加引号
  • 字段是 int/bigint → 值不加引号
  • 类型不匹配 → 索引必失效 → 查询必变慢
相关推荐
白帽攻防录8 分钟前
SRC 挖洞:Roundcube 预认证 SQL 注入深度复盘,CVE-2026-48842 preg_replace 转义绕过怎么打穿邮件系统
网络·数据库·sql·网络安全·sql注入
꯭自꯭闭꯭35 分钟前
达梦SQL优化相关
linux·运维·数据库·sql
对空六课1 小时前
支持注意力分析的热力图工具有哪些?
前端·数据库·数据分析
南京码讯光电技术有限公司1 小时前
How to Design an Antenna System for an Industrial WiFi Module
数据库·人工智能
lusklusklusk2 小时前
Oracle数据库基础之2_体系结构
数据库·oracle
可乐ea3 小时前
从第一性原理构建 AI Agent:提示词、工具、技能与记忆全解剖
数据库·人工智能·工具调用·ai智能体·提示词工程·agent开发·智能体记忆
东方护航数据恢复(深圳)3 小时前
医疗案例:HIS/PACS 数据库页损坏修复,医院不停诊完成恢复【东方护航数据恢复深圳店】
数据库·数据恢复·医疗·二次开盘
lusklusklusk4 小时前
Oracle数据库基础之11_Duplicate和Dataguard和RAC
数据库·oracle
PHP实战开发录5 小时前
MySQL字段加索引为什么没变快
数据库·mysql·php·开发
红红谈说6 小时前
标签化推送与已读统计怎么做?一次通知链路的工程复盘
数据库·消息推送·数字乡村·集合运算·已读回执·标签体系·写入放大