订阅更新

大国家:OR 条件与 UNION 的取舍

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

LeetCode 595 · 多条件过滤、OR 与索引

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

面试怎么回答

直接 WHERE area > 3000000 OR population > 25000000。如果 area 和 population 各有索引而优化器没做 index merge,我会改写成两个查询 UNION,让每个条件走自己的索引;这里要用 UNION 去重,因为同一个国家可能同时满足两个条件。

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

详细讲解

题意

国家表有面积和人口。面积超过 300 万平方公里或人口超过 2500 万的算大国家,输出这些国家的名称、人口和面积。

表结构

  • World:name(主键)、continent、area、population、gdp

思路

两个条件满足其一即可,直接用 OR。这道题常被用来聊 OR 的性能:两个条件分别落在不同的索引上时,OR 可能导致全表扫描,改写成两个查询 UNION 后可以各自走索引(数据库也可能自动做 index merge)。

参考解法

select  name ,population,area  
from World
where area  >3000000 or population >25000000

另一种写法:UNION 写法,两个条件分别走各自的索引

SELECT name, population, area FROM World WHERE area > 3000000
UNION
SELECT name, population, area FROM World WHERE population > 25000000

易错点

  • UNION 会去重,UNION ALL 不去重;这里一个国家可能同时满足两个条件,要用 UNION。
刷题进度保存在当前浏览器