SQL 中的大小写规则总结:关键字、函数名不区分大小写(建议大写),字符串值、日期格式符严格区分大小写
SQL大小写规则总结:SQL关键字不区分大小写(建议大写),但字符串值、日期格式符严格区分大小写。
表名/列名在Oracle中默认转大写,MySQL通常不区分(受平台影响)。
使用双引号时对象名必须精确匹配大小写。
函数名(如TO_CHAR、NVL)和NULL关键字不区分大小写,但日期格式符必须大写。
最佳实践:关键字全大写,对象名统一大小写,避免使用双引号,字符串值保持存储时的大小写格式。
不同数据库的具体实现略有差异,建议遵循统一的代码规范以确保兼容性。
SQL中的大小写规则总结
SQL 大小写问题一览表,涵盖语法关键字、标识符(表名/列名)、字符串值、日期格式符等常见场景。
SQL 大小写规则总结表
| 类别 | 是否区分大小写 | 说明 | 示例 |
|---|---|---|---|
| SQL 关键字 | ❌不区分 | SELECT、FROM、WHERE、AND、OR、NOT、ORDER BY 等,可大写、小写或混写,但惯例推荐大写以增强可读性。 | select * from emp;✅SELECT * FROM EMP;✅SeLeCt * FrOm Emp;✅(可行但极不规范) |
| 表名、列名等对象名 | ⚠️视数据库而定 | -Oracle / PostgreSQL / DB2:默认区分大小写,但会将未加引号的名称自动转为大写进行存储和比较。 -MySQL / SQL Server:默认不区分大小写,但受操作系统及排序规则影响,通常不强制。 -通用最佳实践:统一使用大写或小写定义,查询时不加引号。 | SELECT * FROM emp;(若表定义为EMP,则 Oracle 中emp会被转为EMP并找到)SELECT * FROM "Emp";(Oracle 中必须精确匹配大小写,很少用) |
| 字符串与日期值 | ✅严格区分大小写 | 存储在数据库中的字符串或日期字面量,等值比较时必须大小写完全匹配。 | WHERE ENAME = 'SMITH'✅WHERE ENAME = 'Smith'❌(查不到 'SMITH') |
| 日期格式符 | ✅严格区分大小写 | TO_CHAR、TO_DATE等函数中的格式代码必须使用大写,小写会被视为普通文本或报错。 | TO_CHAR(HIREDATE, 'YYYY-MM-DD')✅TO_CHAR(HIREDATE, 'yyyy-mm-dd')❌(Oracle 报错) |
| 列别名 | ❌不区分大小写 | 别名的名称本身不区分大小写,但显示时如需保留空格或大小写,需加双引号。 | SELECT ENAME AS "Name"(显示为 Name)SELECT ENAME AS name(显示为 NAME) |
| 双引号内的内容 | ✅严格区分大小写 | 双引号用于强制保留标识符的大小写或支持特殊字符。一旦使用,查询时必须完全匹配。 | SELECT * FROM "EmpTable";(必须与创建时的命名完全一致) |
分数据库详细行为表
| 数据库 | 表名/列名(无引号) | 表名/列名(有双引号) | 字符串值 | 关键字 |
|---|---|---|---|---|
| Oracle | 自动转为大写,不区分大小写 | 严格区分大小写 | 区分大小写 | 不区分 |
| MySQL | 取决于操作系统和排序规则(Linux 下通常区分,Windows 下不区分),但建议统一 | 严格区分大小写 | 区分大小写 | 不区分 |
| SQL Server | 不区分大小写(默认排序规则) | 严格区分大小写 | 区分大小写 | 不区分 |
| PostgreSQL | 自动转为小写,不区分大小写 | 严格区分大小写 | 区分大小写 | 不区分 |
错误与正确示例对照表
| 场景 | ❌ 错误示例 | ✅ 正确示例 |
|---|---|---|
| 字符串匹配 | WHERE ENAME = 'smith'(表中存的是 'SMITH') | WHERE ENAME = 'SMITH' |
| 日期格式 | TO_CHAR(HIREDATE, 'yyyy-mm-dd') | TO_CHAR(HIREDATE, 'YYYY-MM-DD') |
| 对象名(Oracle) | SELECT * FROM emp;(表定义时为Emp) | SELECT * FROM "Emp";(不推荐)或创建时统一用大写: CREATE TABLE EMP |
| 关键字风格 | select * from emp where deptno = 20(可读性差) | SELECT * FROM EMP WHERE DEPTNO = 20 |
| 双引号别名 | SELECT ENAME AS "name"(却想显示为 'NAME') | SELECT ENAME AS "NAME" |
最佳实践速记表
| 建议 | 说明 |
|---|---|
| 关键字全大写 | SELECT、FROM、WHERE、ORDER BY等 |
| 表名、列名全大写(或全小写) | 统一风格,避免跨数据库问题,如EMP、DEPTNO |
| 字符串字面量保持原始大小写 | 数据库中存的是什么样,查询就写什么样 |
| 日期格式符全部大写 | YYYY-MM-DD HH24:MI:SS |
| 尽量避免使用双引号 | 除非必须保留大小写或使用特殊字符 |
| 别名不加双引号(除非需要空格或大小写) | AS 月薪或AS "Monthly Salary" |
一句话总结
关键字不区分大小写(建议大写),字符串和日期格式符严格区分大小写,对象名在 Oracle 中默认转大写,在 MySQL 中通常不区分但受平台影响,用双引号时则必须精确匹配。
补充:TO_CHAR()、NULL及其他函数的大小写要求
以下是对上一份表格的补充内容,涵盖TO_CHAR()、NULL、NVL()等常用函数的大小写规则。
补充内容总结表
| 类别 | 是否区分大小写 | 说明 | 示例 |
|---|---|---|---|
| TO_CHAR() / TO_DATE() | ❌函数名不区分 ✅格式符严格区分 | 函数名本身不区分大小写,但内部的日期格式符必须大写。 | to_char(HIREDATE, 'YYYY-MM-DD')✅TO_CHAR(HIREDATE, 'yyyy-mm-dd')❌ |
| NULL | ❌不区分 | NULL是 SQL 关键字,可写null、Null、NULL,但惯例全大写。 | WHERE COMM IS NULL✅WHERE comm is null✅WHERE COMM IS Null✅(可行但不规范) |
| NVL() / NVL2() | ❌不区分 | 函数名不区分大小写,参数内的逻辑遵循各自规则(列名不区分,字符串区分)。 | nvl(COMM, 0)✅Nvl(comm, 0)✅NVL(COMM, 0)✅ |
| 其他单行函数 (如 SUBSTR()、LENGTH()、TRUNC()、ROUND()等) | ❌不区分 | 函数名本身不区分大小写,推荐全大写保持风格统一。 | substr(ENAME, 1, 3)✅SUBSTR(ENAME, 1, 3)✅SubStr(ENAME, 1, 3)✅(可行但规范) |
| 聚合函数 (如 SUM()、AVG()、COUNT()、MAX()、MIN()) | ❌不区分 | 函数名不区分大小写,推荐全大写。 | count(*)✅COUNT(*)✅Count(*)✅ |
详细说明与示例
1.TO_CHAR()和TO_DATE()的大小写规则
| 部分 | 大小写规则 | 正确示例 | 错误示例 |
|---|---|---|---|
| 函数名 | 不区分 | TO_CHAR、to_char、To_Char | 无(全接受) |
| 日期格式符 | 严格区分(必须大写) | 'YYYY-MM-DD HH24:MI:SS' | 'yyyy-mm-dd hh24:mi:ss'❌ |
| 格式符中的文本 | 不区分 | '"年"'、'"年"'均可 | 无 |
sql
-- ✅ 正确 SELECT TO_CHAR(HIREDATE, 'YYYY-MM-DD') FROM EMP; SELECT to_char(HIREDATE, 'YYYY-MM-DD') FROM EMP; -- ❌ 错误(格式符小写) SELECT TO_CHAR(HIREDATE, 'yyyy-mm-dd') FROM EMP; -- Oracle 报错:ORA-01821: 日期格式无法识别
2.NULL的大小写规则
NULL是 SQL 关键字,理论上不区分大小写,但强烈建议全大写以增强可读性。
sql
-- ✅ 均可执行,结果相同 SELECT * FROM EMP WHERE COMM IS NULL; SELECT * FROM EMP WHERE COMM IS null; SELECT * FROM EMP WHERE COMM IS Null; -- 以下写法虽能执行,但极不规范,避免使用 SELECT * FROM EMP WHERE COMM IS nUll;
最佳实践:
sql
-- ✅ 推荐写法 WHERE COMM IS NULL WHERE COMM IS NOT NULL -- 配合 NVL 函数 SELECT NVL(COMM, 0) FROM EMP;
3.NVL()/NVL2()函数
sql
-- ✅ 以下写法均可 SELECT NVL(COMM, 0) FROM EMP; SELECT nvl(COMM, 0) FROM EMP; SELECT Nvl(comm, 0) FROM EMP; -- 推荐写法(统一大写) SELECT NVL(COMM, 0) AS 佣金 FROM EMP;
4. 其他常用函数速查
| 函数 | 推荐写法 | 可接受但不规范 | 用途 |
|---|---|---|---|
SUBSTR() | SUBSTR(ENAME, 1, 3) | substr(ENAME, 1, 3) | 截取字符串 |
LENGTH() | LENGTH(ENAME) | length(ENAME) | 获取长度 |
TRUNC() | TRUNC(SYSDATE) | trunc(SYSDATE) | 截断日期 |
ROUND() | ROUND(SAL, 0) | round(SAL, 0) | 四舍五入 |
UPPER() | UPPER(ENAME) | upper(ENAME) | 转大写 |
LOWER() | LOWER(ENAME) | lower(ENAME) | 转小写 |
完整大小写规则汇总表
| 类别 | 区分大小写? | 推荐写法 | 说明 |
|---|---|---|---|
| SQL 关键字(SELECT、WHERE) | ❌ 不区分 | 全大写 | 增强可读性 |
| 表名、列名(无引号) | ⚠️ 视数据库而定 | 全大写 | Oracle 自动转大写,MySQL 视平台而定 |
| 表名、列名(有双引号) | ✅ 区分 | 避免使用 | 除非必须保留大小写或特殊字符 |
| 字符串值 | ✅ 区分 | 保持与存储一致 | 'SMITH'≠'smith' |
| 日期格式符 | ✅ 区分 | 全大写 | 'YYYY-MM-DD'✅'yyyy-mm-dd'❌ |
| 函数名(TO_CHAR、NVL 等) | ❌ 不区分 | 全大写 | 保持风格统一 |
| NULL | ❌ 不区分 | 全大写 | 标准写法 |
| 列别名(无引号) | ❌ 不区分 | 按需命名 | 会自动转大写(Oracle) |
| 列别名(有双引号) | ✅ 区分 | 按需命名 | 保留大小写和空格 |
一句话补充总结
函数名(包括
TO_CHAR、NVL、SUBSTR等)和NULL关键字均不区分大小写,但日期格式符必须严格大写。为保持代码规范和可读性,建议将所有关键字、函数名、格式符统一使用全大写。
