mysql如何写select语句_mysql基本查询操作讲解

8次阅读

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

mysql如何写select语句_mysql基本查询操作讲解

SELECT 语句最简写法是什么?

能跑起来的最小 SELECT 语句就是:SELECT * FROM table_name;。它不加条件、不排序、不去重,只做最基础的数据拉取。但实际中几乎没人这么用——* 带来性能隐患,字段不可控,还容易因表结构变更导致应用报错。

推荐起步写法:SELECT id, name, created_at FROM users;。明确列出需要的字段,既提升查询效率,也增强可维护性。

WHERE 条件里 NULL 怎么判断?

直接写 WHERE status = NULL 是无效的,mysqlNULL 不参与任何等值比较,结果恒为 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(不推荐,掩盖逻辑问题)

最容易被忽略的是:开发本地关了严格模式,上线后突然报错,连带整个接口崩掉。

text=ZqhQzanResources