直接写字段名比SELECT *更快、更安全,因避免全列读取、防止索引覆盖失效、规避ORM映射失败、权限泄露及新增字段导致解析错误。

直接写字段名比用 * 更快、更安全,尤其在宽表或高并发场景下。
为什么不能总用 SELECT *
看似省事,但实际会拖慢查询、浪费网络和内存。数据库要先查元数据确认所有列,再读取全部字段(包括你根本不用的 text、jsonb 或大 bytea),还可能因新增列导致应用解析出错。
- 索引覆盖失效:如果只查
id和name,而索引是(id, name, status),用SELECT id, name能走覆盖索引;SELECT *则大概率回表 - ORM 映射风险:后端模型没同步新增字段时,
SELECT *可能让ResultSet解析失败或静默丢数据 - 权限隐患:某些列(如
password_hash、ssn)本不该暴露,*会绕过字段级权限控制
SELECT 字段列表的基本写法与逗号规则
字段之间必须用英文逗号分隔,结尾不加逗号;字段名区分大小写取决于数据库(PostgreSQL 敏感,MySQL 默认不敏感,但建议统一小写)。
SELECT id, name, email, created_at FROM users;
- 别名用
AS(可省略):SELECT name AS user_name, email AS contact_email FROM users - 表达式也支持:
SELECT id, UPPER(name), LENGTH(email) FROM users - 表名前缀在多表时必须明确:
SELECT u.id, o.order_date FROM users u JOIN orders o ON u.id = o.user_id
带函数或计算字段时的注意事项
聚合函数(如 COUNT()、SUM())和普通字段混用时,必须加 GROUP BY,且 GROUP BY 的字段必须出现在 SELECT 列表中(除非是函数参数)。
SELECT department, COUNT(*) AS cnt, AVG(salary) FROM employees GROUP BY department;
- 错误示范:
SELECT department, name, COUNT(*) FROM employees GROUP BY department——name不在GROUP BY中,多数数据库报错 - NULL 处理:字段参与计算前建议用
COALESCE(col, 0)避免整行被过滤或结果异常 - 性能提示:
COUNT(*)通常最快;COUNT(col)会跳过NULL,但需判断是否真需要这个语义
容易被忽略的列名冲突与转义问题
字段名含空格、短横线或关键字(如 order、user)时,不加引号会报错。不同数据库引号规则不同:
- PostgreSQL / SQL Standard:用双引号
"order" - MySQL:用反引号
`order` - SQL Server:用方括号
[order] - 推荐做法:建表时避免用关键字作列名;已有则统一用对应引号包裹,不要混用
另外,当两个表有同名列(如都叫 id),又没加表前缀,查询会失败或返回不可预测结果——这点在 JOIN 后尤其容易踩坑。










