应明确列出所需字段而非使用*,避免性能损耗与安全风险;where条件中避免对字段使用函数导致索引失效,应改用范围查询。

SELECT 后面只写需要的字段名,别用 *
用 * 看起来省事,但实际会拖慢查询、增加网络传输、暴露不该查的字段(比如密码哈希、内部状态码)。明确列出字段是最基础也最关键的习惯。
- 正确写法:
SELECT name, email, created_at FROM users - 错误写法:
SELECT * FROM users WHERE id = 123(哪怕只查一条,也别用*) - 别名要加
AS或空格,比如SELECT user_name AS name FROM users,不加AS也合法但可读性差 - 字段名含空格或关键字时必须用反引号(MySQL)或双引号(PostgreSQL),例如
SELECT `order`, `user-id` FROM orders
WHERE 条件里别对 SELECT 字段做函数操作
比如想查“今天注册的用户”,有人写 SELECT id, name FROM users WHERE DATE(created_at) = '2024-06-01'。这会让 created_at 索引失效,全表扫描。
- 正确做法是用范围查询:
WHERE created_at >= '2024-06-01' AND created_at - 如果真要用函数,确保该字段有对应函数索引(如 MySQL 8.0+ 的函数索引),否则性能风险很大
- 字符串比较注意大小写:MySQL 默认不区分大小写,PostgreSQL 区分,必要时显式用
ILIKE或LOWER()
JOIN 时字段名冲突必须显式指定表别名
两个表都有 id 或 name 字段,不加前缀会导致 SQL 报错或结果错乱,比如 SELECT id, name FROM users JOIN profiles ON users.id = profiles.user_id 会报 Column 'id' in field list is ambiguous。
- 必须用表别名限定:
SELECT u.id, u.name, p.avatar FROM users u JOIN profiles p ON u.id = p.user_id - 别名尽量简短但有意义,
u、p可以,a、b容易混淆 - 避免在 SELECT 中重复写相同表达式,比如多次用
CONCAT(first_name, ' ', last_name),可考虑子查询或 CTE 提前计算
NULL 值处理常被忽略,但影响查询逻辑
SELECT name, email FROM users 看似简单,但如果 email 允许为 NULL,而业务代码没做判空,前端可能直接报错或显示 null 字符串。
- 需要默认值时用
COALESCE(email, 'N/A')或IFNULL(email, '')(MySQL) - WHERE 中判断 NULL 必须用
IS NULL或IS NOT NULL,不能用= NULL - 聚合函数如
COUNT(email)会跳过 NULL,而COUNT(*)统计所有行,这点常被误用
字段名拼错、大小写不一致、漏写逗号、用错括号——这些错误不会总在语法检查阶段暴露,尤其在动态拼接 SQL 或 ORM 模板里。多花十秒看一眼字段定义,比查半小时数据异常更省时间。










