在数据库查询中,你很少需要检索表中的所有行。更常见的情况是根据特定的业务逻辑提取数据子集。本文将通过 MySQL 官方提供的world示例数据库,带你掌握条件过滤子句WHERE的用法。
文章目录
- 一、 单条件过滤
- 1.1 WHERE 子句
- 1.2 检查范围:BETWEEN ... AND
- 1.3 集合筛选:IN 运算符
- 1.4 空值的处理:IS NULL / <=>
- 二、 多条件过滤:逻辑组合
- 2.1 AND 与 OR
- 2.2 优先级的陷阱
- 2.3 NOT 运算符
- 2.3.1 NOT IN
- 2.3.2 NOT NULL
一、 单条件过滤
过滤条件放在WHERE子句里,紧跟在FROM子句之后,如果有ORDER BY子句,那么需要放WHERE子句之后。
完整的语法是:SELECT 查询列 FROM 表名 WHERE 过滤条件 ORDER BY 排序列;
1.1 WHERE 子句
在city表中,如果我们想找人口数刚好等于 1,000,000 的城市:
SELECTName,PopulationFROMcityWHEREPopulation=1000000;过滤条件通常是一个表达式,除了等号,SQL 还支持多种运算符:
| 操作符 | 描述 |
|---|---|
= | 相等 |
<> | 不相等 |
!= | 不相等 |
< | 小于 |
<= | 小于或等于 |
> | 大于 |
>= | 大于或等于 |
1.2 检查范围:BETWEEN … AND
如果你想查找人口在 100 万到 200 万之间的城市,BETWEEN...AND...是更好的选择(包含上下边界):
SELECTName,PopulationFROMcityWHEREPopulationBETWEEN1000000AND2000000;1.3 集合筛选:IN 运算符
当你要匹配多个特定值时,可以用IN运算符进行检测,值放在括号中,以逗号分隔。
例如,查找中国 (CHN)、美国 (USA) 的城市:
SELECTName,CountryCodeFROMcityWHERECountryCodeIN('CHN','USA');1.4 空值的处理:IS NULL / <=>
在MySQL中,NULL代表未知或缺失,它不等于 0,也不等于空字符串。
在country表中,我想查找某些国家的独立年份(IndepYear)缺失,需要使用IS NULL来过滤。同理,如果要查非空的记录则使用IS NOT NULL:
SELECTNameFROMcountryWHEREIndepYearISNULL;避坑:永远不要写WHERE IndepYear = NULL,这在 SQL 逻辑中永远返回 False。
扩展:
MySQL的<=>是一个特殊的NULL 安全相等运算符(也叫 “空值安全等号”),作用是:既能比较普通值是否相等,同时也会将 NULL 值视为相等,使用的概率较低。
二、 多条件过滤:逻辑组合
当业务逻辑变复杂时,我们需要用逻辑运算符将多个条件串联起来。
2.1 AND 与 OR
- AND:所有条件必须同时满足。
- OR:只要满足其中一个条件即可。
-- 查找人口超过 500 万,且位于中国的城市SELECTName,PopulationFROMcityWHEREPopulation>5000000ANDCountryCode='CHN';2.2 优先级的陷阱
AND的优先级高于OR。如果你混合使用它们,务必使用**圆括号()。
错误示例:查找中国或美国人口超 500 万的城市:
SELECT*FROMcityWHERECountryCode='CHN'ORCountryCode='USA'ANDPopulation>5000000;正确写法:
SELECT*FROMcityWHERE(CountryCode='CHN'ORCountryCode='USA')ANDPopulation>5000000;、2.3 NOT 运算符
NOT用来否定其后的任何条件,它通常与IN或NULL结合。
2.3.1 NOT IN
查找除了中国和美国以外的所有国家:
SELECT*FROMcityWHERECountryCodeNOTIN('CHN','USA');2.3.2 NOT NULL
查找独立年份不为空的国家:
SELECT*FROMcountryWHEREIndepYearISNOTNULL;掌握过滤条件是写出高效 SQL 的第一步,下一节我们将一起学习SQL条件过滤中的:通配符过滤(模糊匹配)