注释三种写法:--(两个减号加空格)、#(MySQL 专有)、/* */(块注释,可跨行)。
脚本里只用后两种之外的那两个可移植的——# 换库就报错。
Demo 演示注释的第二个用途:把 WHERE gender = '女' 注释掉,结果从 6 变成 12;
块注释包住字段等于删掉字段;
/*!40101 SET NAMES utf8mb4 */ 在 MySQL 里会执行,在这里只是一段注释。
上一篇讲类型,这一篇讲最不起眼的东西。 1.5 节已经说过三种写法的语法,这一篇讲它们在实战里怎么用。 注释在数据库里还有第二个身份:调试工具。 注释掉一个条件、对比两个数,是最快的排查手法。
一、三种写法,哪种能进脚本
-- 是标准行注释,MySQL 要求两个减号后面跟空格,所以写成 -- 注释 最稳,两边都过。
# 是 MySQL 专有,命令行里常用,
但不是标准 SQL,SQLite 直接报 unrecognized token: "#"。 脚本里别用。
/* */ 是块注释,可跨行,两边都认。
它还能写在语句中间:
SELECT id, name /* , phone */ FROM students——等于临时把那几个字段摘掉。
二、注释当调试刀:注释一句,对比两个数
排查「条件是不是写错了」最快的办法:
把 WHERE 注释掉跑一次,看总数对不对。 Demo 里 WHERE gender = '女' 给 6,
注释掉给 12——一眼就知道筛选条件生效了,问题不在这。
这招比删代码安全:注释还在,改回来只要删两个减号。
临时改查询时尽量用注释,别删了再凭记忆补。
还有一种用法是「留旧值」:-- 2026-04 口径调整,原为 0.9。
这种注释在数据类工作里非常值钱,半年后没人记得为什么是 0.95。
三、版本注释:MySQL 会执行的那种
/*!40101 SET NAMES utf8mb4 */ 这种带感叹号的块注释,MySQL 会真执行,
40101 表示「4.1.1 及以上版本才执行」。 它是给兼容性用的:老版本当注释跳过,新版本照做。
导出的 SQL 文件开头常有一串这种注释(mysqldump 生成),
别当废话删掉——它们负责字符集和时区设置,删了导入可能乱码。
本沙箱把它当普通块注释跳过,Demo 里能看到执行结果是「完成」但什么也没发生。
四、该写什么、不该写什么
该写三处:复杂 WHERE 的每个条件(为什么这么筛)、
子查询在算什么(它算出来是什么口径)、临时改过的魔法数字(原值多少、为什么改)。
不该写:-- 查询数据、-- 循环、-- i 加 1。 这类注释一年后等于噪音,还占地方。
图形工具的快捷键:Navicat 与 Workbench 都是 Ctrl + /,DBeaver 是 Ctrl + Shift + /。
加出来的一律是 --,说明这是业界默认。
五、小结
教材小结:SQL 支持单行注释 -- 与 #、多行注释 /* */;注释用于说明与临时屏蔽代码。
本课补三条:一是脚本里只用 -- 与 /* */,# 不可移植;
二是注释是最好的调试刀,屏蔽一句对比两个数;三是注释该写「为什么」,不写「做了什么」。
六、动手 Demo:注释掉一句,6 变 12
Demo 五段:先用注释屏蔽 WHERE 看数字变化,再用块注释摘字段,然后试版本注释, 最后讲该写什么不该写什么、以及图形工具的快捷键。 这一篇只有一个硬结论:注释是给「半年后的你」看的,也是给「现在的你」用的调试开关。
import sqlite3
c = sqlite3.connect(":memory:")
# 用注释临时屏蔽条件:6 变 12
c.execute("SELECT COUNT(*) FROM students WHERE gender = '女'")
c.execute("SELECT COUNT(*) FROM students -- WHERE gender = '女'")
# 块注释包住整段
c.execute("SELECT id, name FROM students LIMIT 3")
c.execute("SELECT id, name /* , phone, birthday */ FROM students LIMIT 3")
# 版本注释:MySQL 执行,SQLite 跳过
c.execute("/*!40101 SET NAMES utf8mb4 */")
实跑输出:
--------------------------------------------------------------------
第八课:注释不只是给人看的,也是调试工具
--------------------------------------------------------------------
用注释临时屏蔽一个条件,看结果怎么变
SQL> SELECT COUNT(*) AS n FROM students WHERE gender = '女'
n
--
6
(1 行)
SQL> SELECT COUNT(*) AS n FROM students -- WHERE gender = '女'
n
---
12
(1 行)
**同一句话,第二个把 where 注释掉了,12 个学生全出来。**
**排查「条件写错没」最快的办法就是这个——注释掉一句,对比两个数。**
块注释能整段屏蔽,也能写在语句中间
SQL> SELECT id, name /* , phone, birthday */ FROM students LIMIT 3
id name
------------
1 张伟
2 王芳
3 李娜
(3 行)
**字段写在块注释里,就等于没写。改查询时这么干比删掉再补回来安全。**
版本注释:MySQL 会执行,别的引擎当注释
SQL> /*!40101 SET NAMES utf8mb4 */
完成
**这句在 MySQL 里是要执行的**(`40101` 意思是「4.1.1 及以上才执行」),
**在 SQLite 里就是一段普通块注释,直接跳过。**
**导出的 SQL 文件开头常见这一串,别以为它是废话删掉。**
注释该写什么、不该写什么
**该写**:这段查询的业务含义、为什么这么绕、数据口径(是不是含税、算不算取消单)。
**不该写**:`-- 查询数据`、`-- 循环`、`-- i 加 1`——**这种注释一年后等于噪音。**
**最该写注释的三处**:复杂 where 的每个条件、子查询在算什么、
临时改过的魔法数字(`-- 2026-04 口径调整,原为 0.9`)。
图形工具里的注释快捷键
**Navicat:`Ctrl + /`** 给选中行加/去 `-- `。
**Workbench:`Ctrl + /`** 同理;**DBeaver:`Ctrl + Shift + /`**。
**快捷键加出来的都是 `-- `,说明这就是业界默认写法。**
第一段带条件查。 女生 6 个。 第二段注释掉 WHERE。 12 个全出来——两个数一对比,条件是对的,问题不在筛选。 第三段块注释摘字段。 原来四列只剩两列,改查询时这么干比删掉再补回来安全。 第四段版本注释。 在 MySQL 里这句会执行(设客户端字符集), 在这里被当注释跳过,所以看到「完成」但什么都没变。 第五段三条该写、三条不该写,外加三个快捷键。
30 秒实验
- 把
-- WHERE gender = '女'挪到行尾之外单独一行,结果会变吗? - (先想再跑)
# WHERE gender = '女'在这边能用吗?报什么? SELECT /* id, */ name FROM students会输出几列?
常见误区
- 用
#写脚本注释。 MySQL 命令行能用,换 SQLite/PostgreSQL 直接语法错。 - 用注释「留代码」当版本管理。 一堆注释掉的旧语句只会让人不敢删;要留历史用 Git。
- 注释写「做了什么」。
-- 查询学生没有任何信息量;该写的是「为什么只查女生」。
自测三问(点开对答案)
1. 三种注释哪种不可移植? —— `#`。它是 MySQL 专有的,SQLite、PostgreSQL 都不认;`-- ` 与 `/* */` 是标准写法。 2. 注释怎么当调试工具用? —— 把可疑的条件注释掉跑一次,和带条件的数对比:一样说明条件没生效,不一样说明条件在起作用。 3. `/*!40101 ... */` 是什么? —— MySQL 的版本注释:4.1.1 及以上版本会执行里面的内容,低版本当注释跳过,用于兼容。到这里,「怎么说」这一章就完了——语法、类型、注释。 下一篇正式开始查数据:select。
- ☐ (本篇完,下一篇 3.1 select 语句简介)