我们一起来学习 SQL 中的 SELECT 和 WHERE 语句。这些是数据库查询的基础,掌握它们可以让我们灵活地从数据库中提取所需数据。以下是本次学习的主要内容:
学习内容
- SQL 不区分大小写
SQL 关键字(如 SELECT、FROM、WHERE)不区分大小写,但为了规范,我们通常将关键字大写,字段名保持原有大小写。 - SELECT 语句基础
- SELECT 用于选择要查询的列,可以用 * 表示所有列。
- FROM 指定数据来源的表。
- 显示顺序取决于 SELECT 中列的顺序。
- 可以在 SELECT 中进行运算(如加减乘除),并用 AS 为新列命名(建议用引号规范命名)。
- WHERE 筛选数据
- WHERE 用于条件筛选,支持比较运算符(>、<、>=、<=、=、!=、<>)。
- 支持逻辑运算符:AND(与)、OR(或)、NOT(取反)。
- 注意:AND 的优先级高于 OR,可以用括号明确运算顺序。
- ORDER BY 排序
- ORDER BY 用于排序,默认升序,可按列名排序。
- WHERE、FROM 和 ORDER BY 都是可选的,但关键字顺序固定:SELECT → FROM → WHERE → ORDER BY。
- DISTINCT 去重
- DISTINCT 用于选择唯一值,去除重复结果。
- IN 和 BETWEEN
- IN 用于匹配多个离散值,用括号包裹。
- BETWEEN 用于范围筛选,用 AND 连接,包含边界值。
示例代码与讲解
1. 基础查询与筛选
SELECT *
FROM customers
WHERE customer_id = 5;
- 查询 customers 表中 customer_id 为 5 的记录。
SELECT *
FROM customers
ORDER BY first_name;
- 查询所有客户并按 first_name 排序。
2. 选择列与运算
SELECT first_name, last_name
FROM customers;
SELECT last_name, first_name
FROM customers;
- 显示顺序取决于 SELECT 中列的顺序。
SELECT first_name, last_name, points,
points + 100
FROM customers;
- 在查询中对 points 加 100。
SELECT
first_name,
last_name,
points,
points * 10 + 100 AS "discount_dactor"
FROM customers;
- 更规范的写法:列分行排列,用 AS 命名新列。
3. 去重查询
SELECT state
FROM customers;
SELECT DISTINCT state
FROM customers;
- DISTINCT 去除重复的州名。
4. WHERE 条件筛选
SELECT *
FROM customers
WHERE points > 1344;
- 查询积分大于 1344 的客户。
SELECT *
FROM customers
WHERE state != 'VA';
- 查询州不等于 'VA' 的客户(!= 和 <> 等价)。
SELECT *
FROM customers
WHERE birth_date > '1990-01-01';
- 查询出生日期晚于 1990-01-01 的客户,日期需用引号。
5. 逻辑运算符
SELECT *
FROM customers
WHERE birth_date > '1990-01-01' AND points <= 1000;
- AND:出生日期晚于 1990-01-01 且积分小于等于 1000。
SELECT *
FROM customers
WHERE birth_date > '1990-01-01' OR points <= 1000;
- OR:满足任一条件即可。
SELECT *
FROM customers
WHERE (birth_date > '1990-01-01' OR points <= 1000) AND state
= 'VA';
- 括号明确优先级:先计算 OR,再与 state = 'VA' 结合。
SELECT *
FROM customers
WHERE birth_date > '1990-01-01' OR points <= 1000 AND state
= 'VA';
- 无括号时,AND 优先级更高,相当于 (points <= 1000 AND state = 'VA') OR birth_date > '1990-01-01'。
SELECT *
FROM customers
WHERE NOT (birth_date > '1990-01-01' OR points
<= 1000);
- NOT 取反,相当于 birth_date <= '1990-01-01' AND points > 1000。
6. IN 和 BETWEEN
SELECT *
FROM customers
WHERE state IN ('VA', 'GA', 'FL');
- 查询州在 'VA'、'GA'、'FL' 中的客户。
SELECT *
FROM customers
WHERE state NOT IN ('VA', 'GA', 'FL');
- 查询州不在这些值中的客户。
SELECT *
FROM customers
WHERE points BETWEEN 1000 AND 2000;
- 查询积分在 1000 到 2000 之间的客户(包含边界)。
作业
作业 1:新价格计算
SELECT
name,
unit_price,
unit_price * 1.1 AS "new price"
FROM products;
- 计算产品单价上浮 10% 后的新价格。
作业 2:2019 年订单
SELECT *
FROM orders
WHERE order_date >= '2019-01-01';
- 查询 2019 年及以后的订单,注意使用 >= 包含边界。
作业 3:订单项筛选
SELECT *
FROM order_items
WHERE order_id = 6 AND quantity * unit_price >= 30;
- 查询订单 ID 为 6 且总价(数量 × 单价)大于等于 30 的订单项。
作业 4:库存筛选
SELECT *
FROM products
WHERE quantity_in_stock IN (38, 49, 72);
- 查询库存量为 38、49 或 72 的产品。
作业 5:出生日期范围
SELECT *
FROM customers
WHERE birth_date BETWEEN '1990-01-01' AND '2000-01-01';
- 查询 1990-2000 年出生的客户(包含边界)。
小结
通过本次学习,我们掌握了 SQL 中 SELECT 和 WHERE 的基本用法,包括筛选、排序、去重以及逻辑运算。希望大家通过练习加深理解,下次我们将继续探索更多 SQL 功能。
![]() |
Austin Liu 刘恒辉
Project Manager and Software Designer E-Mail:lzhdim@163.com Blog:https://lzhdim.cnblogs.com 欢迎收藏和转载此博客中的博文,但是请注明出处,给笔者一个与大家交流的空间。谢谢大家。 |




浙公网安备 33010602011771号