青少年编程与数学 02-007 PostgreSQL数据库应用 05课题、结构化查询语言SQL
- 一、结构化查询语言(SQL)
- 二、SQL分类
- 三、PostgreSQL SQL
- 四、PostgreSQL SQL语法
- 五、PL/pgSQL
- 六、标识符
- 标识符分类
- 标识符规则
- 特殊符号的使用
- 七、常量
- 常量的定义和使用
- 八、变量
- 变量的声明
- 变量的类型
- 变量的使用
- 变量的生命周期
- 变量的默认值
- 变量的规则和约定
- 示例
- 九、运算符
- 算术运算符
- 比较运算符
- 逻辑运算符
- 赋值运算符
- 字符串连接运算符
- 位运算符
- 十、表达式
- 类型和结构
- 运算符
- 函数调用
- 控制结构
- 表达式求值
- 示例
- 十一、通配符
- 通配符字符
- 使用通配符选择多列数据
- 正则表达式中的通配符
- 十二、注释
- 十三、数据定义语言
- 十四、数据操作语言
- 十五、数据控制语言
- 十六、流程控制语句
- 十七、声明语句
- 十八、比较
- 十九、`BEGIN`和`END`
- PostgreSQL (PL/pgSQL)
- Microsoft SQL Server (T-SQL)
- 总结
课题摘要:本课题详细介绍了结构化查询语言(SQL),这是一种用于管理和操作关系型数据库的标准化编程语言。SQL包含数据查询、数据操作、数据定义、数据控制和事务控制等关键组成部分。课题还探讨了SQL的分类,包括数据定义语言(DDL)、数据操纵语言(DML)、数据控制语言(DCL)和事务控制语言(TCL)。特别强调了PostgreSQL SQL的特点,如标准遵从性、功能丰富性和扩展性。同时,介绍了PL/pgSQL——PostgreSQL的存储过程语言,它结合了SQL的数据操作能力和传统编程语言的控制结构。此外,还讨论了PostgreSQL中的标识符、常量、变量、运算符、表达式、通配符、注释以及DDL和DML语句的用法。最后,比较了PL/pgSQL和T-SQL的差异,并解释了
BEGIN
和END
在不同数据库系统中的使用。
一、结构化查询语言(SQL)
结构化查询语言(SQL)是一种标准化的编程语言,用于管理和操作关系型数据库。SQL 提供了一种简单而强大的方法来执行数据库任务,如查询、插入、更新和删除数据,以及数据库管理任务,如创建或修改表结构、控制数据访问和定义数据完整性规则。
以下是 SQL 的一些关键组成部分和功能:
-
数据查询:
- 使用
SELECT
语句从数据库中检索数据。
- 使用
-
数据操作:
- 使用
INSERT
语句向数据库表中添加新数据。 - 使用
UPDATE
语句修改数据库表中的数据。 - 使用
DELETE
语句从数据库表中删除数据。
- 使用
-
数据定义:
- 使用
CREATE
语句创建新的数据库对象,如表、视图、索引、存储过程和函数。 - 使用
ALTER
语句修改现有数据库对象的结构。 - 使用
DROP
语句删除数据库对象。
- 使用
-
数据控制:
- 使用
GRANT
语句授予用户或角色对数据库对象的特定权限。 - 使用
REVOKE
语句撤销用户或角色的权限。
- 使用
-
事务控制:
- 使用
BEGIN TRANSACTION
、COMMIT
和ROLLBACK
语句来管理事务,确保数据的完整性和一致性。
- 使用
-
错误处理:
- 使用
TRY...CATCH
语句来处理错误和异常。
- 使用
-
数据完整性:
- 使用
PRIMARY KEY
、FOREIGN KEY
和UNIQUE
约束来定义数据完整性规则。
- 使用
-
索引:
- 使用
CREATE INDEX
和DROP INDEX
语句来创建和删除索引,以优化查询性能。
- 使用
-
联合查询:
- 使用
JOIN
语句来合并两个或多个表中的数据。
- 使用
-
子查询:
- 在一个查询中嵌套另一个查询,可以是
SELECT
、INSERT
、UPDATE
或DELETE
语句的一部分。
- 在一个查询中嵌套另一个查询,可以是
-
集合操作:
- 使用
UNION
、INTERSECT
和EXCEPT
运算符来组合多个查询的结果集。
- 使用
-
分组和聚合:
- 使用
GROUP BY
子句和聚合函数(如COUNT
、SUM
、AVG
、MIN
、MAX
)来处理数据集。
- 使用
-
安全性:
- 使用
CREATE LOGIN
、ALTER LOGIN
和DROP LOGIN
语句来管理数据库登录账户。
- 使用
-
信息检索:
- 使用
LIKE
、BETWEEN
、IN
和EXISTS
等运算符来过滤和检索数据。
- 使用
-
编程扩展:
- 使用存储过程、函数、触发器和游标等高级编程结构。
SQL 的语法和功能在不同的数据库管理系统(如 Oracle、MySQL、SQL Server、PostgreSQL 等)中可能有所不同,但基本概念和操作是相似的。
以下是一个简单的 SQL SELECT
语句示例,用于从名为 Employees
的表中检索所有员工的姓名和电子邮件地址:
SELECT FirstName, EmailAddress
FROM Employees;
SQL 是数据库管理员、开发者和分析师用来与关系型数据库进行交互的必备工具。通过 SQL,用户可以有效地查询、更新和管理存储在数据库中的数据。
二、SQL分类
SQL(Structured Query Language)可以分为几个不同的类别,主要基于其用途和功能。以下是 SQL 的主要分类:
-
数据定义语言(DDL):
- 用于定义和管理数据库结构的语言。
- 主要命令包括
CREATE
、ALTER
、DROP
、TRUNCATE
等。 - 例如,
CREATE TABLE
用于创建新表,ALTER TABLE
用于修改现有表结构。
-
数据操纵语言(DML):
- 用于检索和修改数据库中数据的语言。
- 主要命令包括
SELECT
、INSERT
、UPDATE
、DELETE
等。 - 例如,
SELECT
用于查询数据,INSERT INTO
用于插入新数据。
-
数据控制语言(DCL):
- 用于定义数据库的安全性和权限控制的语言。
- 主要命令包括
GRANT
、REVOKE
等。 - 例如,
GRANT
用于授予用户权限,REVOKE
用于撤销用户权限。
-
事务控制语言(TCL):
- 用于管理数据库事务的语言。
- 主要命令包括
BEGIN TRANSACTION
、COMMIT
、ROLLBACK
、SAVEPOINT
等。 - 例如,
COMMIT
用于保存事务中的更改,ROLLBACK
用于撤销事务。
-
查询语言:
- 专门用于检索数据的 SQL 部分。
- 包括
SELECT
语句及其扩展,如JOIN
、WHERE
、ORDER BY
、GROUP BY
、HAVING
等子句。
-
程序化SQL:
- 用于编写存储过程、函数、触发器等数据库对象的 SQL 部分。
- 包括流程控制语句,如
IF
、WHILE
、LOOP
、CASE
等。
-
数据控制语言(DCD):
- 用于控制数据库的物理存储和性能的语言。
- 主要命令包括
CREATE INDEX
、DROP INDEX
、CREATE VIEW
等。
-
信息检索语言:
- 用于从数据库中检索数据的 SQL 部分。
- 包括
SELECT
语句和相关的子句,如WHERE
、ORDER BY
、LIMIT
等。
-
维护语言:
- 用于维护数据库的 SQL 部分。
- 包括用于备份和恢复数据库的命令,如
BACKUP DATABASE
、RESTORE DATABASE
等。
-
嵌入式SQL:
- 用于在宿主编程语言(如 C、Java)中嵌入 SQL 语句的语言。
-
扩展SQL:
- 用于提供特定于数据库系统的功能和扩展的语言。
-
对象关系SQL:
- 结合了面向对象编程的概念和传统的关系型数据库模型。
不同的数据库管理系统(DBMS)可能会有不同的扩展和实现方式,但上述分类提供了一个通用的 SQL 分类框架。
三、PostgreSQL SQL
PostgreSQL SQL,通常简称为PostgreSQL方言,是一种遵循SQL标准的数据库查询和编程语言,专门用于PostgreSQL数据库管理系统。以下是PostgreSQL SQL的一些关键特点和简介:
-
标准遵从性:
- PostgreSQL致力于遵循ANSI SQL(美国国家标准协会)和ISO SQL标准,这意味着它支持大多数标准SQL功能,确保了代码的可移植性。
-
功能丰富:
- PostgreSQL提供了许多高级功能,包括窗口函数、部分索引、表继承、高级数据类型(如数组、JSON、XML、HSTORE和PostGIS)等。
-
扩展性:
- 用户可以扩展SQL语言,通过创建自定义的数据类型、函数、操作符等来满足特定的需求。
-
数据完整性:
- 支持多种约束,包括主键、外键、唯一性、检查和排他性约束,以确保数据的完整性。
-
事务和并发控制:
- 支持ACID(原子性、一致性、隔离性、持久性)事务,确保数据操作的可靠性。
- 提供多种隔离级别,以控制并发事务的可见性和一致性。
-
触发器和规则系统:
- 支持触发器,允许在INSERT、UPDATE或DELETE操作之前或之后自动执行代码。
- 规则系统允许复杂的查询改写和数据流控制。
-
安全性:
- 提供角色基于的访问控制,可以精细地管理用户权限。
-
备份和恢复:
- 支持各种备份和恢复技术,包括热备份和点时间恢复。
-
全文搜索:
- 内置全文搜索功能,支持文本数据的高效搜索。
-
国际化和本地化:
- 支持多种字符编码,包括UTF-8,以及多种语言和区域设置。
-
存储过程:
- 支持存储过程和函数,允许编写复杂的业务逻辑并存储在数据库中。
-
复制功能:
- 支持逻辑复制和物理复制,允许数据在多个数据库实例之间同步。
PostgreSQL SQL是一种功能强大、灵活且可扩展的SQL方言,它为开发人员和数据库管理员提供了广泛的工具和选项,以满足各种复杂的数据库需求。
四、PostgreSQL SQL语法
PostgreSQL SQL的语法约定遵循标准的SQL规范,并有一些特定的约定和扩展。以下是一些基本的语法约定:
-
标识符:
- 标识符(如表名、列名、别名等)可以用双引号
"
括起来,特别是当它们包含特殊字符或关键字时。 - 例如:
SELECT "columnName" FROM "tableName";
- 标识符(如表名、列名、别名等)可以用双引号
-
关键字:
- PostgreSQL中的SQL关键字不区分大小写,但习惯上使用大写。
- 例如:
SELECT
、FROM
、WHERE
等。
-
注释:
- 使用
--
添加单行注释,使用/* ... */
添加多行注释。 - 例如:
-- 这是一个单行注释 SELECT /* 这是一个 多行注释 */ column_name FROM table_name;
- 使用
-
字符串字面量:
- 字符串可以用单引号
'
括起来。 - 例如:
SELECT 'text';
- 字符串可以用单引号
-
数字字面量:
- 数字不需要引号,直接写数字即可。
- 例如:
SELECT 123;
-
布尔值:
- 布尔值使用小写
true
和false
表示。 - 例如:
SELECT true;
- 布尔值使用小写
-
空值:
- 空值使用小写
null
表示。 - 例如:
SELECT null;
- 空值使用小写
-
函数和操作符:
- 函数名和操作符通常不使用引号,除非它们是关键字或包含特殊字符。
- 例如:
SELECT NOW();
-
SQL语句结构:
- SQL语句以分号
;
结束,允许在单个查询中使用多个分号分隔的语句。 - 例如:
SELECT * FROM table_name; UPDATE table_name SET column_name = 'value';
- SQL语句以分号
-
大小写敏感性:
- PostgreSQL中的字符串比较默认是大小写敏感的,除非在创建数据库或表时指定了不同的排序规则。
-
数据类型:
- PostgreSQL支持多种数据类型,包括数值、日期/时间、字符串、布尔值等,以及一些特殊的数据类型如数组、JSON、XML等。
-
PL/pgSQL:
- PostgreSQL提供了PL/pgSQL过程语言,用于编写存储过程和函数,它遵循自己的一套语法规则。
这些是PostgreSQL SQL的一些基本语法约定。由于PostgreSQL支持广泛的SQL功能和一些特有的扩展,因此在实际使用中可能会遇到更多特定的语法和约定。
五、PL/pgSQL
PL/pgSQL 是 PostgreSQL 数据库的存储过程语言,它是一种基于 SQL 的过程式编程语言,用于在数据库中编写和存储复杂的逻辑。PL/pgSQL 结合了 SQL 的数据操作能力和传统的编程语言(如 C 或 Pascal)的控制结构,使得开发者能够在数据库层面实现复杂的业务逻辑。
以下是 PL/pgSQL 的一些关键特性:
-
变量声明:
- 可以在 PL/pgSQL 代码块中声明变量,并指定它们的数据类型。
variable_name data_type;
-
控制结构:
- 支持标准的编程控制结构,如
IF
条件语句、CASE
语句、LOOP
、WHILE
和FOR
循环。
IF condition THEN -- code to execute if condition is true ELSE -- code to execute if condition is false END IF;
- 支持标准的编程控制结构,如
-
异常处理:
- 可以捕获和处理异常,类似于其他编程语言中的
TRY...CATCH
块。
BEGIN -- code that might raise an exception EXCEPTION WHEN exception_type THEN -- code to handle the exception END;
- 可以捕获和处理异常,类似于其他编程语言中的
-
事务控制:
- 可以在 PL/pgSQL 中控制事务,使用
COMMIT
和ROLLBACK
语句。
BEGIN; -- some SQL statements COMMIT; -- or ROLLBACK;
- 可以在 PL/pgSQL 中控制事务,使用
-
游标:
- 可以使用游标在 PL/pgSQL 代码中处理查询结果集。
CURSOR cursor_name FOR SELECT statement;
-
函数和过程:
- 可以创建存储函数和存储过程,这些可以接收参数并在数据库中被调用。
CREATE OR REPLACE FUNCTION function_name(参数列表) RETURNS 返回类型 AS $$ DECLARE -- 变量声明 BEGIN -- 函数体 RETURN 返回值; END; $$ LANGUAGE plpgsql;
-
复合数据类型:
- 可以创建复合数据类型(类似于 C 结构体),并在 PL/pgSQL 中使用它们。
-
触发器:
- 可以创建触发器函数,这些函数会在特定的数据库事件(如 INSERT、UPDATE、DELETE)发生时自动执行。
-
动态 SQL:
- 可以使用
EXECUTE
语句执行动态构建的 SQL 命令。
- 可以使用
-
并发和并行:
- PL/pgSQL 支持并发控制,允许在多用户环境中安全地执行操作。
PL/pgSQL 是 PostgreSQL 强大的功能之一,它允许开发者在数据库层面实现复杂的逻辑,而无需依赖外部应用程序代码。这有助于提高性能,因为数据处理更接近数据存储的位置,并且可以减少网络通信的开销。
六、标识符
在PL/pgSQL中,标识符是用来标识变量、常量、游标、函数等用户定义的名称。以下是PL/pgSQL中标识符的分类、规则和特殊符号的使用等详细信息:
标识符分类
- 变量:用于存储程序运行时的数据。
- 常量:用于存储不变的值。
- 游标:用于逐行处理查询结果集。
- 函数名:用于定义或调用函数。
- 异常名:用于定义异常处理。
标识符规则
-
命名规则:
- 标识符必须以字母(
a
-z
,包括带变音符的字母和非拉丁字母)或下划线(_
)开始。 - 后续字符可以是字母、下划线(
_
)、数字(0
-9
)或美元符号($
)。 - 标识符名不能超过
NAMEDATALEN
-1字节,默认情况下NAMEDATALEN
的值为64,因此标识符的长度上限为63字节。
- 标识符必须以字母(
-
大小写敏感性:
- PostgreSQL中的标识符默认是大小写不敏感的,但是被双引号括起来的标识符被视为受限标识符,这种标识符对大小写敏感。
-
关键字和标识符:
- 关键词是SQL语言中具有特定意义的词,如
SELECT
、UPDATE
等。标识符用于标识表、列或其他数据库对象的名字。
- 关键词是SQL语言中具有特定意义的词,如
特殊符号的使用
-
双引号:
- 被双引号括起来的标识符称为受限标识符,这种标识符可以包含任何字符,包括那些通常不是标识符一部分的字符,如空格和关键字。
- 例如:
"MY_TABLE"
和"A"
都是受限标识符。
-
转义字符:
- PostgreSQL使用反斜杠(
\
)作为转义字符。当我们想在字符串中包含引号、反斜杠或其他特殊字符时,我们可以使用转义字符来表示这些字符。 - 例如,如果我们想在字符串中包含一个单引号,我们可以写作两个单引号:
'I''m fine'
。
- PostgreSQL使用反斜杠(
-
动态SQL中的引号处理:
- 在动态SQL中,使用
quote_ident
和quote_literal
函数来正确处理引号和特殊字符。 -
quote_ident
用于转义标识符,quote_literal
用于转义字面量值。
- 在动态SQL中,使用
这些规则和约定定义了如何在PL/pgSQL中正确地使用标识符,以确保代码的正确性和可读性。
七、常量
在PL/pgSQL中,常量是一种特殊的变量,其值在定义后不能被改变。以下是关于PL/pgSQL中常量的详细信息:
常量的定义和使用
-
声明常量:
在PL/pgSQL中,常量可以通过在变量声明时使用CONSTANT
关键字来定义。这表示一旦常量被初始化,其值就不能被修改。常量的声明语法如下:name CONSTANT type [ COLLATE collation_name ] [ NOT NULL ] [ { DEFAULT | := | = } expression ];
例如,声明一个名为
MAX_SIZE
的常量,其值为100:DECLARE MAX_SIZE CONSTANT integer := 100;
参考:[PL/pgSQL 常量]。
-
常量的类型:
常量可以是任何数据类型,包括数值类型、字符串类型、布尔类型等。例如:- 数值常量:
DECLARE max_items CONSTANT integer := 100;
- 字符串常量:
DECLARE app_name CONSTANT text := 'MyApplication';
- 布尔常量:
DECLARE is_active CONSTANT boolean := true;
- 数值常量:
-
常量的默认值:
在声明常量时,可以指定一个默认值,如果未指定,默认值为SQL空值(NULL)。例如:DECLARE default_value CONSTANT integer DEFAULT 0;
-
常量的作用域:
常量的作用域限制在声明它们的块内。如果在一个函数或过程中声明了一个常量,它只能在该函数或过程内部访问。 -
常量与变量的区别:
常量与普通变量的主要区别在于常量的值在初始化后不能被改变,而普通变量的值可以在程序执行过程中被重新赋值。 -
使用常量的好处:
使用常量可以提高代码的可维护性,因为如果需要更改某个值,只需在定义常量的地方更改一次,而不需要在代码的多个地方进行更改。 -
常量的特殊符号:
在PL/pgSQL中,常量可以使用与普通变量相同的标识符规则,并且可以使用双引号来创建受限标识符,如果常量名称与SQL关键字冲突或包含特殊字符。
通过使用常量,你可以在PL/pgSQL代码中创建一个值不可变的变量,这有助于减少程序中的错误,并提高代码的清晰度和可维护性。
八、变量
在PL/pgSQL中,变量是用来存储数据值的临时存储位置,这些值在程序执行过程中可能会改变。以下是关于PL/pgSQL中变量的详细信息:
变量的声明
-
基本声明:
在PL/pgSQL中,变量在使用前必须声明,声明时需要指定变量的名称和数据类型。例如:DECLARE v_variable_name some_data_type;
其中
v_variable_name
是变量的名称,some_data_type
是变量的数据类型。 -
初始化:
变量在声明时可以初始化,即赋予一个初始值。例如:DECLARE v_counter INTEGER := 0;
-
作用域:
变量的作用域是其被声明的代码块,包括函数、过程或匿名代码块。在作用域外,变量不可见。
变量的类型
-
基本数据类型:
PL/pgSQL支持PostgreSQL的所有基本数据类型,如INTEGER
、VARCHAR
、BOOLEAN
、DATE
、TIMESTAMP
等。 -
复合数据类型:
除了基本数据类型,PL/pgSQL还支持数组、复合类型(用户自定义的数据类型)等复合数据类型。 -
引用类型:
PL/pgSQL允许声明引用类型变量,这些变量存储对另一个变量的引用。
变量的使用
-
赋值:
变量可以在声明后被赋新值。例如:v_counter := v_counter + 1;
-
参数传递:
在函数中,变量可以作为参数传递给其他函数或过程。 -
返回值:
函数可以返回变量的值。
变量的生命周期
-
局部变量:
在PL/pgSQL的函数或过程中声明的变量是局部变量,它们只在当前函数或过程中有效。 -
持久变量:
在异常处理块中声明的变量在异常处理结束后仍然存在,直到整个函数或过程结束。
变量的默认值
-
默认值:
如果变量在声明时没有初始化,它们将被赋予默认值,对于大多数数据类型来说,这个默认值是NULL。
变量的规则和约定
-
命名约定:
变量名应遵循标识符的命名规则,通常使用小写字母和下划线来提高可读性。 -
避免关键字:
避免使用SQL关键字作为变量名,如果必须使用,可以用双引号括起来。 -
清晰性:
变量名应尽可能描述性,以提高代码的可读性。
示例
CREATE OR REPLACE FUNCTION increment_counter()
RETURNS VOID AS $$
DECLARE
v_counter INTEGER := 0; -- 声明并初始化变量
BEGIN
v_counter := v_counter + 1; -- 变量赋新值
-- 其他逻辑...
END;
$$ LANGUAGE plpgsql;
在这个例子中,v_counter
是一个整型变量,它被初始化为0,并在函数体内递增。这个变量的作用域仅限于increment_counter
函数内部。
通过使用变量,PL/pgSQL允许开发者在存储过程、函数和触发器中存储和操作数据,实现复杂的业务逻辑。
九、运算符
PL/pgSQL中的运算符与大多数编程语言中的运算符类似,它们用于执行数学和逻辑计算。以下是PL/pgSQL中常用的运算符及其详细说明:
算术运算符
-
加法 (
+
):- 用于计算两个数值的和。
- 例如:
result := a + b;
-
减法 (
-
):- 用于计算两个数值的差。
- 例如:
result := a - b;
-
乘法 (
*
):- 用于计算两个数值的乘积。
- 例如:
result := a * b;
-
除法 (
/
):- 用于计算两个数值的商。
- 例如:
result := a / b;
-
模运算 (
%
):- 用于计算两个整数的余数。
- 例如:
result := a % b;
-
指数运算 (
**
):- 用于计算一个数的另一个数次幂。
- 例如:
result := a ** b;
比较运算符
-
等于 (
=
或==
):- 检查两个值是否相等。
- 例如:
IF a = b THEN ...;
-
不等于 (
<>
或!=
):- 检查两个值是否不相等。
- 例如:
IF a <> b THEN ...;
-
大于 (
>
):- 检查一个值是否大于另一个值。
- 例如:
IF a > b THEN ...;
-
小于 (
<
):- 检查一个值是否小于另一个值。
- 例如:
IF a < b THEN ...;
-
大于等于 (
>=
):- 检查一个值是否大于或等于另一个值。
- 例如:
IF a >= b THEN ...;
-
小于等于 (
<=
):- 检查一个值是否小于或等于另一个值。
- 例如:
IF a <= b THEN ...;
逻辑运算符
-
逻辑与 (
AND
):- 用于组合两个布尔表达式,只有当两个表达式都为真时,结果才为真。
- 例如:
IF condition1 AND condition2 THEN ...;
-
逻辑或 (
OR
):- 用于组合两个布尔表达式,只要有一个表达式为真,结果就为真。
- 例如:
IF condition1 OR condition2 THEN ...;
-
逻辑非 (
NOT
):- 用于反转布尔表达式的值,将真变为假,将假变为真。
- 例如:
IF NOT condition THEN ...;
赋值运算符
-
赋值 (
:=
):- 将右侧的值赋给左侧的变量。
- 例如:
variable := expression;
字符串连接运算符
-
拼接 (
||
):- 用于连接两个字符串。
- 例如:
result := string1 || string2;
位运算符
-
按位与 (
&
):- 对两个整数的二进制表示进行按位与操作。
- 例如:
result := a & b;
-
按位或 (
|
):- 对两个整数的二进制表示进行按位或操作。
- 例如:
result := a | b;
-
按位异或 (
#
):- 对两个整数的二进制表示进行按位异或操作。
- 例如:
result := a # b;
-
按位非 (
~
):- 对一个整数的二进制表示进行按位非操作。
- 例如:
result := ~a;
-
左移 (
<<
):- 将一个整数的二进制表示向左移动指定的位数。
- 例如:
result := a << b;
-
右移 (
>>
):- 将一个整数的二进制表示向右移动指定的位数。
- 例如:
result := a >> b;
这些运算符在PL/pgSQL中扮演着重要的角色,它们使得程序能够执行复杂的计算和逻辑判断。在使用这些运算符时,需要注意它们的优先级和结合性,以确保程序的正确性和预期的行为。
十、表达式
在PL/pgSQL中,表达式是由变量、常量、运算符和函数调用组成的组合,它们用于计算和返回一个值。表达式可以在PL/pgSQL的任何地方使用,包括赋值语句、条件语句、循环语句等。以下是PL/pgSQL中表达式的详细说明:
类型和结构
-
简单表达式:
- 只包含一个元素,如一个变量、常量或函数调用。
- 例如:
my_variable
,100
,CURRENT_TIMESTAMP
。
-
复合表达式:
- 包含多个元素,使用运算符连接。
- 例如:
my_variable + 10
,UPPER('hello') || ' world'
。
运算符
PL/pgSQL支持多种运算符,包括:
-
算术运算符:
+
,-
,*
,/
,%
,**
(指数)。 -
比较运算符:
=
,<>
,>
,<
,>=
,<=
。 -
逻辑运算符:
AND
,OR
,NOT
。 -
赋值运算符:
:=
。 -
字符串连接运算符:
||
。 -
位运算符:
&
(按位与),|
(按位或),#
(按位异或),~
(按位非),<<
(左移),>>
(右移)。
函数调用
函数调用是表达式的一部分,可以是内置函数或用户自定义函数。
-
内置函数:
- PostgreSQL提供了大量的内置函数,如
LENGTH()
,TRIM()
,NOW()
等。 - 例如:
LENGTH('Hello')
。
- PostgreSQL提供了大量的内置函数,如
-
用户自定义函数:
- 用户可以在PL/pgSQL中或其他SQL代码中定义函数,并在表达式中调用它们。
- 例如:
my_custom_function(param1, param2)
。
控制结构
PL/pgSQL中的控制结构允许在表达式中使用条件和循环。
-
IF语句:
- 用于根据条件执行不同的代码块。
- 例如:
IF condition THEN ... END IF;
。
-
CASE语句:
- 用于多条件分支选择。
- 例如:
CASE expression WHEN value1 THEN result1 WHEN value2 THEN result2 ... END;
。
-
循环:
-
LOOP
,WHILE
,FOR
循环允许在满足条件时重复执行表达式。 - 例如:
LOOP ... EXIT WHEN condition; ... END LOOP;
。
-
表达式求值
-
类型转换:
- 可以使用
::
运算符或CAST()
函数显式转换数据类型。 - 例如:
my_variable::integer
,CAST(my_variable AS integer)
。
- 可以使用
-
优先级和结合性:
- 运算符具有不同的优先级,如指数运算符的优先级高于乘法和除法。
- 括号
()
可以用来改变运算顺序。
-
NULL处理:
- 表达式中包含NULL时,结果可能是NULL,这取决于运算符和上下文。
示例
BEGIN
DECLARE
amount integer := 100;
tax_rate decimal := 0.08;
total_cost decimal;
BEGIN
total_cost := amount * (1 + tax_rate); -- 复合表达式
RAISE NOTICE 'Total cost with tax: %', total_cost;
END;
END;
在这个例子中,total_cost
是一个变量,它被赋值为amount
和tax_rate
的复合表达式的结果。这个表达式计算了包含税的总成本。
表达式是PL/pgSQL中实现逻辑和计算的基础,它们使得程序能够动态地处理数据和控制程序流程。
十一、通配符
在PL/pgSQL中,通配符主要用于模式匹配,尤其是在使用LIKE
操作符进行字符串比较时。以下是PL/pgSQL中通配符的详细说明:
通配符字符
-
百分号(%):
- 用于匹配任意数量的字符,包括零个字符。
- 例如:
LIKE '%abc%'
将匹配包含"abc"的任意字符串,如"123abc456"或"abc"。
-
下划线(_):
- 用于匹配单个字符。
- 例如:
LIKE '_abc'
将匹配以"a"开头,以"bc"结尾的任意4个字符的字符串,如"aabc"或"1abc"。
使用通配符选择多列数据
在PostgreSQL中,通配符字符可以与SELECT
语句中的LIKE
关键字一起使用,以从数据库中选择特定的列。例如,如果你想要从一个名为employees
的表中选择所有以"S"开头的员工的姓名和年龄,可以使用如下查询:
SELECT name, age FROM employees WHERE name LIKE 'S%';
这个查询将返回所有姓名以"S"开头的员工的姓名和年龄。
正则表达式中的通配符
除了LIKE
操作符中的通配符,PostgreSQL还支持正则表达式,其中包含更多的通配符和元字符,如:
-
\s
:匹配任何空白字符,包括空格、制表符、换页符等。 -
\S
:匹配任何非空白字符。 -
\t
:匹配一个制表符。 -
\v
:匹配一个垂直制表符。 -
\w
:匹配包括下划线的任何单词字符,等价于[A-Za-z0-9_]
。 -
\W
:匹配任何非单词字符,等价于[^A-Za-z0-9_]
。 -
\x_n_
:匹配_n_,其中_n_为十六进制转义值。 -
\_num_
:匹配_num_,其中_num_是一个正整数,对所获取的匹配的引用。 -
\ _n_
:标识一个八进制转义值或一个后向引用。
这些正则表达式通配符可以在~
(匹配)和!~
(不匹配)操作符中使用,例如:
SELECT * FROM employees WHERE name ~ '\w+';
这个查询将匹配所有姓名由单词字符组成的员工记录。
综上所述,通配符在PL/pgSQL中用于模式匹配,可以简化字符串的搜索和比较操作。通过使用这些通配符,可以更加灵活地查询和处理数据库中的数据。
十二、注释
在PostgreSQL(通常简称为pgsql)中,可以使用两种类型的注释:
-
单行注释:
单行注释以两个连字符--
开始,直到行尾的所有内容都被视为注释。例如:-- 这是一个单行注释 SELECT * FROM table_name; -- 这行代码后面也有注释
-
多行注释:
多行注释使用/*
开始,以*/
结束,可以跨越多行。例如:/* 这是一个 多行注释 */ SELECT * FROM table_name;
注意:多行注释不能嵌套。
这些注释在SQL脚本中用于提供额外的信息,帮助解释代码的目的和逻辑,它们不会被数据库执行,因此对性能没有影响。
在PL/pgSQL(PostgreSQL的过程式语言)中,注释的使用与SQL脚本中相同。无论是单行注释还是多行注释,都可以在PL/pgSQL代码块中使用,以提供对代码逻辑的解释。
请注意,尽管注释对于代码的阅读和维护非常重要,但应避免在生产环境中的SQL查询中使用过多的注释,因为它们可能会增加代码的复杂性和维护难度。
十三、数据定义语言
在PostgreSQL(pgsql)中,数据定义语言(Data Definition Language,DDL)是用于定义和管理数据库对象(如表、视图、索引、数据类型、函数等)的SQL语句。以下是PostgreSQL中常用的一些DDL语句:
-
CREATE:
- 用于创建新的数据库对象。
- 例如:
CREATE TABLE table_name(...);
创建新表,CREATE VIEW view_name AS SELECT ...;
创建新视图。
-
ALTER:
- 用于修改现有数据库对象的结构。
- 例如:
ALTER TABLE table_name ADD COLUMN column_name data_type;
添加新列。
-
DROP:
- 用于删除数据库对象。
- 例如:
DROP TABLE table_name;
删除表,DROP VIEW view_name;
删除视图。
-
TRUNCATE:
- 用于快速删除表中的所有行。
- 例如:
TRUNCATE TABLE table_name;
。
-
COMMENT ON:
- 用于为数据库对象添加注释。
- 例如:
COMMENT ON TABLE table_name IS 'table description';
。
-
GRANT:
- 用于授予用户或角色对数据库对象的访问权限。
- 例如:
GRANT SELECT ON table_name TO user_name;
。
-
REVOKE:
- 用于撤销用户或角色对数据库对象的访问权限。
- 例如:
REVOKE SELECT ON table_name FROM user_name;
。
-
CREATE INDEX:
- 用于创建索引以提高查询效率。
- 例如:
CREATE INDEX index_name ON table_name(column_name);
。
-
DROP INDEX:
- 用于删除索引。
- 例如:
DROP INDEX index_name;
。
-
CREATE TYPE:
- 用于创建自定义数据类型。
- 例如:
CREATE TYPE type_name AS ENUM ('value1', 'value2');
。
-
ALTER TYPE:
- 用于修改自定义数据类型。
- 例如:
ALTER TYPE type_name ADD VALUE 'new_value';
。
-
DROP TYPE:
- 用于删除自定义数据类型。
- 例如:
DROP TYPE type_name;
。
-
CREATE SCHEMA:
- 用于创建新的模式(Schema),用于组织数据库对象。
- 例如:
CREATE SCHEMA schema_name;
。
-
ALTER SCHEMA:
- 用于修改模式的属性。
- 例如:
ALTER SCHEMA schema_name RENAME TO new_schema_name;
。
-
DROP SCHEMA:
- 用于删除模式。
- 例如:
DROP SCHEMA schema_name;
。
-
CREATE DOMAIN:
- 用于创建域,即约束特定类型的列的范围。
- 例如:
CREATE DOMAIN domain_name AS data_type CHECK (condition);
。
-
ALTER DOMAIN:
- 用于修改域的定义。
- 例如:
ALTER DOMAIN domain_name ADD CONSTRAINT constraint_name CHECK (condition);
。
-
DROP DOMAIN:
- 用于删除域。
- 例如:
DROP DOMAIN domain_name;
。
-
CREATE FUNCTION:
- 用于创建自定义函数。
- 例如:
CREATE FUNCTION function_name() RETURNS data_type AS $$ ... $$ LANGUAGE plpgsql;
。
-
ALTER FUNCTION:
- 用于修改函数的定义。
- 例如:
ALTER FUNCTION function_name() OWNER TO new_owner;
。
-
DROP FUNCTION:
- 用于删除函数。
- 例如:
DROP FUNCTION function_name();
。
这些DDL语句是PostgreSQL中定义和修改数据库结构的基础,它们对于数据库的初始化、维护和优化至关重要。使用DDL语句时,通常需要具有相应的权限。
十四、数据操作语言
在PostgreSQL(pgsql)中,数据操作语言(Data Manipulation Language,DML)是用于查询和修改数据库中数据的SQL语句。以下是PostgreSQL中常用的一些DML语句:
-
SELECT:
- 用于查询数据库中的数据。
- 例如:
SELECT column1, column2 FROM table_name WHERE condition;
-
INSERT:
- 用于向表中插入新的数据行。
- 例如:
INSERT INTO table_name (column1, column2) VALUES (value1, value2);
-
UPDATE:
- 用于修改表中的现有数据。
- 例如:
UPDATE table_name SET column1 = value1 WHERE condition;
-
DELETE:
- 用于从表中删除数据。
- 例如:
DELETE FROM table_name WHERE condition;
-
TRUNCATE:
- 用于快速删除表中的所有数据,不记录行的删除。
- 例如:
TRUNCATE TABLE table_name;
-
COPY:
- 用于将数据从一个文件复制到表中,或者从表中复制到一个文件。
- 例如:
COPY table_name FROM 'file_path';
(从文件复制到表) - 例如:
COPY (SELECT * FROM table_name) TO 'file_path';
(从表复制到文件)
-
RETURNING(与INSERT、UPDATE、DELETE一起使用):
- 用于在插入、更新或删除操作后返回受影响的行。
- 例如:
INSERT INTO table_name (column1, column2) VALUES (value1, value2) RETURNING *;
-
CALL(用于调用存储过程):
- 用于执行存储过程。
- 例如:
CALL procedure_name(param1, param2);
这些DML语句是PostgreSQL中操作和处理数据库数据的基础,它们允许用户执行数据检索、插入、更新和删除等操作。使用DML语句时,通常需要具有对相应数据库对象的访问权限。
十五、数据控制语言
在PostgreSQL(pgsql)中,数据控制语言(Data Control Language,DCL)是用于定义数据库的安全策略和访问权限的SQL语句。以下是PostgreSQL中常用的一些DCL语句:
-
GRANT:
- 用于授予用户或角色对数据库对象(如表、视图、函数等)的特定权限。
- 例如:
GRANT SELECT, INSERT ON table_name TO user_name;
-
REVOKE:
- 用于撤销用户或角色对数据库对象的特定权限。
- 例如:
REVOKE SELECT ON table_name FROM user_name;
-
ALTER ROLE 或 ALTER USER:
- 用于修改角色或用户的属性,如密码更改、角色更新等。
- 例如:
ALTER USER user_name WITH PASSWORD 'new_password';
-
CREATE ROLE 或 CREATE USER:
- 用于创建新的角色或用户。
- 例如:
CREATE USER user_name WITH PASSWORD 'password';
-
DROP ROLE 或 DROP USER:
- 用于删除角色或用户。
- 例如:
DROP USER user_name;
-
SET ROLE 或 SET USER:
- 用于切换当前会话的角色。
- 例如:
SET ROLE user_name;
-
SHOW:
- 用于显示当前会话的某些配置参数,如角色。
- 例如:
SHOW ROLE;
-
CURRENT_USER 或 SESSION_USER:
- 这些函数返回当前会话的用户名称。
- 例如:
SELECT CURRENT_USER;
-
IS SUPERUSER:
- 这个函数检查指定的用户是否是超级用户。
- 例如:
SELECT IS SUPERUSER;
-
pg_roles 系统表:
- 可以查询这个系统表来获取数据库角色的信息。
- 例如:
SELECT * FROM pg_roles;
这些DCL语句是PostgreSQL中管理和控制数据库访问权限的基础,它们对于确保数据库的安全性和数据的完整性至关重要。使用DCL语句时,通常需要具有相应的权限,特别是超级用户权限。
十六、流程控制语句
在PostgreSQL的PL/pgSQL(过程式语言)中,流程控制语句用于控制程序的执行流程。以下是PL/pgSQL中支持的一些主要流程控制语句:
-
BEGIN/END:
- 用于定义一个代码块的开始和结束。
- 例如:
BEGIN -- 代码块内容 END;
-
IF/ELSIF/ELSE/END IF:
- 用于条件执行。
- 例如:
IF condition THEN -- 条件为真时执行的代码 ELSIF another_condition THEN -- 另一个条件为真时执行的代码 ELSE -- 所有条件都不为真时执行的代码 END IF;
-
CASE:
- 用于多条件分支选择。
- 例如:
CASE expression WHEN value1 THEN -- 值1时执行的代码 WHEN value2 THEN -- 值2时执行的代码 ELSE -- 其他情况执行的代码 END CASE;
-
LOOP/END LOOP:
- 用于创建一个无限循环,直到遇到EXIT或RETURN语句。
- 例如:
LOOP -- 循环体代码 EXIT; -- 退出循环 END LOOP;
-
WHILE/END LOOP:
- 用于创建一个当条件为真时重复执行的循环。
- 例如:
WHILE condition LOOP -- 循环体代码 -- 需要包含退出循环的逻辑 END LOOP;
-
FOR/END LOOP:
- 用于创建一个固定次数的循环,通常与游标一起使用。
- 例如:
FOR record IN SELECT column FROM table LOOP -- 循环体代码 END LOOP;
-
RETURN:
- 用于从函数中返回值或退出过程。
- 例如:
RETURN value;
-
RAISE:
- 用于抛出错误和异常。
- 例如:
RAISE EXCEPTION 'error message';
-
CONTINUE:
- 用于跳过当前循环的剩余代码并继续下一次循环迭代(在某些循环中可用)。
- 例如: