2.1 WHERE 筛选:LIKE、REGEXP、BETWEEN、IN、日期时间
WHERE 用来筛选行。你可以把它理解成结果集的闸门:满足条件的行通过,不满足的行被挡住。
LIKE:简单文本匹配
sql
SELECT name
FROM students
WHERE name LIKE 'A%';% 表示任意长度的任意字符,_ 通常表示一个任意字符。
常见模式:
'A%':以 A 开头。'%a%':包含 a。'__a%':第三个字符是 a。
正在加载概念检查...
REGEXP:正则匹配要看产品
正则适合更复杂的文本模式,例如“以 A 到 D 开头”。但 SQL 中的正则语法不够统一。
例如,要找出名字以 A、B、C、D 开头的学生:
sql
-- MySQL / MariaDB 常见写法
SELECT name, country
FROM students
WHERE name REGEXP '^[A-D]';
-- PostgreSQL 常见写法
SELECT name, country
FROM students
WHERE name ~ '^[A-D]';这里 ^ 表示文本开头,[A-D] 表示 A 到 D 中的任意一个字符。若示例数据里有 Ada、Bo、Cora、Devi,它们都会通过这个模式。
产品差异提醒:
- MySQL 常见写法:
name REGEXP '^[A-D]'。 - PostgreSQL 常见写法:
name ~ '^[A-D]'。 - SQLite 默认没有完整 REGEXP 操作,需要扩展或用户自定义函数。
- SQL Server 通常不提供同样的 REGEXP 操作符,常要换方案。
正在加载概念检查...
BETWEEN 与 IN
sql
SELECT name, score
FROM students
WHERE score BETWEEN 80 AND 95;BETWEEN 通常包含边界值,相当于 score >= 80 AND score <= 95。
sql
SELECT name, country
FROM students
WHERE country IN ('US', 'CA', 'GB');IN 表示值属于一个集合。集合很长时,可能应该考虑 JOIN 到一张表,而不是写巨大列表。
日期与时间
sql
SELECT name, enrolled_on
FROM students
WHERE enrolled_on BETWEEN DATE '2026-02-01' AND DATE '2026-03-31';日期查询最重要的是明确列类型和边界。若列是时间戳,2026-03-31 可能只表示当天零点,不一定包含这一天所有时间。
注意
产品差异提醒:日期字面量、当前时间函数、时间区处理差异明显。PostgreSQL 支持
DATE '2026-02-01' 这类标准风格字面量;MySQL 常见写法是字符串日期如 '2026-02-01';SQL Server 常用 CAST/CONVERT;SQLite 常把日期时间作为文本、数字或 Julian day 处理。正在加载交互实验...
正在加载本节练习...