2.15 sql基础查询(SELECT、FROM、字段别名、常量与表达式)

2.15 基础查询(SELECT、FROM、字段别名、常量与表达式)

SELECT是SQL中最基础、最常用的语句,没有之一。无论你是做订单统计、用户分析,还是活动复盘,第一步都是把数据从数据库里"捞"出来。这一章我会带你彻底搞懂SELECTFROM的最基本用法,学会指定字段、起别名、用常量做计算。学完之后,你能独立从订单表、商品表中提取核心数据,为后续分析打好基础。

学习前准备:

  • 已完成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基础认知

SELECTFROM是SQL查询中最核心的两个关键字:

  • SELECT:指定要查询哪些列。

  • FROM:指定从哪张表中查询。

最简单的查询:从某张表中取出所有列和所有行。

sql 复制代码
SELECT * FROM orders;
  • *代表"所有列"。

  • 执行顺序:数据库先找到FROM指定的表,再从中取出SELECT指定的列。

在电商数据分析中,SELECT的用途

  • 查看订单明细。

  • 提取特定字段用于报表。

  • 作为子查询的基础。

我的踩坑经历 :第一次写SELECT *时,我以为*代表"所有行",其实它代表"所有列"。行是由WHERE等条件控制的。后来读了文档才明白。

全字段查询与指定字段查询

4.1 全字段查询(SELECT *)

sql 复制代码
SELECT * FROM orders;

分步操作

  1. 在DBeaver中打开SQL编辑器。

  2. 输入SELECT * FROM orders;

  3. 点击执行(三角形图标)。

  4. 观察结果返回了所有列(order_id, user_id, shop_name, amount, order_status, create_time)和5行数据。

预期结果:完整的订单表内容。

何时使用

  • 快速查看表的所有数据。

  • 探索性分析,不确定有哪些字段时。

避坑提醒 :生产环境的表可能有几十个字段,甚至包含敏感信息。SELECT *会拉取所有列,浪费带宽和内存。更重要的是,可能把不该看的字段(如用户手机号)也查出来。日常查询建议只取需要的列

4.2 指定字段查询

sql 复制代码
SELECT order_id, amount, order_status FROM orders;

分步操作

  1. 列出需要的列名,用逗号分隔。

  2. 执行,结果只包含指定的三列。

电商实操案例:运营需要一份订单号、金额、状态的列表,用于核对。

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;

分步操作

  1. SELECT order_id, amount

  2. 在列名后加AS 别名

  3. 执行,查看列头变成了别名。

预期结果:结果集中列名变为中文或自定义名称。

5.3 避坑提醒

  • 别名只在当前查询的结果集中生效,不会修改原表。

  • 别名如果包含空格或特殊字符,需要用双引号或反引号包裹。

  • WHEREGROUP BY等子句中不能使用别名(因为执行顺序问题),但在ORDER BY中可以使用。

我的踩坑经历 :我写过一个查询SELECT amount AS a FROM orders WHERE a > 100,结果报错。因为WHERESELECT之前执行,那时候别名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;

分步操作

  1. 先写出基础字段。

  2. 添加表达式(price - cost)

  3. 添加除法表达式,注意乘以100得到百分比。

  4. 执行,查看结果。

预期结果:计算出了每个商品的利润和毛利率。

电商实操案例二:订单金额含税计算

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 报错 NULLIFCASE WHEN处理
字符串拼接遇到NULL 结果为NULL COALESCE(列, '')

8.2 电商数据合规提示

  • 只查询必要的字段 :不要用SELECT *查询包含用户手机号、地址的表。即使你有权限,也不应该查询不必要的敏感信息。

  • 别名不会脱敏 :起中文别名只是为了显示,不会改变底层数据的敏感性。如果字段本身就是敏感字段(如phone),即使你起了别名"联系电话",结果仍然是明文手机号。

  • 导出数据需审批:通过查询导出的订单明细,如果包含用户ID等信息,导出前需确认是否合规。

结语

SELECTFROM是SQL查询的基石。学会指定字段、起别名、用常量表达式做计算,你就能完成电商日常80%的数据提取需求。

有问题的评论区留言,我看到会回复。

相关推荐
风子杨yxf77121 小时前
linux下oracle开机自启动以及关机自关闭数据库,并发送邮件通知
linux·运维·数据库·oracle·自启动·发邮件·自关闭
战族狼魂21 小时前
基于LibreOffice +python 实现一个小型销售管理系统的数据库原型教学实验
数据库·python
m0_6403093021 小时前
PHP函数怎样适配高可靠性存储硬件_PHP在ZFS RAIDZ环境配置【技巧】
jvm·数据库·python
踏浪无痕21 小时前
用 AI 解决数据库性能问题的方法论
数据库
2402_854808371 天前
Django REST Framework 中实现用户资料更新的完整实践指南
jvm·数据库·python
m0_748839491 天前
golang如何理解weak pointer弱引用_golang weak pointer弱引用总结
jvm·数据库·python
m0_738120721 天前
渗透测试基础ctfshow——Web应用安全与防护(五)
前端·网络·数据库·windows·python·sql·安全
2401_865439631 天前
mysql如何处理升级后的身份认证兼容性_mysql_native_password配置
jvm·数据库·python
lhbian1 天前
PHP、C++和C语言对比:哪个更适合你?
android·数据库·spring boot·mysql·kafka
NotFound4861 天前
Flask项目目录怎么分_MVC架构在Flask应用中的常见目录树
jvm·数据库·python