SQL 注释
一句话理解:注释是写给人类看的备注,数据库引擎会直接跳过它。
SQL 里写注释有两种姿势:单行注释用两个短横 -- 开头,从它到行尾的内容都是注释;多行注释用 /* ... */ 包裹,可以跨任意多行。MySQL 还额外支持 # 做单行注释,但 -- 是更通用的标准写法。
注释可以出现在 SQL 语句的任何位置——写在查询开头说明这段代码的用途,夹在列名后面解释某个字段的含义,或者单独占一行记录修改历史。数据库执行时对这些内容视而不见,只关心真正的 SQL 指令。
想想你三个月后回来看自己写的一段复杂查询——几十行 SQL,嵌套了三层子查询,还连了五张表。如果没有注释,你可能要花半小时重新理解当时的思路。如果是别人接手你的代码,那更是灾难。注释就是给未来的自己(和同事)留的线索,也是团队协作的基本礼仪。
还有一个实用场景:调试时你可以用注释快速"禁用"某段条件或某个列,而不需要删了再写、写了再删。另外,文件头部的注释通常用来记录作者、创建时间和变更日志。
基本写法:
-- 这是单行注释(从 -- 到行尾都被忽略)
/*
这是多行注释
可以跨越多行
*/
# MySQL 风格单行注释(非标准,仅 MySQL 支持)
单行注释 --
-- 后面的内容到行尾全部被数据库引擎忽略。三个典型用法:
① 放在行首,解释下方语句的用途:
-- 查询技术部所有员工的工资明细
SELECT employee_name, basic_salary
FROM employees
WHERE dept_name = '技术部';
② 放在行尾,注释掉多余的条件(调试利器):
SELECT * FROM employees -- WHERE dept_name = '技术部';
这条语句原本只查技术部,但现在 WHERE 条件被 -- 注释掉了,实际执行的是 SELECT * FROM employees——查出所有员工。调试时你可以快速"禁用"某个条件,不用删代码,需要时去掉 -- 就能恢复。
③ 放在行首,临时禁用整条语句:
-- SELECT * FROM employees WHERE dept_name = '技术部';
SELECT * FROM employees WHERE dept_name = '行政部';
上面查技术部的语句被注释掉了,只执行查行政部的。调试时经常这样在几条候选 SQL 之间切换,比反复删除和重写方便得多。
④ 放在列名后面,解释字段含义:
SELECT
employee_name, -- 员工姓名
basic_salary, -- 基本工资
performance_bonus -- 绩效奖金,无则为 0
FROM employees;
多行注释 /* ... */
/* 和 */ 之间的所有内容都被忽略,可以跨任意多行。它比 -- 更灵活——不仅能注释整块代码,还能注释一行中间的某个片段。
① 注释一段说明文字:
/*
广州飞翔科技
工资报表提取脚本
生成日期:2018 年
数据来源:feixiang_db.employees
*/
SELECT employee_name, basic_salary FROM employees;
② 调试时禁用多条语句(整块注释):
/* SELECT * FROM employees WHERE dept_name = '技术部';
SELECT * FROM employees WHERE dept_name = '市场部';
SELECT * FROM employees WHERE dept_name = '行政部'; */
SELECT * FROM employees WHERE dept_name = '人事部';
前三条全被注释掉了,只有最后一条会执行。排查问题时,一次性屏蔽一批 SQL 再逐条放开,是高效的调试节奏。
③ 注释掉 SELECT 中的某些列(精简输出):
SELECT employee_name, /*basic_salary,*/ dept_name
FROM employees;
basic_salary 列被注释掉了,查询结果只返回姓名和部门。调试大数据量时,可以先用注释去掉不必要的列,让结果更清晰。
④ 注释掉 WHERE 中的部分条件(缩小筛选范围):
SELECT * FROM employees
WHERE (dept_name = '技术部'
OR dept_name = '市场部'
/*OR dept_name = '行政部'
OR dept_name = '人事部'*/
OR dept_name = '财务部')
AND basic_salary > 8000;
中间两个部门条件被注释掉了,实际只查技术部、市场部和财务部。这样可以在不改变 SQL 整体结构的前提下,灵活调整筛选范围。
完整示例
下面是飞翔科技查询技术部员工工资的一段 SQL,综合运用了多种注释:
-- 查询技术部员工的工资明细
-- 包含基本工资、绩效奖金、社保扣除和个税
SELECT
employee_name,
basic_salary, -- 基本工资
performance_bonus, -- 绩效奖金,部分员工没有则为 0
basic_salary + performance_bonus - social_security - personal_tax AS actual_salary
FROM employees
WHERE dept_name = '技术部' /* AND basic_salary > 5000 */;
/*
广州飞翔科技
工资报表提取脚本
生成日期:2018 年
数据来源:feixiang_db.employees
*/
注意 WHERE 行的 /* AND basic_salary > 5000 */:当前查的是技术部全部员工,如果后续想只看高薪员工,去掉 /* */ 就行,不需要重新写条件。
有了这些注释,任何人拿过去都能秒懂:这段 SQL 查的是技术部,实发工资怎么算的,数据从哪来的,哪块条件是预留的调试开关。写注释花不了几秒钟,省下来的理解时间却是实实在在的。