🦏 第2章 SQL语法
📄 一句话概括

注释三种写法:--(两个减号加空格)、#(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 秒实验

  1. 把 -- WHERE gender = '女' 挪到行尾之外单独一行,结果会变吗?
  2. (先想再跑)# WHERE gender = '女' 在这边能用吗?报什么?
  3. SELECT /* id, */ name FROM students 会输出几列?

常见误区

  1. 用 # 写脚本注释。 MySQL 命令行能用,换 SQLite/PostgreSQL 直接语法错。
  2. 用注释「留代码」当版本管理。 一堆注释掉的旧语句只会让人不敢删;要留历史用 Git。
  3. 注释写「做了什么」。 -- 查询学生 没有任何信息量;该写的是「为什么只查女生」。
自测三问(点开对答案) 1. 三种注释哪种不可移植? —— `#`。它是 MySQL 专有的,SQLite、PostgreSQL 都不认;`-- ` 与 `/* */` 是标准写法。 2. 注释怎么当调试工具用? —— 把可疑的条件注释掉跑一次,和带条件的数对比:一样说明条件没生效,不一样说明条件在起作用。 3. `/*!40101 ... */` 是什么? —— MySQL 的版本注释:4.1.1 及以上版本会执行里面的内容,低版本当注释跳过,用于兼容。

到这里,「怎么说」这一章就完了——语法、类型、注释。 下一篇正式开始查数据:select。

相关笔记