基于不同条件的SELECT MIN()/MAX()查询能否合并为单个查询?
当然可以合并成单个查询!
这种仅过滤条件不同的聚合查询,用条件聚合(Conditional Aggregation)就能轻松合并,而且还能提升查询效率——只需要扫描一次表,不用重复扫两次。
举个实际例子
假设你原来的两个查询是这样的:
-- 查询 birth 早于2000年的最小年龄 SELECT MIN(age) AS min_age_pre_2000 FROM users WHERE birth < '2000-01-01'; -- 查询 birth 晚于/等于2000年的最大年龄 SELECT MAX(age) AS max_age_post_2000 FROM users WHERE birth >= '2000-01-01';
合并后的高效查询
用CASE WHEN把过滤逻辑嵌入聚合函数里,就能在一次查询中同时得到两个结果:
SELECT MIN(CASE WHEN birth < '2000-01-01' THEN age END) AS min_age_pre_2000, MAX(CASE WHEN birth >= '2000-01-01' THEN age END) AS max_age_post_2000 FROM users;
原理说明
- 当
birth满足对应条件时,CASE返回目标字段值;不满足时返回NULL - 聚合函数(
MIN/MAX)会自动忽略NULL值,所以最终结果和分开查询完全一致 - 这种写法是标准SQL,支持MySQL、PostgreSQL、SQL Server、Oracle等所有主流数据库
额外选项:如果需要分两行返回结果
如果你希望结果和原查询一样分成两行展示,也可以用UNION ALL实现,但这种方式会扫描两次表,效率不如条件聚合,仅在格式需求特殊时使用:
SELECT 'pre_2000' AS group_type, MIN(age) AS value FROM users WHERE birth < '2000-01-01' UNION ALL SELECT 'post_2000' AS group_type, MAX(age) AS value FROM users WHERE birth >= '2000-01-01';
内容的提问来源于stack exchange,提问作者Toleo
相关产品推荐
相关产品推荐

