订阅更新

只出现一次的最大数字:没有时返回 NULL

SQL 实战 123 题 · 第 43 题 简单 约 2 分钟读完

LeetCode 619 · HAVING、聚合函数遇到空集

本文目录
  1. 面试怎么回答
  2. 题意
  3. 表结构
  4. 思路
  5. 参考解法
  6. 易错点

面试怎么回答

子查询里用 HAVING COUNT(*) = 1 找出只出现一次的数字,外层套 MAX。聚合函数对空集返回 NULL,所以没有符合条件的数字时自然输出 NULL;如果用 ORDER BY + LIMIT 就得到空集,不符合要求。

先把这段讲顺;面试官追问时,再展开下面的原理和细节。

详细讲解

题意

数字表里有很多重复数字。在只出现过一次的数字里找最大的那个;如果没有只出现一次的数字,返回 NULL。

表结构

  • my_numbers:num(可能重复)

思路

先 GROUP BY num + HAVING COUNT(*) = 1 找出只出现一次的数字,再在外层取 MAX。一个巧妙的点:外层 MAX 作用在空集上时会返回一行 NULL,正好满足「没有就返回 NULL」的要求,不需要额外处理。

参考解法

SELECT
    MAX(num) AS num
FROM
    (SELECT
        num
    FROM
        my_numbers
    GROUP BY num
    HAVING COUNT(num) = 1) t1

易错点

  • 写成 ORDER BY num DESC LIMIT 1 在没有结果时返回空集,而不是 NULL。
刷题进度保存在当前浏览器