我仍然对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);
我该如何纠正它?
答案 0 :(得分:2)
有很多方法可以在SQL中获得所需内容。但是,您应该了解您的方法存在的问题:
SELECT id, name, mark
FROM student
WHERE subject = 'Java' AND
mark = (SELECT max(mark) FROM student);
问题是mark
的最大值可能不适用于'Java'
。因此,没有行可以通过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);
请注意,最后一个查询使用表别名。您应该学会在查询中使用这些内容;有时它们是必要的,它们通常使查询更容易编写,阅读和理解。
答案 1 :(得分:1)
将 TOP 1 与 ORDER BY 子句一起使用以获取最高数据
试试这个:
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;
答案 2 :(得分:1)
您不需要使用子查询。使用Top 1 with ties
为学生提供最高分,如果最多分数由多名学生分享
Where condition
会将结果过滤为只有subject = 'Java'
之后,排名靠前的1将获取java
SELECT TOP 1 with ties id, name, mark
FROM student
WHERE subject = 'Java'
ORDER BY mark DESC
答案 3 :(得分:0)
使用您正在尝试的内容(使用子查询),您可以执行以下操作:
SELECT id,name,mark
FROM student
WHERE subject='Java'
AND mark = (SELECT MAX(mark)
FROM student
WHERE subject='Java');
您正在尝试获取所有记录的最大值,而不考虑主题名称。
答案 4 :(得分:0)
尝试简单的查询以获得结果
SELECT TOP 1 ID,NAME,mark FROM STUDENT
WHERE SUBJECT ='JAVA'
ORDER BY MARK DESC