用SQL写有一个选课表和一个学生表,查询成绩最高的的学生的信息

你提到的SQL查询肯定有点复杂并且容易混淆,特别是如果子查询是嵌套的。
之前在帮同事调试这个需求的时候也遇到过类似的问题。

直接关联表实际上更直观,尤其是在使用 EXISTS 关键字时。
SQL 选择 S。
来自学生表 S 它存在的地方( 选择1 来自课程选择列表 C 这里,S.学生ID = C.学生ID C. 分数 = ( 选择最大值(分数) 从课程选择列表中 ) )
这样写的好处是当找到第一个匹配时 EXISTS 就会停止,这可能会提高性能。

您提到的 TOP 语法在 SQL Server 中当然工作得很好。
但是MySQL不支持TOP,所以必须使用LIMIT。
SQL 选择 S。
来自学生表 S JOIN选课表 C ON S.学号 = C.学号 其中 C. 分数 = ( 选择最大值(分数) 从课程选择列表中 ) 限制1
需要注意的是,如果多个学生同时达到最高分,使用子查询可能会导致他们错过其他学生。
例如,目前张、三、李四的最高分都是1 00分。
如果你这样写,你只会找到你遇到的前1 00个学生。

我上次在杭州培训的时候就遇到了这个场景。
一个学生问他是否可以使用窗口函数。
当时我尝试过 SQL 选择 S。
从 ( 选择S, RANK() OVER (ORDER BY C. Score DESC) AS 排名 来自学生表 S JOIN选课表 C ON S.学号 = C.学号 ) AS 子查询 WHERE subquery.Ranking = 1
这是创建所有得分最高的学生的完整列表的最安全方法。

但说实话,在编写此类查询时,我习惯首先使用临时表或 CTE(如果您使用的是 SQL Server 或 SQL:2 003 兼容)。
SQL 最高分是( 选择 MAX(分数) AS 分数 从课程选择列表中 ) 选择 S。
来自学生表 S JOIN选课表 C ON S.学号 = C.学号 JOIN 最高分 H ON C. 分数 = H. 分数
这样的层次结构让逻辑更加清晰。

子查询错误的问题可能是您使用的数据库系统对子查询的复杂性有限制。
上次我使用 Oracle 1 2 c 时,如果嵌套超过三层,就会报错,我必须将查询重写为递归查询,或者先计算中间结果并将其存储在临时表中。

无论如何,这取决于你使用的数据库系统。
如果数据量不大,直接使用JOIN通常比子查询效率更高。
如果您有大量数据,我们建议使用 SQL 分析器或执行计划工具来查看哪种方法更好。

查出总分前3分数由高到低的学生姓名和总分数的sql

这是一个坑。
别相信。
不要这样做。

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

上周 在 SQL Server 中。
两条数据。
都有[张]字。
前面一个。
落后一位。
检查这个。
使用“选择自”。
没问题。
但名字中含有【张】。
不能使用等号。
如果我尝试它是行不通的。

必须使用like。
这是正确的。
单独添加%。
不。
我只知道姓张。
将其正面和背面佩戴。
前后加%。
就好了。
模糊搜索。

就是这样。
由你决定。