【问题标题】:find maximum with specific data in sql server在 sql server 中查找特定数据的最大值
【发布时间】:2015-02-24 09:19:15
【问题描述】:

我仍然对 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);

我应该如何纠正它?

【问题讨论】:

    标签: sql sql-server database select sql-order-by


    【解决方案1】:

    有很多方法可以在 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);
    

    请注意,最后一个查询使用表别名。你应该学会在你的查询中使用这些;有时它们是必要的,它们通常使查询更易于编写、阅读和理解。

    【讨论】:

      【解决方案2】:

      您不需要使用子查询。使用Top 1 with ties 让学生获得最高分,如果最高分由多个学生共享,也可以使用

      Where condition 将过滤结果以仅具有 subject = 'Java' 之后,带有 order by 的 Top 1 将为您获取 java 中的最大标记

      SELECT TOP 1 with ties id, name, mark
      FROM student
      WHERE subject = 'Java'
      ORDER BY mark DESC
      

      【讨论】:

        【解决方案3】:

        使用 TOP 1ORDER 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;
        

        【讨论】:

          【解决方案4】:

          使用您正在尝试的内容(使用子查询),您可以这样做:

          SELECT id,name,mark
          FROM student
          WHERE subject='Java' 
          AND   mark = (SELECT MAX(mark) 
                        FROM student 
                        WHERE subject='Java');
          

          您正在尝试获取所有记录的最大值,而与主题名称无关。

          【讨论】:

          • 这个查询的性能会受到影响,因为外部查询现在对给定的标记执行全表扫描
          • 请问为什么要执行全表扫描?
          【解决方案5】:

          尝试这个简单的查询以获得结果

          SELECT TOP 1 ID,NAME,mark FROM STUDENT
            WHERE SUBJECT ='JAVA'
            ORDER BY MARK DESC
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2022-01-03
            • 2017-05-08
            • 1970-01-01
            • 2015-05-01
            • 2021-12-24
            相关资源
            最近更新 更多