MySQL如何用LEFT JOIN更新学生表中每个学生的最高成绩?

今天下午,我在公园散步,看到几个孩子在玩捉迷藏。
突然,我想到一个有趣的问题:如果有一个学生表和成绩表,如何快速更新每个学生的最高成绩呢?
我记得之前看过一些关于SQL优化的文章,提到了LEFT JOIN和子查询的使用。
我回想起一个具体的案例,那是在2 02 2 年的一个培训课上,我们用LEFT JOIN来处理一个类似的问题。

当时,我们有一个学生表和一个成绩表,每个学生的多条成绩记录在成绩表中。
我们想要更新学生表中的每个学生的最高成绩字段。
于是,我们用了以下SQL语句:
UPDATE student LEFT JOIN ( SELECT student_id, MAX(score) AS max_score FROM score GROUP BY student_id ) AS max_scores ON student.id = max_scores.student_id SET student.score = max_scores.max_score;
这段代码中,我们首先创建了一个派生表(子查询),它包含了每个学生的最高成绩。
然后,我们使用LEFT JOIN将这个派生表与原始的学生表关联起来,并更新了学生的最高成绩。

不过,我突然想到,如果我们直接使用子查询,是不是可以更简洁一些呢?我尝试了一下,发现确实可以:
UPDATE student SET score = (SELECT MAX(score) FROM score WHERE score.student_id = student.id);
这种方式更直接,不需要创建额外的派生表进行关联,感觉上应该也更快。

那么,你觉得这两种方法哪种更高效呢?在真实场景中,我们应该如何选择呢?

access查询中要查询出成绩表中总评成绩最高的五位学生的学号和总评成绩,该怎么写SQL语句?

ACCESS SQL查询,找出成绩最高五位:
SELECT TOP 5 成绩表.学号, 成绩表.总评成绩 FROM 成绩表 ORDER BY 成绩表.总评成绩 DESC
需要姓名,加入内连接:
SELECT TOP 5 学生信息表.学号, 学生信息表.姓名, 成绩表.总评成绩 FROM 学生信息表 INNER JOIN 成绩表 ON 学生信息表.学号 = 成绩表.学号 ORDER BY 成绩表.总评成绩 DESC
关联字段要对应,没对应查询结果空。
索引学号和总评成绩,提高效率。

用sql语句,查询每个班级成绩排名前三名的学生姓名

哎,这SQL查询的细节真是磨人。
你说的这些情况我之前在2 02 3 年帮一个同事调试过。

上周有个客人问我为啥查姓张的人会漏掉名字里带张的情况,我当时就跟你讲得差不多。
在SQL Server里,想查名字里包含"张"字的,绝对不能用= 号,那肯定查不到。

你说的用LIKE关键字是对的。
比如查"张三"或者"小张",可以这样写LIKE '%张%',前后都加百分号。
不加百分号的话,'张%'只能查姓张的,'%张'只能查末尾带张的。
这个规则真的硬性规定,改不了。

有个小坑是,刚开始用的人容易忽略百分号的位置,比如写成'张%'想查名字带张的,结果发现姓张的也出来了,当时调试了半天。
所以写SQL的时候最怕别人随便改代码,一个小符号弄错全乱套。

你总结得挺清楚的,基本就这回事。
查含糊字就用LIKE加百分号,前后都要加。

用SQL语言查询班上前5名学生成绩

SQLServer用TOP5 MySQL用LIMIT5 Oracle用ROWNUM嵌套查询。
Students表按score降序排。
前五名直接取。
自己掂量。