最简可运行SELECT语句是SELECT * FROM table_name;,但推荐明确列出字段如SELECT id, name, created_at FROM users;;NULL判断须用IS NULL/IS NOT NULL;ORDER BY必须在LIMIT前;GROUP BY需满足严格模式要求。

SELECT 语句最简写法是什么?
能跑起来的最小 SELECT 语句就是:SELECT * FROM table_name;。它不加条件、不排序、不去重,只做最基础的数据拉取。但实际中几乎没人这么用——* 带来性能隐患,字段不可控,还容易因表结构变更导致应用报错。
推荐起步写法:SELECT id, name, created_at FROM users;。明确列出需要的字段,既提升查询效率,也增强可维护性。
WHERE 条件里 NULL 怎么判断?
直接写 WHERE status = NULL 是无效的,MySQL 中 NULL 不参与任何等值比较,结果恒为 UNKNOWN,被当作假值过滤掉。
必须用专门的空值判断语法:
-
WHERE status IS NULL(判断为空) -
WHERE status IS NOT NULL(判断非空) - 别用
=、!=或跟NULL比较
常见翻车点:前端传参时把空字符串 '' 和 NULL 混为一谈,后端没做区分,查不到数据还找不到原因。
ORDER BY 和 LIMIT 的顺序不能错
ORDER BY 必须在 LIMIT 之前,否则会报语法错误。MySQL 不支持 LIMIT 10 ORDER BY created_at DESC 这种倒置写法。
正确顺序是:SELECT * FROM logs ORDER BY created_at DESC LIMIT 10;
注意两点:
-
LIMIT在分页场景下要配合OFFSET,但大偏移量(如LIMIT 100000, 20)性能极差,应改用游标分页或延迟关联 -
ORDER BY字段如果没有索引,会导致 filesort,查得越慢
GROUP BY 后 SELECT 的字段有限制
开启 SQL 标准模式(sql_mode=STRICT_TRANS_TABLES,ONLY_FULL_GROUP_BY)后,SELECT 列表里所有非聚合字段都必须出现在 GROUP BY 子句中。
比如这个会报错:SELECT user_id, name, COUNT(*) FROM orders GROUP BY user_id; —— 因为 name 没参与分组,也没套聚合函数。
解决办法只有三个:
- 把
name加进GROUP BY(适合真正按多字段分组) - 用聚合函数包裹,如
MAX(name)或ANY_VALUE(name)(MySQL 5.7+ 支持) - 关掉
ONLY_FULL_GROUP_BY(不推荐,掩盖逻辑问题)
最容易被忽略的是:开发本地关了严格模式,上线后突然报错,连带整个接口崩掉。










