不能用 select *,因导致读取冗余列、传输数据膨胀、覆盖索引失效;易引发orm映射失败、json字段冲突、隐式依赖及上线漏测;字段列表须显式声明、逗号分隔、末尾无逗号,别名统一用as,where中不可用别名。

直接写字段名,用逗号分隔,别用 * —— 这不是风格问题,是性能和稳定性问题。
为什么不能用 SELECT *?
它会让 MySQL 多做三件事:读取所有列、传输更多数据、无法走覆盖索引。一旦表加了新字段,应用可能因字段顺序错乱或类型不兼容直接报错(比如 ORM 映射失败、JSON 序列化字段名冲突)。
- 网络带宽浪费:哪怕只用
id和name,*仍会把avatar_blob、raw_config这类大字段拖过来 - 索引失效风险:如果
WHERE条件能走索引,但SELECT *导致必须回表查其他字段,就白搭了 - 隐式依赖:代码里没声明字段,等于把 schema 变更权交给了 DBA,上线前容易漏测
SELECT 字段列表的写法细节
字段之间用英文逗号分隔,结尾**不能加逗号**;别名用 AS 或直接空格,但多字段时建议统一用 AS 避免歧义。
- 合法:
SELECT id, name AS username, created_at FROM users; - 合法但易错:
SELECT id, name username, created_at FROM users;(中间没AS,靠空格识别,字段含空格时会崩) - 非法:
SELECT id, name, FROM users;(末尾逗号,MySQL 直接报错ERROR 1064) - 别名带空格必须引号:
SELECT name AS `full name` FROM users;(反引号,单引号会当字符串字面量)
字段别名在实际场景中的坑
别名主要影响结果集的列名,但**不改变原始字段的可访问性**;在 WHERE 或 ORDER BY 中不能用别名(除非是子查询或 CTE),因为执行顺序是 FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY。
- 错误写法:
SELECT name AS n FROM users WHERE n = 'Alice';(n在WHERE阶段还不存在) - 正确写法:
SELECT name AS n FROM users WHERE name = 'Alice'; - 排序可用别名:
SELECT name AS n FROM users ORDER BY n;(ORDER BY在SELECT之后) - 聚合后必须用别名:
SELECT COUNT(*) AS cnt FROM users HAVING cnt > 100;(HAVING允许用SELECT中定义的别名)
最常被忽略的一点:字段名大小写敏感性取决于操作系统和 MySQL 配置(lower_case_table_names),但别名永远以你写的为准;生产环境建议全部小写+下划线,避免在不同部署环境下行为不一致。











