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
相关产品推荐
相关产品推荐

