You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL查询:如何合并语句获取country表中人口最值的国家

解决方法:获取人口最多和最少的国家(单条SQL语句)

嘿,这个需求挺常见的,我给你分享几种能一次性拿到结果的SQL写法,你可以根据自己的数据库类型和实际场景来选:

方法1:用UNION ALL合并两个子查询

这是最直观的写法,分别查询人口最多和最少的记录,再合并成一个结果集:

SELECT *
FROM country
WHERE population = (SELECT MAX(population) FROM country)
UNION ALL
SELECT *
FROM country
WHERE population = (SELECT MIN(population) FROM country);
  • 说明:UNION ALL会保留所有符合条件的行,哪怕有多个国家并列人口最多/最少(比如两个国家人口都是全球最低),都会被完整查出来。
  • 如果你的表中有population为NULL的记录,记得加上AND population IS NOT NULL过滤掉,避免干扰最大/最小值的计算。

方法2:用窗口函数(更灵活,适合处理并列情况)

如果你的数据库支持窗口函数(比如MySQL 8.0+、PostgreSQL、SQL Server等),这个方法更高效也更优雅:

SELECT *
FROM (
    SELECT 
        *,
        RANK() OVER (ORDER BY population ASC) AS min_rank,
        RANK() OVER (ORDER BY population DESC) AS max_rank
    FROM country
    WHERE population IS NOT NULL -- 过滤空值
) AS ranked_countries
WHERE min_rank = 1 OR max_rank = 1;
  • 说明:RANK()函数会给相同人口的国家赋予相同的排名,比如如果有3个国家人口并列最低,它们的min_rank都是1,都会被筛选出来。如果你只想取其中一条,可以把RANK()换成ROW_NUMBER(),但这样会随机选一条(取决于数据库的默认排序规则)。
  • 这个方法只需要扫描一次表,比UNION ALL的两次子查询更高效,数据量大的时候优势会很明显。

小补充:用IN子句简化写法

如果你的country表有主键(比如country_id),也可以用IN子句把最大和最小值放在一起,不过这种写法和方法1逻辑类似:

SELECT *
FROM country
WHERE population IN (
    SELECT MAX(population) FROM country,
    SELECT MIN(population) FROM country
);

注意:有些数据库可能不支持IN里面直接放多个子查询,这时候还是用UNION ALL更稳妥。

内容的提问来源于stack exchange,提问作者tomoswizzard

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 03:40:20