从零学SQL 07 数据过滤

在数据库查询中,你很少需要检索表中的所有行。更常见的情况是根据特定的业务逻辑提取数据子集。本文将通过 MySQL 官方提供的 world 示例数据库,带你掌握条件过滤子句 WHERE 的用法。


文章目录

    • [一、 单条件过滤](#一、 单条件过滤)
      • [1.1 WHERE 子句](#1.1 WHERE 子句)
      • [1.2 检查范围:BETWEEN ... AND](#1.2 检查范围:BETWEEN ... AND)
      • [1.3 集合筛选:IN 运算符](#1.3 集合筛选:IN 运算符)
      • [1.4 空值的处理:IS NULL / <=>](#1.4 空值的处理:IS NULL / <=>)
    • [二、 多条件过滤:逻辑组合](#二、 多条件过滤:逻辑组合)
      • [2.1 AND 与 OR](#2.1 AND 与 OR)
      • [2.2 优先级的陷阱](#2.2 优先级的陷阱)
      • [2.3 NOT 运算符](#2.3 NOT 运算符)
        • [2.3.1 NOT IN](#2.3.1 NOT IN)
        • [2.3.2 NOT NULL](#2.3.2 NOT NULL)

一、 单条件过滤

过滤条件放在 WHERE 子句里,紧跟在 FROM 子句之后,如果有ORDER BY子句,那么需要放WHERE 子句之后。

完整的语法是:SELECT 查询列 FROM 表名 WHERE 过滤条件 ORDER BY 排序列;

1.1 WHERE 子句

在 city 表中,如果我们想找人口数刚好等于 1,000,000 的城市:

sql 复制代码
SELECT Name, Population 
FROM city 
WHERE Population = 1000000;

过滤条件通常是一个表达式,除了等号,SQL 还支持多种运算符:

操作符 描述
= 相等
<> 不相等
!= 不相等
< 小于
<= 小于或等于
> 大于
>= 大于或等于

1.2 检查范围:BETWEEN ... AND

如果你想查找人口在 100 万到 200 万之间的城市,BETWEEN...AND... 是更好的选择(包含上下边界):

sql 复制代码
SELECT Name, Population 
FROM city 
WHERE Population BETWEEN 1000000 AND 2000000;

1.3 集合筛选:IN 运算符

当你要匹配多个特定值时,可以用IN 运算符进行检测,值放在括号中,以逗号分隔。

例如,查找中国 (CHN)、美国 (USA) 的城市:

sql 复制代码
SELECT Name, CountryCode 
FROM city 
WHERE CountryCode IN ('CHN', 'USA');

1.4 空值的处理:IS NULL / <=>

在MySQL中,NULL 代表未知或缺失,它不等于 0,也不等于空字符串。

在 country 表中,我想查找某些国家的独立年份(IndepYear)缺失,需要使用 IS NULL来过滤。同理,如果要查非空的记录则使用IS NOT NULL:

sql 复制代码
SELECT Name 
FROM country 
WHERE IndepYear IS NULL;

避坑: 永远不要写 WHERE IndepYear = NULL,这在 SQL 逻辑中永远返回 False。

扩展:

MySQL的 <=> 是一个特殊的NULL 安全相等运算符(也叫 "空值安全等号"),作用是:既能比较普通值是否相等,同时也会将 NULL 值视为相等,使用的概率较低。


二、 多条件过滤:逻辑组合

当业务逻辑变复杂时,我们需要用逻辑运算符将多个条件串联起来。

2.1 AND 与 OR

  • AND: 所有条件必须同时满足。
  • OR: 只要满足其中一个条件即可。
sql 复制代码
-- 查找人口超过 500 万,且位于中国的城市
SELECT Name, Population 
FROM city 
WHERE Population > 5000000 AND CountryCode = 'CHN';

2.2 优先级的陷阱

AND 的优先级高于 OR。如果你混合使用它们,务必使用**圆括号 ()。

错误示例:查找中国或美国人口超 500 万的城市:

sql 复制代码
SELECT * FROM city
WHERE CountryCode = 'CHN' OR CountryCode = 'USA' AND Population > 5000000;

正确写法:

sql 复制代码
SELECT * FROM city
WHERE (CountryCode = 'CHN' OR CountryCode = 'USA') AND Population > 5000000;、

2.3 NOT 运算符

NOT 用来否定其后的任何条件,它通常与 IN 或 NULL结合。

2.3.1 NOT IN

查找除了中国和美国以外的所有国家:

sql 复制代码
SELECT * 
FROM city 
WHERE CountryCode NOT IN ('CHN', 'USA');
2.3.2 NOT NULL

查找独立年份不为空的国家:

sql 复制代码
SELECT *
FROM country 
WHERE IndepYear IS NOT NULL;

掌握过滤条件是写出高效 SQL 的第一步,下一节我们将一起学习SQL条件过滤中的:通配符过滤(模糊匹配)

相关推荐
Decay__4 小时前
05_MySQL 常用 SQL 大全 —— 诊断、管理、优化辅助 SQL 与三大系统库速查
运维·数据库·sql·mysql·架构
梯度下降者7 小时前
零基础入门Python 爬虫
爬虫·python·数据分析·入门指南·webcrawler
小徐不徐说9 小时前
C++ 接口与插件设计:从工厂注册到 Qt 动态插件
数据库·c++·qt·系统架构·程序设计
论文复现现场9 小时前
WRF、FEA 能用 L40S 加速吗?求解器检查、断点恢复与长期运行
java·数据库·算法·wrf·有限元分析·gpu计算·断点续算
benchmark_cc10 小时前
用 Python 拉 A 股全市场实时快照:Notebook 请求、结果校验与易错点
python·数据分析·pandas·量化交易·股票数据·quantdash
Decay__10 小时前
04_MySQL DBA 日常运维手册 —— 会话管理、锁与阻塞、事务监控、慢查询与日志巡检
运维·数据库·sql·mysql·架构
心梦缘-雪雁11 小时前
SQL Server 查询数据存在哪个表里
数据库
lusklusklusk12 小时前
Python 巡检脚本:进程运行状态、数据库写入时效检查及邮件通知与告警
数据库·python·oracle
GeW13 小时前
产业新优势基础软件的人才底盘,从Linux与数据库开始
linux·数据库
SelectDB13 小时前
Doris Arrow Flight SQL 高速读取协议实战:与 Snowflake 客户端取数链路对照
大数据·数据库·数据分析