PostgreSQL教程FG021-PG SQL语法规范:标识符/关键字/表达式规则
本文档风哥主要介绍PostgreSQL教程021相关内容。风哥教程参考PostgreSQL官方文档Server Administration, SQL Language内容编写,适合DBA人员在学习和测试中使用,如果要应用于生产环境则需要自行确认。
内容简介:本文介绍PostgreSQL数据库的SQL语法规范,包括标识符、关键字和表达式的规则。风哥教程参考PostgreSQL官方文档SQL Syntax内容,详细讲解SQL语法的基本要素和使用规则,帮助读者编写规范、高效、可维护的SQL语句。
from oracle:www.itpux.com
Part01-基础概念与理论知识
1.1 SQL语法概述
SQL(Structured Query Language)是用于管理关系型数据库的标准化语言。PostgreSQL支持大部分SQL标准,并提供了许多扩展功能。SQL语法由一系列规则和约定组成,用于定义、操作和查询数据库对象。
更多视频教程www.fgedu.net.cn
SQL语法的基本要素包括:
- 标识符:用于命名数据库对象(表、列、索引等)
- 关键字:SQL语言中具有特殊含义的单词
- 表达式:由常量、变量、函数和运算符组成的计算式
- 语句:完成特定任务的SQL命令
1.2 标识符规则
标识符是用于命名数据库对象的名称,如表名、列名、索引名等。PostgreSQL中的标识符分为两种类型:
- 普通标识符:由字母、数字、下划线组成,以字母或下划线开头,不区分大小写
- 分隔标识符:用双引号括起来的标识符,可以包含特殊字符,区分大小写
普通标识符的规则:
- 必须以字母(a-z, A-Z)或下划线(_)开头
- 可以包含字母、数字(0-9)和下划线
- 长度不超过63个字符
- 不区分大小写(PostgreSQL会自动转换为小写)
- 不能是SQL关键字
1.3 关键字规则
关键字是SQL语言中具有特殊含义的单词,用于表示SQL语句的结构和操作。PostgreSQL中的关键字分为两种类型:
- 保留关键字:不能作为普通标识符使用,必须使用分隔标识符
- 非保留关键字:可以作为标识符使用,但不推荐
关键字的规则:
- 关键字不区分大小写
- 如果需要将关键字用作标识符,必须使用双引号括起来
- 建议避免使用关键字作为标识符,以提高代码可读性
1.4 表达式规则
表达式是由常量、变量、函数和运算符组成的计算式,用于计算值或指定条件。PostgreSQL中的表达式包括:
- 常量:固定值,如数字、字符串、日期等
- 列引用:表中的列名
- 函数调用:内置函数或自定义函数
- 运算符:算术运算符、比较运算符、逻辑运算符等
- 子查询:嵌套在其他SQL语句中的查询
表达式的规则:
- 表达式必须返回一个值
- 表达式中的数据类型必须兼容
- 运算符的优先级和结合性决定了表达式的计算顺序
Part02-生产环境规划与建议
2.1 命名规范建议
– 使用有意义的名称,便于理解和维护
– 采用一致的命名风格,如snake_case(下划线分隔)
– 表名使用复数形式,如fgedus、orders
– 列名使用单数形式,如fgedu_id、order_date
– 使用前缀或后缀区分不同类型的对象,如idx_表示索引、fk_表示外键
– 避免使用过长的名称,建议不超过30个字符
– 避免使用特殊字符和空格
2.2 SQL语法最佳实践
– 关键字使用大写,提高可读性
– 标识符使用小写,避免大小写问题
– 使用缩进和换行,使代码结构清晰
– 为复杂查询添加注释,说明查询目的
– 避免在WHERE子句中使用函数,影响索引使用
– 使用参数化查询,防止SQL注入
– 限制SELECT *的使用,只查询需要的列
2.3 性能考虑因素
– 使用合适的索引,提高查询性能
– 避免在大表上使用复杂表达式
– 合理使用子查询和连接查询
– 考虑查询的执行计划,优化查询语句
– 避免过度使用函数和运算符
Part03-生产环境项目实施方案
3.1 标识符使用示例
以下是PostgreSQL中标识符的使用示例。学习交流加群风哥微信: itpux-com
Password for fgedu fgedu:
psql (18.3)
Type “help” for help.
fgedudb=>
— 普通标识符示例
CREATE TABLE fgedu_employees (
employee_id SERIAL PRIMARY KEY,
first_name VARCHAR(50) NOT NULL,
last_name VARCHAR(50) NOT NULL,
email VARCHAR(100) UNIQUE NOT NULL,
hire_date DATE NOT NULL,
salary NUMERIC(10, 2) NOT NULL
);
CREATE TABLE fgedu_– 分隔标识符示例(包含特殊字符或关键字)
CREATE TABLE fgedu_”fgedu-employees” (
“employee-id” SERIAL PRIMARY KEY,
“first-name” VARCHAR(50) NOT NULL,
“last-name” VARCHAR(50) NOT NULL,
“email” VARCHAR(100) UNIQUE NOT NULL,
“date” DATE NOT NULL,
“select” VARCHAR(10) NOT NULL
);
CREATE TABLE fgedu_– 查看创建的表
\dt
List of relations
Schema | Name | Type | Owner
——–+—————–+——-+———-
public | fgedu-employees | table | fgedu
public | fgedu_employees | table | fgedu
(2 rows)
3.2 关键字处理方法
当需要使用关键字作为标识符时,必须使用双引号括起来。
CREATE TABLE fgedu_order (
order_id SERIAL PRIMARY KEY,
select VARCHAR(10) NOT NULL,
from VARCHAR(50) NOT NULL,
where VARCHAR(100) NOT NULL
);
ERROR: syntax error at or near “select”
LINE 3: select VARCHAR(10) NOT NULL,
^
— 使用分隔标识符(双引号)处理关键字
CREATE TABLE fgedu_order (
order_id SERIAL PRIMARY KEY,
“select” VARCHAR(10) NOT NULL,
“from” VARCHAR(50) NOT NULL,
“where” VARCHAR(100) NOT NULL
);
CREATE TABLE fgedu_– 插入数据到包含关键字的表
INSERT INTO fgedu_order (“select”, “from”, “where”)
VALUES (‘value1’, ‘source1’, ‘condition1’);
INSERT 0 1
— 查询包含关键字的表
SELECT order_id, “select”, “from”, “where” FROM fgedu_order;
order_id | select | from | where
———-+——–+——–+———–+
1 | value1 | source1 | condition1
(1 row)
3.3 表达式编写规则
PostgreSQL支持各种类型的表达式,包括算术表达式、比较表达式、逻辑表达式等。
SELECT 10 + 5 AS addition,
10 – 5 AS subtraction,
10 * 5 AS multiplication,
10 / 5 AS division,
10 % 3 AS modulus;
addition | subtraction | multiplication | division | modulus
———-+————-+—————-+———-+———+
15 | 5 | 50 | 2 | 1
(1 row)
— 比较表达式示例
SELECT 10 = 5 AS equal,
10 != 5 AS not_equal,
10 > 5 AS greater_than,
10 < 5 AS less_than,
10 >= 5 AS greater_or_equal,
10 <= 5 AS less_or_equal;
equal | not_equal | greater_than | less_than | greater_or_equal | less_or_equal
-------+-----------+--------------+-----------+------------------+----------------+
f | t | t | f | t | f
(1 row)
-- 逻辑表达式示例
SELECT (10 > 5) AND (5 < 8) AS logical_and,
(10 > 5) OR (5 > 8) AS logical_or,
NOT (10 > 5) AS logical_not;
logical_and | logical_or | logical_not
————-+————+————-+
t | t | f
(1 row)
— 字符串表达式示例
SELECT ‘Hello’ || ‘ ‘ || ‘World’ AS concatenation,
LENGTH(‘Hello World’) AS length,
UPPER(‘Hello World’) AS uppercase,
LOWER(‘Hello World’) AS lowercase,
SUBSTRING(‘Hello World’ FROM 1 FOR 5) AS substring;
concatenation | length | uppercase | lowercase | substring
—————+——–+————-+————-+———–+
Hello World | 11 | HELLO WORLD | hello world | Hello
(1 row)
— 日期表达式示例
SELECT CURRENT_DATE AS current_date,
CURRENT_TIME AS current_time,
CURRENT_TIMESTAMP AS current_timestamp,
CURRENT_DATE + INTERVAL ‘1 day’ AS tomorrow,
CURRENT_DATE – INTERVAL ‘1 week’ AS last_week;
current_date | current_time | current_timestamp | tomorrow | last_week
————–+——————–+——————————-+————+————-+
2026-04-02 | 14:30:45.678901+08 | 2026-04-02 14:30:45.678901+08 | 2026-04-03 | 2026-03-26
(1 row)
Part04-生产案例与实战讲解
4.1 有效标识符示例
以下是一些有效和无效标识符的示例。
CREATE TABLE fgedu_valid_table_names (
id SERIAL PRIMARY KEY,
first_name VARCHAR(50),
last_name VARCHAR(50),
email_address VARCHAR(100),
fgedu_id INTEGER,
order_date DATE,
total_amount NUMERIC(10, 2)
);
CREATE TABLE fgedu_– 有效分隔标识符
CREATE TABLE fgedu_”valid-table-names” (
“id” SERIAL PRIMARY KEY,
“first-name” VARCHAR(50),
“last-name” VARCHAR(50),
“email address” VARCHAR(100),
“fgedu id” INTEGER,
“order date” DATE,
“total amount” NUMERIC(10, 2)
);
CREATE TABLE fgedu_– 无效标识符(以数字开头)
CREATE TABLE fgedu_123table (
id SERIAL PRIMARY KEY
);
ERROR: syntax error at or near “123table”
LINE 1: CREATE TABLE fgedu_123table (
^
— 无效标识符(包含特殊字符)
CREATE TABLE fgedu_invalid@table (
id SERIAL PRIMARY KEY
);
ERROR: syntax error at or near “@”
LINE 1: CREATE TABLE fgedu_invalid@table (
^
— 无效标识符(SQL关键字)
CREATE TABLE fgedu_select (
id SERIAL PRIMARY KEY
);
ERROR: syntax error at or near “select”
LINE 1: CREATE TABLE fgedu_select (
^
4.2 关键字转义实战
在实际应用中,有时需要使用关键字作为标识符,这时必须使用双引号进行转义。学习交流加群风哥QQ113257174
CREATE TABLE fgedu_report (
report_id SERIAL PRIMARY KEY,
“select” VARCHAR(50) NOT NULL,
“from” VARCHAR(50) NOT NULL,
“where” VARCHAR(100) NOT NULL,
“group” VARCHAR(50) NOT NULL,
“order” VARCHAR(50) NOT NULL,
“limit” INTEGER NOT NULL,
“offset” INTEGER NOT NULL
);
CREATE TABLE fgedu_– 插入数据
INSERT INTO fgedu_report (“select”, “from”, “where”, “group”, “order”, “limit”, “offset”)
VALUES (‘fgedu_id, fgeduname’, ‘fgedus’, ‘status = ”active”’, ‘department’, ‘fgedu_id DESC’, 10, 0);
INSERT 0 1
— 查询数据
SELECT report_id, “select”, “from”, “where”, “group”, “order”, “limit”, “offset”
FROM fgedu_report;
report_id | select | from | where | group | order | limit | offset
———–+——————–+——-+————————-+———–+—————-+——-+——–+
1 | fgedu_id, fgeduname | fgedus | status = ‘active’ | department | fgedu_id DESC | 10 | 0
(1 row)
— 更新数据
UPDATE fgedu_report
SET “limit” = 20,
“offset” = 10
WHERE report_id = 1;
UPDATE 1
— 删除数据
DELETE FROM fgedu_report WHERE report_id = 1;
DELETE 1
4.3 表达式编写示例
以下是一些常见的表达式编写示例。
CREATE TABLE fgedu_salaries (
employee_id SERIAL PRIMARY KEY,
base_salary NUMERIC(10, 2) NOT NULL,
bonus_rate NUMERIC(5, 2) NOT NULL DEFAULT 0.1
);
CREATE TABLE fgedu_INSERT INTO fgedu_salaries (base_salary, bonus_rate)
VALUES (5000.00, 0.1),
(6000.00, 0.15),
(7000.00, 0.2),
(8000.00, 0.25),
(9000.00, 0.3);
INSERT 0 5
— 使用表达式计算总工资
SELECT
employee_id,
base_salary,
bonus_rate,
base_salary * bonus_rate AS bonus,
base_salary + (base_salary * bonus_rate) AS total_salary
FROM fgedu_salaries;
employee_id | base_salary | bonus_rate | bonus | total_salary
————-+————-+————+——-+————–+
1 | 5000.00 | 0.10 | 500.00 | 5500.00
2 | 6000.00 | 0.15 | 900.00 | 6900.00
3 | 7000.00 | 0.20 | 1400.00 | 8400.00
4 | 8000.00 | 0.25 | 2000.00 | 10000.00
5 | 9000.00 | 0.30 | 2700.00 | 11700.00
(5 rows)
— 使用表达式进行条件判断
SELECT
employee_id,
base_salary,
CASE
WHEN base_salary < 6000 THEN '低工资'
WHEN base_salary < 8000 THEN '中工资'
ELSE '高工资'
END AS salary_level
FROM fgedu_salaries;
employee_id | base_salary | salary_level
-------------+-------------+--------------+
1 | 5000.00 | 低工资
2 | 6000.00 | 中工资
3 | 7000.00 | 中工资
4 | 8000.00 | 高工资
5 | 9000.00 | 高工资
(5 rows)
-- 使用表达式进行字符串处理
CREATE TABLE fgedu_fgedus (
fgedu_id SERIAL PRIMARY KEY,
first_name VARCHAR(50) NOT NULL,
last_name VARCHAR(50) NOT NULL
);
CREATE TABLE fgedu_INSERT INTO fgedu_fgedus (first_name, last_name)
VALUES ('张', '三'),
('李', '四'),
('王', '五'),
('赵', '六'),
('钱', '七');
INSERT 0 5
-- 使用表达式拼接姓名
SELECT
fgedu_id,
first_name,
last_name,
first_name || ' ' || last_name AS full_name,
UPPER(first_name) || ' ' || UPPER(last_name) AS upper_full_name,
LOWER(first_name) || ' ' || LOWER(last_name) AS lower_full_name
FROM fgedu_fgedus;
fgedu_id | first_name | last_name | full_name | upper_full_name | lower_full_name
---------+------------+-----------+-----------+------------------+------------------+
1 | 张 | 三 | 张 三 | 张 三 | 张 三
2 | 李 | 四 | 李 四 | 李 四 | 李 四
3 | 王 | 五 | 王 五 | 王 五 | 王 五
4 | 赵 | 六 | 赵 六 | 赵 六 | 赵 六
5 | 钱 | 七 | 钱 七 | 钱 七 | 钱 七
(5 rows)
Part05-风哥经验总结与分享
1. 标识符是数据库对象的名称,应该使用有意义、一致的命名规范,便于理解和维护。
2. 关键字是SQL语言中的特殊单词,不能直接用作普通标识符,如果需要使用,必须用双引号括起来。
3. 表达式是SQL语句的核心,掌握各种表达式的使用方法可以编写更强大、更灵活的SQL查询。
4. 遵循SQL语法最佳实践,如关键字大写、标识符小写、合理缩进等,可以提高代码的可读性。
5. 考虑性能因素,避免在查询中使用复杂表达式和函数,影响查询性能。
6. 使用参数化查询,防止SQL注入攻击,提高系统安全性。
7. 定期审查和优化SQL代码,确保代码的质量和性能。
8. 学习和掌握SQL标准,同时了解PostgreSQL的扩展功能,充分利用PostgreSQL的强大特性。
9. 文档化SQL代码,为复杂查询添加注释,便于团队协作和知识传承。
10. 持续学习和实践,不断提高SQL编写能力和优化水平。更多学习教程公众号风哥教程itpux_com
通过遵循SQL语法规范和最佳实践,可以编写出高质量、高效、可维护的SQL代码,提高数据库应用的性能和可靠性。from PostgreSQL:www.itpux.com
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
