我仍然对sql server感到困惑,例如,我有学生表,我试图为java学生找到最高分数。
STUDENT
| id | name | mark | subject |
| 1 | jenny | 67 | db |
| 2 | mark | 74 | java |
| 3 | nala | 90 | java |
我试着像这样得到输出
| 3 | nala | 90 |
我用sql编写这段代码,但输出为空。
SELECT id,name,mark
FROM student
WHERE subject='Java'
AND mark=
(SELECT max(mark) FROM student);
我该怎么纠正它呢?
发布于 2014-12-27 13:31:03
有许多方法可以在SQL中获得您想要的东西。但是,您应该了解您的方法存在的问题:
SELECT id, name, mark
FROM student
WHERE subject = 'Java' AND
mark = (SELECT max(mark) FROM student);
问题是对于'Java'
,mark
的最大值可能不是。因此,任何行都不能同时通过where
条件。
您需要在子查询中重复筛选器,或者显式:
SELECT id, name, mark
FROM student
WHERE subject = 'Java' AND
mark = (SELECT max(mark) FROM student WHERE subject = 'Java');
或使用相关子查询:
SELECT s.id, s.name, s.mark
FROM student s
WHERE s.subject = 'Java' AND
s.mark = (SELECT max(mark) FROM student s2 WHERE s2.subject = s.subject);
请注意,最后一个查询使用了表别名。您应该学会在查询中使用它们;有时它们是必要的,它们通常会使查询更易于编写、阅读和理解。
发布于 2014-12-27 13:25:32
使用带有ORDER BY子句的TOP 1获取最高数据
试试这个:
SELECT TOP 1 id, name, mark
FROM student
WHERE subject = 'Java'
ORDER BY mark DESC;
或
SELECT id, name, mark
FROM (SELECT id, name, mark, ROW_NUMBER() OVER (ORDER BY mark DESC) AS RowNum
FROM student
WHERE subject = 'Java'
) AS A
WHERE RowNum = 1;
发布于 2014-12-27 13:27:03
你不需要使用子查询。使用Top 1 with ties
获取具有最高分数的学生,以及最高分数是否由多个学生共享
Where condition
将过滤结果,使其仅包含subject = 'Java'
,因为带有order by的TOP1将在java
中获取最大分数
SELECT TOP 1 with ties id, name, mark
FROM student
WHERE subject = 'Java'
ORDER BY mark DESC
https://stackoverflow.com/questions/27667676
复制