Appearance
标识符和关键字
什么是标识符和关键字?
在SQL语言中,我们会遇到两种重要的元素:标识符和关键字。
- 标识符:用来命名数据库对象的名称,比如表、列、视图等。它们就像是给数据库中的"东西"起的名字。
- 关键字:SQL语言中具有特定含义的保留单词,如
SELECT
、UPDATE
、INSERT
等。
从形式上看,它们非常相似,如果不了解SQL语法,很难区分一个词是标识符还是关键字。
标识符的规则
基本规则
标识符必须遵循以下规则:
- 开头字符:必须以字母(a-z,包括带变音符号的字母和非拉丁字母)或下划线(_)开头
- 后续字符:可以包含字母、下划线、数字(0-9)或美元符号($)
- 长度限制:PostgreSQL默认最多允许63个字节长度的标识符(由NAMEDATALEN参数控制)
💡 小贴士:虽然SQL标准允许使用美元符号,但这可能影响应用程序的跨数据库可移植性。
标识符的两种类型
SQL中存在两种形式的标识符:
1. 普通标识符(不带引号)
sql
my_table
column_name
user_id
特点:
- 不区分大小写(在PostgreSQL中会被自动转换为小写)
- 不能与关键字冲突(除非加引号)
2. 带分隔符的标识符(带引号)
sql
"my-table"
"column name"
"SELECT" -- 即使是关键字也可以用作标识符
特点:
- 区分大小写
- 可以包含几乎任何字符,包括空格
- 可以使用关键字作为标识符名称
标识符大小写示例对比
不带引号 | 带引号 | 是否相同 |
---|---|---|
foo | "foo" | 相同 ✓ |
FOO | "foo" | 相同 ✓ |
Foo | "Foo" | 不同 ✗ |
foo | "FOO" | 不同 ✗ |
⚠️ 注意:PostgreSQL中不带引号的标识符会转为小写,而SQL标准规定应转为大写。为了编写可移植的应用程序,建议要么始终对特定名称使用引号,要么永远不用引号。
Unicode字符与转义序列
PostgreSQL支持在带引号的标识符中使用Unicode字符,方法是使用U&
前缀:
sql
-- 使用Unicode转义序列
U&"d\0061t\+000061" -- 等同于 "data"
-- 使用西里尔字母(俄语"大象")
U&"\0441\043B\043E\043D"
如果需要使用其他转义字符,可以指定UESCAPE
:
sql
U&"d!0061t!+000061" UESCAPE '!' -- 使用!作为转义字符
关键字的特性
关键字是SQL语言预定义的、具有特殊含义的单词。它们用于构建SQL命令和查询。
例如:SELECT
, INSERT
, UPDATE
, DELETE
, FROM
, WHERE
, JOIN
等。
关键字的主要特性
- 不区分大小写(
SELECT
与select
相同) - 不能直接用作标识符,除非加引号
- 完整的关键字列表可在PostgreSQL文档附录C中找到
标识符与关键字的最佳实践
为了提高代码可读性和一致性,推荐以下最佳实践:
命名约定:关键字使用大写,标识符使用小写
sqlSELECT column_name FROM my_table WHERE id = 5;
避免使用关键字作为标识符:即使可以通过引号使用关键字作为标识符,也应尽量避免这种做法
sql-- 不推荐 CREATE TABLE "table" ( "select" integer ); -- 推荐 CREATE TABLE my_table ( selected_value integer );
保持一致的引号使用风格:选择一种引号风格并在整个项目中保持一致
实际示例
sql
-- 创建表(使用不带引号的标识符)
CREATE TABLE students (
id serial PRIMARY KEY,
first_name varchar(50),
last_name varchar(50),
grade integer
);
-- 创建表(使用带引号的标识符,包含特殊字符)
CREATE TABLE "student-records" (
"ID" serial PRIMARY KEY,
"First Name" varchar(50),
"Last Name" varchar(50),
"Grade Level" integer
);
-- 查询数据(混合使用关键字和标识符)
SELECT first_name, last_name
FROM students
WHERE grade > 80;
通过理解标识符和关键字的规则,你可以更好地编写SQL查询,避免语法错误,同时提高代码的可读性和可维护性。