应明确写出所需字段名而非使用*,避免性能损耗与安全风险;合理使用as别名提升可读性;多表查询须加表前缀防歧义;正确处理null值,用coalesce或is null等函数。

SELECT 后面只写需要的字段名,别用 *
用 * 看起来省事,但实际会拖慢查询、增加网络传输、暴露不该查的字段(比如密码哈希、敏感标识)。真正要查什么,就明确写出来。
常见错误是写成 SELECT * FROM users WHERE id = 123,结果把整行所有字段都拉回来,哪怕你只用 name 和 email。
- 正确写法:
SELECT name, email, created_at FROM users WHERE id = 123 - 字段顺序会影响结果列顺序,按需调整,比如把
email放前面就先返回它 - 字段名含空格或关键字时,用反引号包裹:
SELECT `user name`, `order` FROM orders - 别在
SELECT里写不存在的字段,MySQL 会直接报错:Unknown column 'xxx' in 'field list'
用 AS 给字段起别名,让结果更易读
别名不改变数据,只影响返回结果的列名。对计算字段、聚合结果或长字段名特别有用。
比如 SELECT COUNT(*) FROM logs 返回的列名是 COUNT(*),难读又难取值;加个别名立刻清晰。
- 基础用法:
SELECT user_id AS uid, COUNT(*) AS cnt FROM events GROUP BY user_id -
AS可省略,SELECT user_id uid也合法,但显式写上更稳妥 - 别名里含空格或特殊字符,必须用反引号:
SELECT email AS `contact address` - 别名不能在
WHERE中使用(执行顺序:WHERE → GROUP BY → SELECT),要用就得重复表达式或改用HAVING
查询字段来自多个表时,必须加表前缀
多表 JOIN 时,如果两个表都有 id 字段,不加前缀就会报错:Column 'id' in field list is ambiguous。
- 明确指定来源:
SELECT u.id, u.name, o.order_no FROM users u JOIN orders o ON u.id = o.user_id - 表别名(如
u、o)不是可选的“语法糖”,而是避免歧义的必要手段 - 即使只有一个表被 JOIN,只要字段名在多个表中存在(比如外键字段和主键同名),就必须加前缀
- 注意:视图或子查询里也适用同样规则,别名作用域只在当前 SELECT 层
NULL 值字段要不要查?得看业务逻辑是否依赖它
字段允许为 NULL 是常态,但很多应用默认忽略它,导致前端显示空白或崩溃。SELECT 本身不处理 NULL,但可以配合函数提前干预。
- 用
COALESCE提供默认值:SELECT COALESCE(phone, '未填写') AS phone FROM users -
IFNULL是 MySQL 特有简写,效果类似:SELECT IFNULL(status, 'pending') FROM tasks - 别在 WHERE 里写
column = NULL——永远不成立,要用IS NULL或IS NOT NULL - 聚合函数如
COUNT(column)会自动跳过 NULL,而COUNT(*)不会,这点常被误用
字段名拼错、表别名没统一、NULL 处理漏掉——这三个点,线上出问题时八成栽在这儿。











