很多时候,我们不希望得到一张 Table 中的所有 Row,而只想查看来自 Tokyo 的用户、价格高于 50 的商品,或某个日期之后的订单。SQL 使用 WHERE 添加筛选条件。
下面的条件可以读成“只保留 city 等于 Tokyo 的数据”。数据库先找到 users,再决定哪些 Row 进入最终 Result Set。
SELECT *
FROM users
WHERE city = 'Tokyo';| id | name | city | |
|---|---|---|---|
| 1 | Alice | alice@example.com | Tokyo |
| 3 | Chris | chris@example.com | Tokyo |
比较数字
WHERE 也经常比较数字。price > 50 会留下 Keyboard 和 Backpack。查询价格小于等于 40 可以写 price <= 40;排除 Electronics 可以使用标准 SQL 常见的 category <> 'Electronics'。许多系统也接受 !=。
= — 等于
> < — 大于 / 小于
>= <= — 包含边界
<> — 不等于
字符串通常需要引号
文字值一般放在单引号中,例如 city = 'Tokyo';数字通常不加引号,例如 price > 50。引号告诉数据库 Alice 是字符串,而不是 Column 名或 SQL 关键字。
AND 与 OR
AND 表示所有条件都必须为真。OR 表示满足其中任意一个即可。价格大于 20 并且小于 70 会返回 Mouse 和 Backpack;城市是 Tokyo 或 Osaka 会返回三个用户。
| 运算符 | 通过条件 |
|---|---|
AND | 每个条件都为真,如同连续通过两道检查门 |
OR | 至少一个条件为真,如同任选一条可通行路线 |
SELECT *
FROM products
WHERE price > 20
AND price < 70;混用 AND 和 OR 时要明确
AND 通常比 OR 优先处理,因此不要只凭从左到右的直觉。用括号表达业务意图:(city = 'Tokyo' OR city = 'Osaka') AND id > 1。显式括号更容易阅读和维护。
使用 NOT
NOT 会反转条件,例如 WHERE NOT city = 'Tokyo' 返回不在 Tokyo 的用户。后面它还会与 IN、LIKE 和 NULL 条件组合。
最实用的方法不是背操作符,而是先写出自然语言逻辑。“价格至少 40,但不超过 80”就是 price >= 40 AND price <= 80;“Tokyo 或 Kyoto”就是两个 city 条件用 OR 连接。
让 Row 通过条件门
编辑 SELECT + WHERE。尝试比较运算符,以及由 AND 或 OR 连接的两个条件,观察哪些 Row 通过。
| id | name | city | |
|---|---|---|---|
| 1 | Alice | [email protected] | Tokyo |
| 2 | Bob | [email protected] | Osaka |
| 3 | Chris | [email protected] | Tokyo |
| 4 | Diana | [email protected] | Kyoto |
沙盒已准备好,不会连接真实数据库。知识测验
用两个条件回答业务问题
完成两条查询:
① 返回价格至少 40 且不超过 80 的商品 name 和 price;
② 返回来自 Tokyo 或 Kyoto 的用户 name 和 city。验收标准:每条恰好有两个条件,第一条使用 AND,第二条使用 OR,文字值带单引号。
可选:通用建表与数据脚本
DROP TABLE IF EXISTS products;
DROP TABLE IF EXISTS users;
CREATE TABLE users (id INTEGER, name VARCHAR(100), email VARCHAR(200), city VARCHAR(100));
CREATE TABLE products (id INTEGER, name VARCHAR(100), price DECIMAL(10, 2), category VARCHAR(50));
INSERT INTO users VALUES
(1, 'Alice', '[email protected]', 'Tokyo'),
(2, 'Bob', '[email protected]', 'Osaka'),
(3, 'Chris', '[email protected]', 'Tokyo'),
(4, 'Diana', '[email protected]', 'Kyoto');
INSERT INTO products VALUES
(1, 'Keyboard', 80.00, 'Electronics'),
(2, 'Mouse', 40.00, 'Electronics'),
(3, 'Coffee Mug', 15.00, 'Home'),
(4, 'Backpack', 60.00, 'Fashion');