2.15 基础查询(SELECT、FROM、字段别名、常量与表达式)
SELECT是SQL中最基础、最常用的语句,没有之一。无论你是做订单统计、用户分析,还是活动复盘,第一步都是把数据从数据库里"捞"出来。这一章我会带你彻底搞懂SELECT和FROM的最基本用法,学会指定字段、起别名、用常量做计算。学完之后,你能独立从订单表、商品表中提取核心数据,为后续分析打好基础。
学习前准备:
-
已完成MySQL安装(参考系列前几章)
-
已安装DBeaver或Navicat
-
准备一个练习数据库,比如
select_demo
学习前环境准备
步骤1:确保MySQL服务已启动。
步骤2:创建练习数据库和表,并插入示例数据。
sql
CREATE DATABASE select_demo
CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
USE select_demo;
-- 订单表
CREATE TABLE orders (
order_id VARCHAR(50) PRIMARY KEY COMMENT '订单号',
user_id INT NOT NULL COMMENT '用户ID',
shop_name VARCHAR(50) NOT NULL COMMENT '店铺名称',
amount DECIMAL(10,2) NOT NULL COMMENT '订单金额',
order_status VARCHAR(20) NOT NULL COMMENT '订单状态',
create_time DATETIME NOT NULL COMMENT '下单时间'
);
-- 插入测试数据
INSERT INTO orders VALUES
('ORD001', 1001, '女装旗舰店', 299.00, '已支付', '2025-06-01 10:00:00'),
('ORD002', 1002, '女装旗舰店', 189.00, '已取消', '2025-06-01 11:00:00'),
('ORD003', 1003, '男装专营店', 599.00, '已支付', '2025-06-02 09:30:00'),
('ORD004', 1001, '女装旗舰店', 399.00, '已支付', '2025-06-03 14:20:00'),
('ORD005', 1004, '童装店', 99.00, '已完成', '2025-06-03 16:00:00');
-- 商品表(用于后续案例)
CREATE TABLE products (
product_id INT PRIMARY KEY AUTO_INCREMENT,
product_name VARCHAR(100) NOT NULL,
category VARCHAR(50) NOT NULL,
price DECIMAL(10,2) NOT NULL,
cost DECIMAL(10,2) NOT NULL
);
INSERT INTO products (product_name, category, price, cost) VALUES
('碎花连衣裙', '女装', 299.00, 120.00),
('纯棉T恤', '男装', 89.00, 35.00),
('牛仔裤', '男装', 199.00, 85.00);
SELECT & FROM基础认知
SELECT和FROM是SQL查询中最核心的两个关键字:
-
SELECT:指定要查询哪些列。 -
FROM:指定从哪张表中查询。
最简单的查询:从某张表中取出所有列和所有行。
sql
SELECT * FROM orders;
-
*代表"所有列"。 -
执行顺序:数据库先找到
FROM指定的表,再从中取出SELECT指定的列。
在电商数据分析中,SELECT的用途:
-
查看订单明细。
-
提取特定字段用于报表。
-
作为子查询的基础。
我的踩坑经历 :第一次写
SELECT *时,我以为*代表"所有行",其实它代表"所有列"。行是由WHERE等条件控制的。后来读了文档才明白。
全字段查询与指定字段查询
4.1 全字段查询(SELECT *)
sql
SELECT * FROM orders;
分步操作:
-
在DBeaver中打开SQL编辑器。
-
输入
SELECT * FROM orders;。 -
点击执行(三角形图标)。
-
观察结果返回了所有列(order_id, user_id, shop_name, amount, order_status, create_time)和5行数据。
预期结果:完整的订单表内容。
何时使用:
-
快速查看表的所有数据。
-
探索性分析,不确定有哪些字段时。
避坑提醒 :生产环境的表可能有几十个字段,甚至包含敏感信息。SELECT *会拉取所有列,浪费带宽和内存。更重要的是,可能把不该看的字段(如用户手机号)也查出来。日常查询建议只取需要的列。
4.2 指定字段查询
sql
SELECT order_id, amount, order_status FROM orders;
分步操作:
-
列出需要的列名,用逗号分隔。
-
执行,结果只包含指定的三列。
电商实操案例:运营需要一份订单号、金额、状态的列表,用于核对。
sql
SELECT order_id, amount, order_status FROM orders;
预期结果:只显示三列,行数不变。
指定字段查询的好处:
-
减少数据传输量,提升查询速度。
-
避免暴露敏感字段。
-
让结果集更清晰,只关注需要的列。
实操避坑提醒 :列名写错会导致
Unknown column报错。建议在DBeaver中,可以从左侧树拖拽表名或字段名,避免手误。
字段别名(AS)
5.1 基础语法
给列起一个临时名字,便于阅读或后续引用。
sql
SELECT 原列名 AS 别名 FROM 表名;
AS可以省略,但建议保留以增强可读性。
5.2 电商实操案例
案例一:订单金额在报表中希望显示为"订单金额",而不是amount。
sql
SELECT order_id AS 订单号, amount AS 订单金额 FROM orders;
案例二:给计算字段起别名(结合表达式)。
sql
SELECT order_id, amount * 0.9 AS discount_price FROM orders;
案例三:中文别名(注意兼容性,大多数环境支持)。
sql
SELECT order_id AS "订单号", amount AS "金额" FROM orders;
分步操作:
-
写
SELECT order_id, amount。 -
在列名后加
AS 别名。 -
执行,查看列头变成了别名。
预期结果:结果集中列名变为中文或自定义名称。
5.3 避坑提醒
-
别名只在当前查询的结果集中生效,不会修改原表。
-
别名如果包含空格或特殊字符,需要用双引号或反引号包裹。
-
在
WHERE、GROUP BY等子句中不能使用别名(因为执行顺序问题),但在ORDER BY中可以使用。
我的踩坑经历 :我写过一个查询
SELECT amount AS a FROM orders WHERE a > 100,结果报错。因为WHERE在SELECT之前执行,那时候别名a还不存在。正确的写法是WHERE amount > 100。
常量与表达式在SELECT中的用法
6.1 常量查询
可以在SELECT中直接返回一个固定值,通常用于添加标识列。
sql
SELECT order_id, amount, '2025年大促' AS campaign_tag FROM orders;
电商场景:在导出数据时加上数据来源或批次标记。
sql
SELECT order_id, amount, '618活动' AS source FROM orders;
预期结果 :每一行都多出一列source,值全是"618活动"。
6.2 表达式计算
对列进行数学运算、字符串拼接等。
数学运算:
sql
-- 计算商品销售总额 = 单价 * 数量(假设有quantity字段,这里用amount演示)
SELECT order_id, amount, amount * 0.9 AS after_discount FROM orders;
字符串拼接 (使用CONCAT函数):
sql
SELECT CONCAT('订单号:', order_id) AS order_info FROM orders;
电商实操案例一:计算商品毛利率
假设有商品表products,包含price(售价)和cost(成本)。
sql
SELECT
product_name,
price,
cost,
(price - cost) AS profit,
(price - cost) / price * 100 AS profit_rate
FROM products;
分步操作:
-
先写出基础字段。
-
添加表达式
(price - cost)。 -
添加除法表达式,注意乘以100得到百分比。
-
执行,查看结果。
预期结果:计算出了每个商品的利润和毛利率。
电商实操案例二:订单金额含税计算
sql
SELECT
order_id,
amount AS 原金额,
amount * 0.13 AS 税费,
amount * 1.13 AS 含税金额
FROM orders;
6.3 避坑提醒
-
除法运算中分母可能为0,可以用
NULLIF避免报错:(price - cost) / NULLIF(price, 0)。 -
字符串拼接如果包含
NULL,整个结果为NULL,可用COALESCE处理。 -
表达式中的列名要确保存在,且数据类型支持运算(如数字列不能和文本列相乘)。
我的踩坑经历 :有一次计算折扣价,写成了
amount * 0.9,但amount是字符串类型(混了"¥"符号),结果返回了0。后来我先用CAST(amount AS DECIMAL)转换,才得到正确结果。参与运算的列必须是数值类型。
综合实操案例:服饰类目店铺月度订单核心数据提取
7.1 案例背景
某服饰类目店铺需要制作日常运营日报,需要从订单表中提取以下信息:
-
订单号、店铺名称、订单金额、订单状态。
-
将订单金额字段命名为"金额(元)"。
-
新增一列"是否高价值订单",金额≥500为"是",否则"否"。
-
新增一列"含税金额",按13%税率计算。
-
只查询已支付和已完成的订单(下一章会讲
WHERE,这里先全量查询,后续可加)。
7.2 分步操作
步骤1:编写基础查询
sql
SELECT
order_id,
shop_name,
amount,
order_status
FROM orders;
步骤2:添加别名
sql
SELECT
order_id AS 订单号,
shop_name AS 店铺,
amount AS 金额,
order_status AS 状态
FROM orders;
步骤3:添加表达式字段
sql
SELECT
order_id AS 订单号,
shop_name AS 店铺,
amount AS 金额,
order_status AS 状态,
CASE
WHEN amount >= 500 THEN '是'
ELSE '否'
END AS 是否高价值订单,
amount * 1.13 AS 含税金额
FROM orders;
步骤4:执行并验证
预期结果:每一行都有订单信息,并包含计算列。
步骤5:导出结果(可选)
在DBeaver中,可以右键结果集 → 导出数据 → 选择Excel格式。
7.3 案例扩展:商品销售基础指标计算
从商品表计算毛利率、毛利额。
sql
SELECT
product_name AS 商品名称,
category AS 类目,
price AS 售价,
cost AS 成本,
(price - cost) AS 毛利,
ROUND((price - cost) / price * 100, 2) AS 毛利率百分比
FROM products;
ROUND函数:保留两位小数。
本章踩坑清单与合规总结
8.1 新手常见踩坑
| 错误 | 原因 | 正确做法 |
|---|---|---|
SELECT *在生产环境使用 |
返回大量列,浪费资源 | 只选择需要的列 |
| 列名写错 | 拼写错误或大小写 | 从表结构复制列名 |
| 别名中带空格不加引号 | 语法错误 | 用双引号包裹,如AS "订单 金额" |
| 表达式分母为0 | 报错 | 用NULLIF或CASE WHEN处理 |
| 字符串拼接遇到NULL | 结果为NULL | 用COALESCE(列, '') |
8.2 电商数据合规提示
-
只查询必要的字段 :不要用
SELECT *查询包含用户手机号、地址的表。即使你有权限,也不应该查询不必要的敏感信息。 -
别名不会脱敏 :起中文别名只是为了显示,不会改变底层数据的敏感性。如果字段本身就是敏感字段(如
phone),即使你起了别名"联系电话",结果仍然是明文手机号。 -
导出数据需审批:通过查询导出的订单明细,如果包含用户ID等信息,导出前需确认是否合规。
结语
SELECT和FROM是SQL查询的基石。学会指定字段、起别名、用常量表达式做计算,你就能完成电商日常80%的数据提取需求。
有问题的评论区留言,我看到会回复。