目录
WHERE 子句
条件判断(IN 和 NOT IN)
范围查询(BETWEEN ... AND ...)
模糊匹配搜索 (LIKE)
排序结果(ORDER BY)
去除重复记录(DISTINCT)
限制查询返回结果(LIMIT)
列别名(Alias)
WHERE
子句
🎯 WHERE
是什么?
WHERE
是 SQL 中用于筛选数据的条件语句,可以用在:
-
SELECT
查询中:筛选要查看的行 -
UPDATE
操作中:只更新满足条件的行 -
DELETE
操作中:只删除满足条件的行
示例:用SELECT 查询:
SELECT * FROM products
WHERE price < 3.00;
👉 这条语句的作用是:只查询价格低于 3 元的咖啡产品
WHERE 支持的比较方式
类型 | 示例 | 含义 |
---|---|---|
等于 | price = 3.00 | 精确匹配 |
不等 | price != 3.00 或 <> 3.00 | 排除匹配 |
大于 | price > 3.00 | |
小于等于 | price <= 2.50 | |
范围 | price BETWEEN 2.00 AND 3.00 | 包括边界 |
列表 | name IN ('Latte', 'Espresso') | 多选匹配 |
模糊 | name LIKE 'Cap%' | 模糊匹配:以 Cap 开头 |
空值 | offee_orgin IS NULL | 检查是否为空 |
🌟 组合多个条件(AND / OR)
SELECT * FROM products
WHERE price > 2.50 AND offee_orgin = 'Brazil';
👉 两个条件都满足才会被选中。
❗ 小心逻辑优先级
WHERE price > 2.00 OR name = 'Espresso' AND offee_orgin = 'Ethiopia';
要注意 AND
的优先级高于 OR
,所以最好加括号明确逻辑:
WHERE price > 2.00 OR (name = 'Espresso' AND offee_orgin = 'Ethiopia');
条件判断(IN
和 NOT IN)
🔍 什么是 IN
和 NOT IN
?
-
IN (...)
:判断某个值是否在某个集合中 -
NOT IN (...)
:判断某个值是否不在某个集合中
这两个是 WHERE
条件里的“多选匹配器”,比多个 OR
更简洁。
INSERT INTO products(name,price,coffee_orgin)
VALUES
('Pencil', 0.50, NULL),
('Notebook', 2.20, NULL),
('Eraser', 0.80, 'Colombia'),
('Ruler', 1.50, NULL),
('Pen', 1.00, NULL),
('Espresso Beans', 2.90, 'Colombia'),
('Arabica Coffee', 1.75, 'Ethiopia'),
('Robusta Coffee', 2.50, 'Vietnam'),
('Mocha Blend', 2.30, 'Yemen'),
('House Blend', 2.10, NULL);INSERT INTO customers(first_name,last_name,gender,phone_number)
VALUES
('Alice', 'Smith', 'F', '12345678901'),
('Bob', 'Johnson', 'M', '12345678902'),
('Carol', 'Williams', 'F', NULL),
('David', 'Brown', 'M', '12345678904'),
('Eva', 'Jones', 'F', '12345678905'),
('Frank', 'Garcia', 'M', NULL),
('Grace', 'Miller', 'F', '12345678907'),
('Henry', 'Davis', 'M', NULL),
('Isabel', 'Rodriguez', 'F', '12345678909'),
('Jack', 'Martinez', 'M', NULL);INSERT INTO orders(product_id,customer_id,order_time)
VALUES
(1, 2, '2025-04-01 10:15:00'),
(3, 1, '2025-04-02 09:30:00'),
(5, 4, '2025-04-02 11:45:00'),
(6, 5, '2025-04-03 14:00:00'),
(7, 3, '2025-04-04 16:30:00'),
(8, 7, '2025-04-05 13:20:00'),
(9, 6, '2025-04-06 10:50:00'),
(10, 8, '2025-04-07 09:10:00'),
(2, 9, '2025-04-08 17:25:00'),
(4, 10, '2025-04-09 15:40:00');
✅ 示例:使用 IN
查询多个产地的咖啡
SELECT * FROM products
WHERE coffee_orgin IN ('Colombia', 'Ethiopia', 'Vietnam');
👉 查询所有产地是 哥伦比亚、埃塞俄比亚、越南 的咖啡产品。
这比你写成这样清爽多了:
WHERE coffee_orgin = 'Colombia'OR coffee_orgin = 'Ethiopia'OR coffee_orgin = 'Vietnam'
❌ 示例:使用 NOT IN
排除某些产地
SELECT * FROM products
WHERE coffee_orgin NOT IN ('Colombia', 'Ethiopia');
👉 查询所有不是哥伦比亚和埃塞俄比亚的产品(注意包括 NULL 的行不会被选中,因为 NULL NOT IN (...)
是未知)
🔄 IN
搭配子查询使用
查询下单过“咖啡类商品”的顾客
先定义“咖啡类”产品,比如名字中含 Coffee
:
SELECT * FROM customers
WHERE id IN (SELECT customer_id FROM ordersWHERE product_id IN (SELECT id FROM productsWHERE name LIKE '%Coffee%')
);
这个嵌套查询的逻辑是:
-
从
products
表找出名称中带Coffee
的产品 -
查找谁买了这些产品
-
返回这些顾客的信息
⚠️ 使用 NOT IN
时注意 NULL
的陷阱
SELECT * FROM products
WHERE coffee_orgin NOT IN ('Colombia');
👉 你可能以为这会返回不属于哥伦比亚的所有产品,但如果有一行 coffee_orgin = NULL
,那么整个判断是“不确定”,它不会包含 NULL 的那几行。
推荐用 IS NULL
显式处理:
SELECT * FROM products
WHERE coffee_orgin NOT IN ('Colombia') OR coffee_orgin IS NULL;
范围查询(BETWEEN ... AND ...)
BETWEEN
是 SQL 中用于表示范围查询的操作符,它的语法是:
表达式 BETWEEN 最小值 AND 最大值
✅ 示例:查询价格在 1.50 到 2.50 元之间的产品
SELECT * FROM products
WHERE price BETWEEN 1.50 AND 2.50;
等价于:
WHERE price >= 1.50 AND price <= 2.50;
💡 也就是说:BETWEEN
包含边界值!
如果有一条记录价格正好是 1.50 或 2.50,它是会被选中的。
模糊匹配搜索 (LIKE)
LIKE
用于在 SQL 中进行模糊匹配搜索,常用于 WHERE
子句里。
✅ 基本语法
SELECT * FROM 表名
WHERE 字符串列 LIKE 模式;
LIKE
支持两个通配符:
通配符 | 含义 |
---|---|
% | 任意数量字符(包括0个) |
_ | 任意单个字符 |
🧪 示例:从产品表中找出名字包含 Coffee
的商品
SELECT * FROM products
WHERE name LIKE '%Coffee%';
👉 匹配任何包含“Coffee”这个词的产品,例如:
-
Arabica Coffee
-
Robusta Coffee
1️⃣ 以特定前缀开头(如找以“Mocha”开头的)
SELECT * FROM products
WHERE name LIKE 'Mocha%';
匹配:Mocha Blend
(但不会匹配 “Dark Mocha Blend”)
2️⃣ 以特定后缀结尾(如找以“Beans”结尾)
SELECT * FROM products
WHERE name LIKE '%Beans';
匹配:Espresso Beans
3️⃣ 精确控制字符长度:用 _
SELECT * FROM customers
WHERE first_name LIKE 'A_ice';
👉 匹配第一位是 A
,第二位是任意字符,后面是 ice
,比如 Alice
LIKE 与 NULL 的关系
SELECT * FROM products
WHERE coffee_orgin LIKE 'C%';
这条语句不会匹配 coffee_orgin IS NULL
的行。因为LIKE
操作中,NULL LIKE 'xxx'
结果是 UNKNOWN
,不会返回。
排序结果(ORDER BY)
ORDER BY
用于指定查询结果的排序顺序。可以按一个或多个字段进行排序,支持升序(ASC
)或降序(DESC
)。
✅ 基本语法
SELECT * FROM 表名
ORDER BY 列名 [ASC|DESC];
ASC
:升序(默认),小 → 大、A → Z
DESC
:降序,大 → 小、Z → A
☕ 示例:按价格升序列出所有产品
SELECT * FROM products
ORDER BY price ASC;
👉 最便宜的产品会排在最上面。
☕ 示例:按价格降序列出所有产品
SELECT * FROM products
ORDER BY price DESC;
👉 最贵的咖啡排在最上面。
多字段排序
SELECT * FROM products
ORDER BY coffee_orgin ASC, price DESC;
含义:
-
先按
coffee_orgin
字母顺序排序 -
如果产地一样,再按价格从高到低排序
🎯 搭配 LIMIT
获取“Top N”
比如查看最便宜的 3 个产品:
SELECT * FROM productsORDER BY price ASC
LIMIT 3;
或者查看最新 5 个订单:
SELECT * FROM orders
ORDER BY order_time DESC
LIMIT 5;
注意事项
-
ORDER BY
是在 所有筛选完成后执行,如果有WHERE
条件,它先过滤再排序 -
如果字段中包含
NULL
,默认在升序中排在前面,降序中排在最后(可用IS NULL
精细控制) -
排序字段可以用表达式或函数(例如
ORDER BY LENGTH(name)
)
去除重复记录(DISTINCT)
什么是 DISTINCT
?
DISTINCT
是 SQL 中用于从结果集中去除重复记录的操作符。它通常用于 SELECT
查询中,帮助你获取唯一值的列表。
基本语法
SELECT DISTINCT 列名 FROM 表名;
它的作用是:只返回不同的(唯一的)列值。
☕ 示例:查询所有出现过的 coffee_orgin(咖啡产地)
SELECT DISTINCT coffee_orgin FROM products;
📋假设你现在的数据如下:
coffee_orgin |
---|
NULL |
Colombia |
Colombia |
Ethiopia |
Vietnam |
Yemen |
NULL |
执行后的结果是:
coffee_orgin |
---|
NULL |
Colombia |
Ethiopia |
Vietnam |
Yemen |
👉 重复的 Colombia
、多个 NULL
都只显示一次!
多列去重
SELECT DISTINCT coffee_orgin, price FROM products;
这条语句的意思是:只保留 coffee_orgin + price
组合唯一的行。不是每一列单独去重,而是把这几列看成一个整体。
限制查询返回结果(LIMIT)
什么是 LIMIT
?
LIMIT
用于限制查询结果中返回的行数,特别适用于:
-
只查看前几条记录
-
分页显示
-
测试查询效果(防止一次性返回大量数据)
基本语法:
SELECT * FROM 表名
LIMIT 行数;
☕ 示例一:查看前 5 个产品
SELECT * FROM products LIMIT 5;
返回 products
表中的前 5 行(没有排序时,是任意顺序,根据存储或查询计划决定)
☕ 示例二:搭配 ORDER BY
获取“最便宜的3种商品”
SELECT * FROM products ORDER BY price ASC LIMIT 3;
先按价格升序排序,再只返回最前面的 3 条记录。
示例三:分页查询(跳过前面几条)
SELECT * FROM products ORDER BY id LIMIT 5 OFFSET 5;
这条语句意思是:
-
跳过前 5 条
-
然后返回接下来的 5 条
简化写法:
LIMIT 起始位置, 返回行数LIMIT 5, 5 -- 从第6行开始,取5行
列别名(Alias)
列别名(Alias) 是用 AS
关键字或直接跟一个名称,为查询结果中的列起一个临时的名称。
基本语法:
SELECT 列名 AS 别名
FROM 表名;
也可以省略AS:
SELECT 列名 别名
FROM 表名;
☕ 示例一:给产品名字和价格加上友好的名字
SELECT name AS product_name,price AS unit_price
FROM products;
输出结果就像这样:
product_name | unit_price |
---|---|
Espresso Beans | 2.90 |
Arabica Coffee | 1.75 |
☕ 示例二:表达式起别名
SELECT name,price * 1.1 AS price_with_tax
FROM products;
这里 price_with_tax
就是表达式 price * 1.1
的别名。