SQL 核心常用语法笔记 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各阶段含义:顺序语法作用1FROM确定从哪张表读取数据2JOIN / ON关联其他表,并确定关联条件3WHERE过滤原始明细记录4GROUP BY将过滤后的记录分组5COUNT/SUM/AVG计算每个分组的聚合结果6HAVING过滤分组后的结果7SELECT选择最终返回的字段和表达式8DISTINCT对最终结果去重9ORDER BY对结果排序10LIMIT限制最终返回行数例如: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_ms5*60*1000;2. AND、OR、NOT同时满足多个条件SELECT*FROMagent_chat_runsWHEREstatus='success'ANDduration_ms60000;满足其中任意条件SELECT*FROMagent_chat_runsWHEREstatus='failed'ORstatus='cancelled';排除某个条件SELECT*FROMagent_chat_runsWHERENOTstatus='failed';复杂条件建议添加括号:SELECT*FROMagent_chat_runsWHEREapp_code=10001AND(status='failed'ORstatus='cancelled');五、IN、BETWEEN、LIKE1. IN:匹配多个值SELECT*FROMagent_chat_runsWHEREstatusIN('success','failed','cancelled