sql语句中如何对某个为空的字段赋值

使用 isnull 进行查询操作,使用 isnull 或 '' 进行更新操作。

这是一个陷阱,不信,不做。

实用提醒:查询和更新时,要注意区分null和void字段值。

如何使用 MySQL Update 和 Left Join 更新多条数据中的最大字段值?

那天我在调试学生成绩系统时,发现了一些奇怪的事情。
学生表中小明和小红的成绩始终为空,但成绩表有他们的记录。
这让我开始思考,我可以把最大的一个给合适的学生吗?
所以我尝试了这个SQL:UPDATE Student SET Grade = (SELECT MAX(score) FROM Grade WHERE Score.student_id = Student.id);。
上线后,学生表中小明的成绩自动填写为8 0分,小红的成绩自动填写为9 8 分,这竟然是他们成绩表中的最高分。

但是后来发现如果grade表中没有对应的Student_id,student表中的grade就会变成NULL。
真是相当麻烦啊。
如果想避免这种情况,可以在子查询中添加COALESCE,例如: UPDATE Student SET Score = COALESCE((SELECT MAX(score) FROM Score WHERE Score.student_id = Student.id), 0);。
这样,即使没有找到匹配的条目,分数也将为 0。

等等,还有更多。
我尝试在一个特别大的表上运行此 SQL。
例如,学生表包含数百万条记录,成绩表也包含数百万条记录。
事实证明,如果 Student_id 和 Score.student_id 字段没有建立索引,查询将会非常慢。
最后给这两个字段加了索引,速度立刻就快多了。

我突然想到,如果关联条件比较复杂,比如年份或者班级,直接用JOIN可能会更方便。
例如这个 SQL: sql 更新学生 加入( SELECT 学生 ID, MAX(分数) AS max_score 来自评估 按学生 ID 分组 ) 温度AS ON 学生.id = temp.student_id SET Student.score = temp.max_score; 这样就可以先计算出每个学生的最高分,然后根据学生表进行更新。
但我认为直接使用子查询更容易。
为什么事情需要复杂化?
告诉我,有时你必须为了性能而牺牲可读性?

MySQL Update Left Join 更新最大值:如何使用子查询从多条数据中获取最大值并更新特定字段?

可以直接使用UPDATE+子查询来更新最大值。
子查询使用 MAX(score) 查找每个 Student_id 的最高分数。
例如student_id=1 ,score表有8 0、7 8 ,MAX为8 0,更新student.score=8 0。
注意子查询必须返回一个值,否则使用MAX来保证唯一性。
当结果表中没有记录时,student.result将变为NULL并使用COALESCE设置默认值。
例如,COALESCE((SELECT MAX(分数) FROM 分数 WHERE 分数.student_id=student.id), 0)。
对于大表,建议在score.student_id上添加索引。
还可以使用JOIN脚本方式,更加灵活。
你自己掂量一下吧。