2.15 sql基础查询(SELECT、FROM、字段别名、常量与表达式)
2.15 基础查询(SELECT、FROM、字段别名、常量与表达式)
SELECT是SQL中最基础、最常用的语句,没有之一。无论你是做订单统计、用户分析,还是活动复盘,第一步都是把数据从数据库里“捞”出来。这一章我会带你彻底搞懂SELECT和FROM的最基本用法,学会指定字段、起别名、用常量做计算。学完之后,你能独立从订单表、商品表中提取核心数据,为后续分析打好基础。
学习前准备:
已完成MySQL安装(参考系列前几章)
已安装DBeaver或Navicat
准备一个练习数据库,比如
select_demo
学习前环境准备
步骤1:确保MySQL服务已启动。
步骤2:创建练习数据库和表,并插入示例数据。
CREATEDATABASEselect_demoCHARACTERSETutf8mb4COLLATEutf8mb4_unicode_ci;USEselect_demo;-- 订单表CREATETABLEorders(order_idVARCHAR(50)PRIMARYKEYCOMMENT'订单号',user_idINTNOTNULLCOMMENT'用户ID',shop_nameVARCHAR(50)NOTNULLCOMMENT'店铺名称',amountDECIMAL(10,2)NOTNULLCOMMENT'订单金额',order_statusVARCHAR(20)NOTNULLCOMMENT'订单状态',create_timeDATETIMENOTNULLCOMMENT'下单时间');-- 插入测试数据INSERTINTOordersVALUES('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');-- 商品表(用于后续案例)CREATETABLEproducts(product_idINTPRIMARYKEYAUTO_INCREMENT,product_nameVARCHAR(100)NOTNULL,categoryVARCHAR(50)NOTNULL,priceDECIMAL(10,2)NOTNULL,costDECIMAL(10,2)NOTNULL);INSERTINTOproducts(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:指定从哪张表中查询。
最简单的查询:从某张表中取出所有列和所有行。
SELECT*FROMorders;*代表“所有列”。执行顺序:数据库先找到
FROM指定的表,再从中取出SELECT指定的列。
在电商数据分析中,SELECT的用途:
查看订单明细。
提取特定字段用于报表。
作为子查询的基础。
我的踩坑经历:第一次写
SELECT *时,我以为*代表“所有行”,其实它代表“所有列”。行是由WHERE等条件控制的。后来读了文档才明白。
全字段查询与指定字段查询
4.1 全字段查询(SELECT *)
SELECT*FROMorders;分步操作:
在DBeaver中打开SQL编辑器。
输入
SELECT * FROM orders;。点击执行(三角形图标)。
观察结果返回了所有列(order_id, user_id, shop_name, amount, order_status, create_time)和5行数据。
预期结果:完整的订单表内容。
何时使用:
快速查看表的所有数据。
探索性分析,不确定有哪些字段时。
避坑提醒:生产环境的表可能有几十个字段,甚至包含敏感信息。SELECT *会拉取所有列,浪费带宽和内存。更重要的是,可能把不该看的字段(如用户手机号)也查出来。日常查询建议只取需要的列。
4.2 指定字段查询
SELECTorder_id,amount,order_statusFROMorders;分步操作:
列出需要的列名,用逗号分隔。
执行,结果只包含指定的三列。
电商实操案例:运营需要一份订单号、金额、状态的列表,用于核对。
SELECTorder_id,amount,order_statusFROMorders;预期结果:只显示三列,行数不变。
指定字段查询的好处:
减少数据传输量,提升查询速度。
避免暴露敏感字段。
让结果集更清晰,只关注需要的列。
实操避坑提醒:列名写错会导致
Unknown column报错。建议在DBeaver中,可以从左侧树拖拽表名或字段名,避免手误。
字段别名(AS)
5.1 基础语法
给列起一个临时名字,便于阅读或后续引用。
SELECT原列名AS别名FROM表名;AS可以省略,但建议保留以增强可读性。
5.2 电商实操案例
案例一:订单金额在报表中希望显示为“订单金额”,而不是amount。
SELECTorder_idAS订单号,amountAS订单金额FROMorders;案例二:给计算字段起别名(结合表达式)。
SELECTorder_id,amount*0.9ASdiscount_priceFROMorders;案例三:中文别名(注意兼容性,大多数环境支持)。
SELECTorder_idAS"订单号",amountAS"金额"FROMorders;分步操作:
写
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中直接返回一个固定值,通常用于添加标识列。
SELECTorder_id,amount,'2025年大促'AScampaign_tagFROMorders;电商场景:在导出数据时加上数据来源或批次标记。
SELECTorder_id,amount,'618活动'ASsourceFROMorders;预期结果:每一行都多出一列source,值全是“618活动”。
6.2 表达式计算
对列进行数学运算、字符串拼接等。
数学运算:
-- 计算商品销售总额 = 单价 * 数量(假设有quantity字段,这里用amount演示)SELECTorder_id,amount,amount*0.9ASafter_discountFROMorders;字符串拼接(使用CONCAT函数):
SELECTCONCAT('订单号:',order_id)ASorder_infoFROMorders;电商实操案例一:计算商品毛利率
假设有商品表products,包含price(售价)和cost(成本)。
SELECTproduct_name,price,cost,(price-cost)ASprofit,(price-cost)/price*100ASprofit_rateFROMproducts;分步操作:
先写出基础字段。
添加表达式
(price - cost)。添加除法表达式,注意乘以100得到百分比。
执行,查看结果。
预期结果:计算出了每个商品的利润和毛利率。
电商实操案例二:订单金额含税计算
SELECTorder_id,amountAS原金额,amount*0.13AS税费,amount*1.13AS含税金额FROMorders;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:编写基础查询
SELECTorder_id,shop_name,amount,order_statusFROMorders;步骤2:添加别名
SELECTorder_idAS订单号,shop_nameAS店铺,amountAS金额,order_statusAS状态FROMorders;步骤3:添加表达式字段
SELECTorder_idAS订单号,shop_nameAS店铺,amountAS金额,order_statusAS状态,CASEWHENamount>=500THEN'是'ELSE'否'ENDAS是否高价值订单,amount*1.13AS含税金额FROMorders;步骤4:执行并验证
预期结果:每一行都有订单信息,并包含计算列。
步骤5:导出结果(可选)
在DBeaver中,可以右键结果集 → 导出数据 → 选择Excel格式。
7.3 案例扩展:商品销售基础指标计算
从商品表计算毛利率、毛利额。
SELECTproduct_nameAS商品名称,categoryAS类目,priceAS售价,costAS成本,(price-cost)AS毛利,ROUND((price-cost)/price*100,2)AS毛利率百分比FROMproducts;ROUND函数:保留两位小数。
本章踩坑清单与合规总结
8.1 新手常见踩坑
| 错误 | 原因 | 正确做法 |
|---|---|---|
SELECT *在生产环境使用 | 返回大量列,浪费资源 | 只选择需要的列 |
| 列名写错 | 拼写错误或大小写 | 从表结构复制列名 |
| 别名中带空格不加引号 | 语法错误 | 用双引号包裹,如AS "订单 金额" |
| 表达式分母为0 | 报错 | 用NULLIF或CASE WHEN处理 |
| 字符串拼接遇到NULL | 结果为NULL | 用COALESCE(列, '') |
8.2 电商数据合规提示
只查询必要的字段:不要用
SELECT *查询包含用户手机号、地址的表。即使你有权限,也不应该查询不必要的敏感信息。别名不会脱敏:起中文别名只是为了显示,不会改变底层数据的敏感性。如果字段本身就是敏感字段(如
phone),即使你起了别名“联系电话”,结果仍然是明文手机号。导出数据需审批:通过查询导出的订单明细,如果包含用户ID等信息,导出前需确认是否合规。
结语
SELECT和FROM是SQL查询的基石。学会指定字段、起别名、用常量表达式做计算,你就能完成电商日常80%的数据提取需求。
有问题的评论区留言,我看到会回复。
