MySQL与Oracle UPDATE多条记录不同值,同时UPDATE多个字段
来源:互联网 发布:手机淘宝旧版本6.5.0 编辑:程序博客网 时间:2024/06/06 09:05
需求
如下两张表student(学生表)、score(测试成绩表)
现需要统计:2015-03-10日之后,性别 age=1 的测试成绩的 总分 与 平均分。
要求:使用一个SQL统计score表,将结果更新到student表的score_sum和score_avg字段中。
结果如图:
实现:
如果我们只需要更新一个字段,MySQL和Oracle语法是一样的,在 set 后面跟一个子查询即可,如下:
UPDATE student D
SET D.score_sum =
(
SELECT
SUM(B.score)
FROM score B
WHERE B.studentId = D.id
AND b.examTime >= '2015-03-10'
GROUP BY B.studentId
)
WHERE D.id =
(
SELECT
E.id FROM
(
SELECT
DISTINCT a.studentId AS id
FROM score A
WHERE A.examTime >= '2015-03-10'
) E
WHERE E.id = D.id
)
AND d.age = 1;
现在我们需要同时更新2个字段,最不经过大脑思考的方法就是 “为每个 set 后面都跟一个子查询”,
假如我们要 set 十个字段或者更多字段呢?很显然,这样在性能上是很不合适的方法。
同时更新多个字段在mysql和oracle中的方法是不一样,MYSQL需要连接表,ORACLE使用 set(...) 即可
(看了下面的SQL你会发现,还是ORACLE简单易用、易懂)
1) MYSQL 实现我们最终的需求,语句如下:
UPDATE student D
LEFT JOIN (SELECT
B.studentId,
SUM(B.score) AS s_sum,
ROUND(AVG(B.score),1) AS s_avg
FROM score B
WHERE b.examTime >= '2015-03-10'
GROUP BY B.studentId) C
ON (C.studentId = D.id)
SET D.score_sum = c.s_sum,
D.score_avg = c.s_avg
WHERE D.id =
(
SELECT
E.id FROM
(
SELECT
DISTINCT a.studentId AS id
FROM score A
WHERE A.examTime >= '2015-03-10'
) E
WHERE E.id = D.id
)
AND d.age = 1;
2) ORACLE 实现我们最终的需求,语句如下:
UPDATE student D
SET (D.score_sum, D.score_avg) = (
SELECT
SUM(B.score) AS s_sum,
ROUND(AVG(B.score),1) AS s_avg
FROM score B
WHERE b.examTime >= '2015-03-10'
AND B.studentId = D.id
GROUP BY B.studentId
)
WHERE D.id =
(
SELECT
E.id FROM
(
SELECT
DISTINCT a.studentId AS id
FROM score A
WHERE A.examTime >= '2015-03-10'
) E
WHERE E.id = D.id
)
AND d.age = 1;
本文中用到的2个知识点:
1、更新多条记录,每条记录不同值。
2、同时更新多个字段的方法。
===== 将 age = 1 并且没有测试成绩的同学给予默认值0,调整SQL如下 =====
UPDATE student D
LEFT JOIN (SELECT
B.studentId,
SUM(B.score) AS s_sum,
ROUND(AVG(B.score),1) AS s_avg
FROM score B
WHERE b.examTime >= '2015-03-10'
GROUP BY B.studentId) C
ON (C.studentId = D.id)
SET D.score_sum = IFNULL(c.s_sum,0),
D.score_avg = IFNULL(c.s_avg,0)
WHERE D.id =
(
SELECT
E.id FROM
(
SELECT
DISTINCT a.studentId AS id
FROM score A
##WHERE A.examTime >= '2015-03-10'
) E
WHERE E.id = D.id
)
AND d.age = 1;
结果如下:
Test SQL
- MySQL与Oracle UPDATE多条记录不同值,同时UPDATE多个字段
- 数据库 UPDATE多条记录不同值,同时UPDATE多个字段
- 数据库 UPDATE多条记录不同值,同时UPDATE多个字段
- oracle 同时更新(update)多个字段多个值
- oracle 同时更新(update)多个字段多个值
- oracle 同时更新(update)多个字段多个值
- oracle 同时更新(update)多个字段多个值
- oracle 同时更新(update)多个字段多个值
- mysql 对一个字段的多条记录update
- mysql一条语句update多条记录
- update更新多个字段
- MySQL不需循环update多条记录
- mysql 一次更新(update)多条记录
- mysql的从另外一张表update多个字段
- mysql同时更新多条记录的同一个字段
- pymongo update更新多条记录
- update 一次更新多个字段(sql)
- update多个字段的写法
- 4994: [Usaco2017 Feb]Why Did the Cow Cross the Road III
- 移动端Jenkins持续集成攻略(2)
- sizeof和strlen用法区别(转载)谢谢大牛
- KVM虚拟化平台部署
- 阿里面试官:什么样的人能在阿里晋升?相信你能在文章找到答案
- MySQL与Oracle UPDATE多条记录不同值,同时UPDATE多个字段
- SpringMVC 实现POI读取Excle文件中数据导入数据库(上传)、导出数据库中数据到Excle文件中(下载)
- maven scala idea 步骤
- 逆波兰表达式
- React Native资源整理
- win7中exe打开方式错误解决方案
- Android性能调优 ViewPager+Fragment+RecyclerView
- Java程序员应当知道的10个面向对象设计原则
- Discuz!教程之解决 Discuz!X3.4以下版本前台打开卡慢、后台登陆卡死或504错误等问题