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关键字均不区分大小写,但日期格式符必须严格大写。
为保持代码规范和可读性,建议将所有关键字、函数名、格式符统一使用全大写。