SQL 核心常用语法笔记
以下内容以MySQL为例。SQL 是一门操作关系型数据库的语言,MySQL 实现了 SQL,并在标准 SQL 基础上增加了一些自己的语法。
一、SQL 语句的主要分类
| 分类 | 常见语句 | 用途 |
|---|---|---|
| 查询数据 | SELECT | 查询数据库中的数据 |
| 新增数据 | INSERT | 插入记录 |
| 修改数据 | UPDATE | 修改已有记录 |
| 删除数据 | DELETE | 删除记录 |
| 定义表结构 | CREATE、ALTER、DROP | 创建、修改、删除表 |
| 事务控制 | START TRANSACTION、COMMIT、ROLLBACK | 控制一组操作是否整体提交 |
| 权限控制 | GRANT、REVOKE | 管理数据库权限 |
日常数据查询和 BI 分析中,最常用的是SELECT。
二、SELECT 查询的基本结构
一个比较完整的查询结构如下:
SELECT字段或计算表达式FROM表名JOIN其他表ON关联条件WHERE明细过滤条件GROUPBY分组字段HAVING分组后的过滤条件ORDERBY排序字段LIMIT返回数量;例如:
SELECTstatus,COUNT(*)ASchat_countFROMagent_chat_runsWHEREstarted_at>='2026-08-01'GROUPBYstatusHAVINGCOUNT(*)>10ORDERBYchat_countDESCLIMIT20;它的含义是:
- 查询
2026-08-01之后的数据; - 按
status分组; - 统计每种状态的记录数;
- 只保留记录数大于 10 的状态;
- 按数量从大到小排序;
- 最多返回 20 行。
执行顺序
当前 SQL 是书写顺序:
SELECT字段或计算表达式FROM表名JOIN其他表ON关联条件WHERE明细过滤条件GROUPBY分组字段HAVING分组后的过滤条件ORDERBY排序字段LIMIT返回数量;但 SQL 的逻辑执行顺序通常是:
1. FROM 2. JOIN / ON 3. WHERE 4. GROUP BY 5. 聚合计算 6. HAVING 7. SELECT 8. DISTINCT 9. ORDER BY 10. LIMIT各阶段含义:
| 顺序 | 语法 | 作用 |
|---|---|---|
| 1 | FROM | 确定从哪张表读取数据 |
| 2 | JOIN / ON | 关联其他表,并确定关联条件 |
| 3 | WHERE | 过滤原始明细记录 |
| 4 | GROUP BY | 将过滤后的记录分组 |
| 5 | COUNT/SUM/AVG | 计算每个分组的聚合结果 |
| 6 | HAVING | 过滤分组后的结果 |
| 7 | SELECT | 选择最终返回的字段和表达式 |
| 8 | DISTINCT | 对最终结果去重 |
| 9 | ORDER BY | 对结果排序 |
| 10 | LIMIT | 限制最终返回行数 |
例如:
SELECTapp_code,COUNT(*)ASchat_countFROMagent_chat_runsWHEREstatus<>'running'GROUPBYapp_codeHAVINGCOUNT(*)>=10ORDERBYchat_countDESCLIMIT20;执行过程是:
读取 agent_chat_runs → 排除 running 记录 → 按 app_code 分组 → 计算每组的 COUNT(*) → 保留数量不少于10的分组 → 返回 app_code 和 chat_count → 按 chat_count 降序排列 → 最多返回20行这也解释了为什么:
WHERE一般不能使用聚合函数,因为此时还没有完成分组。- 聚合结果需要使用
HAVING过滤。 ORDER BY可以使用SELECT中定义的chat_count别名,因为排序发生在SELECT之后。
这是逻辑执行顺序;数据库实际执行时,优化器可能调整底层执行方式,但查询结果应符合这个逻辑。
三、SELECT:查询字段
1. 查询全部字段
SELECT*FROMagent_chat_runs;*表示查询表中的所有字段。
实际生产查询中一般不建议长期使用SELECT *,因为可能查询很多不需要的数据。
2. 查询指定字段
SELECTagent_chat_id,session_id,status,started_atFROMagent_chat_runs;3. 给字段设置别名
SELECTagent_chat_idASchat_id,duration_msASexecution_durationFROMagent_chat_runs;AS表示为查询结果设置别名,不会修改数据库原字段名。
4. 查询计算结果
SELECTduration_ms/1000.0ASduration_secondsFROMagent_chat_runs;这里会把毫秒转换为秒。
四、WHERE:过滤明细数据
WHERE用于在查询、分组和聚合之前过滤记录。
1. 比较运算符
| 运算符 | 含义 |
|---|---|
= | 等于 |
!=、<> | 不等于 |
> | 大于 |
>= | 大于等于 |
< | 小于 |
<= | 小于等于 |
例如:
SELECT*FROMagent_chat_runsWHEREstatus='failed';查询耗时超过 5 分钟的记录:
SELECT*FROMagent_chat_runsWHEREduration_ms>5*60*1000;2. AND、OR、NOT
同时满足多个条件
SELECT*FROMagent_chat_runsWHEREstatus='success'ANDduration_ms>60000;满足其中任意条件
SELECT*FROMagent_chat_runsWHEREstatus='failed'ORstatus='cancelled';排除某个条件
SELECT*FROMagent_chat_runsWHERENOTstatus='failed';复杂条件建议添加括号:
SELECT*FROMagent_chat_runsWHEREapp_code=10001AND(status='failed'ORstatus='cancelled');五、IN、BETWEEN、LIKE
1. IN:匹配多个值
SELECT*FROMagent_chat_runsWHEREstatusIN('success','failed','cancelled