青少年编程与数学 02-007 PostgreSQL数据库应用 05课题、结构化查询语言(SQL)

青少年编程与数学 02-007 PostgreSQL数据库应用 05课题、结构化查询语言SQL

课题摘要:本课题详细介绍了结构化查询语言(SQL),这是一种用于管理和操作关系型数据库的标准化编程语言。SQL包含数据查询、数据操作、数据定义、数据控制和事务控制等关键组成部分。课题还探讨了SQL的分类,包括数据定义语言(DDL)、数据操纵语言(DML)、数据控制语言(DCL)和事务控制语言(TCL)。特别强调了PostgreSQL SQL的特点,如标准遵从性、功能丰富性和扩展性。同时,介绍了PL/pgSQL------PostgreSQL的存储过程语言,它结合了SQL的数据操作能力和传统编程语言的控制结构。此外,还讨论了PostgreSQL中的标识符、常量、变量、运算符、表达式、通配符、注释以及DDL和DML语句的用法。最后,比较了PL/pgSQL和T-SQL的差异,并解释了BEGINEND在不同数据库系统中的使用。


一、结构化查询语言(SQL)

结构化查询语言(SQL)是一种标准化的编程语言,用于管理和操作关系型数据库。SQL 提供了一种简单而强大的方法来执行数据库任务,如查询、插入、更新和删除数据,以及数据库管理任务,如创建或修改表结构、控制数据访问和定义数据完整性规则。

以下是 SQL 的一些关键组成部分和功能:

  1. 数据查询

    • 使用 SELECT 语句从数据库中检索数据。
  2. 数据操作

    • 使用 INSERT 语句向数据库表中添加新数据。
    • 使用 UPDATE 语句修改数据库表中的数据。
    • 使用 DELETE 语句从数据库表中删除数据。
  3. 数据定义

    • 使用 CREATE 语句创建新的数据库对象,如表、视图、索引、存储过程和函数。
    • 使用 ALTER 语句修改现有数据库对象的结构。
    • 使用 DROP 语句删除数据库对象。
  4. 数据控制

    • 使用 GRANT 语句授予用户或角色对数据库对象的特定权限。
    • 使用 REVOKE 语句撤销用户或角色的权限。
  5. 事务控制

    • 使用 BEGIN TRANSACTIONCOMMITROLLBACK 语句来管理事务,确保数据的完整性和一致性。
  6. 错误处理

    • 使用 TRY...CATCH 语句来处理错误和异常。
  7. 数据完整性

    • 使用 PRIMARY KEYFOREIGN KEYUNIQUE 约束来定义数据完整性规则。
  8. 索引

    • 使用 CREATE INDEXDROP INDEX 语句来创建和删除索引,以优化查询性能。
  9. 联合查询

    • 使用 JOIN 语句来合并两个或多个表中的数据。
  10. 子查询

    • 在一个查询中嵌套另一个查询,可以是 SELECTINSERTUPDATEDELETE 语句的一部分。
  11. 集合操作

    • 使用 UNIONINTERSECTEXCEPT 运算符来组合多个查询的结果集。
  12. 分组和聚合

    • 使用 GROUP BY 子句和聚合函数(如 COUNTSUMAVGMINMAX)来处理数据集。
  13. 安全性

    • 使用 CREATE LOGINALTER LOGINDROP LOGIN 语句来管理数据库登录账户。
  14. 信息检索

    • 使用 LIKEBETWEENINEXISTS 等运算符来过滤和检索数据。
  15. 编程扩展

    • 使用存储过程、函数、触发器和游标等高级编程结构。

SQL 的语法和功能在不同的数据库管理系统(如 Oracle、MySQL、SQL Server、PostgreSQL 等)中可能有所不同,但基本概念和操作是相似的。

以下是一个简单的 SQL SELECT 语句示例,用于从名为 Employees 的表中检索所有员工的姓名和电子邮件地址:

sql 复制代码
SELECT FirstName, EmailAddress
FROM Employees;

SQL 是数据库管理员、开发者和分析师用来与关系型数据库进行交互的必备工具。通过 SQL,用户可以有效地查询、更新和管理存储在数据库中的数据。

二、SQL分类

SQL(Structured Query Language)可以分为几个不同的类别,主要基于其用途和功能。以下是 SQL 的主要分类:

  1. 数据定义语言(DDL)

    • 用于定义和管理数据库结构的语言。
    • 主要命令包括 CREATEALTERDROPTRUNCATE 等。
    • 例如,CREATE TABLE 用于创建新表,ALTER TABLE 用于修改现有表结构。
  2. 数据操纵语言(DML)

    • 用于检索和修改数据库中数据的语言。
    • 主要命令包括 SELECTINSERTUPDATEDELETE 等。
    • 例如,SELECT 用于查询数据,INSERT INTO 用于插入新数据。
  3. 数据控制语言(DCL)

    • 用于定义数据库的安全性和权限控制的语言。
    • 主要命令包括 GRANTREVOKE 等。
    • 例如,GRANT 用于授予用户权限,REVOKE 用于撤销用户权限。
  4. 事务控制语言(TCL)

    • 用于管理数据库事务的语言。
    • 主要命令包括 BEGIN TRANSACTIONCOMMITROLLBACKSAVEPOINT 等。
    • 例如,COMMIT 用于保存事务中的更改,ROLLBACK 用于撤销事务。
  5. 查询语言

    • 专门用于检索数据的 SQL 部分。
    • 包括 SELECT 语句及其扩展,如 JOINWHEREORDER BYGROUP BYHAVING 等子句。
  6. 程序化SQL

    • 用于编写存储过程、函数、触发器等数据库对象的 SQL 部分。
    • 包括流程控制语句,如 IFWHILELOOPCASE 等。
  7. 数据控制语言(DCD)

    • 用于控制数据库的物理存储和性能的语言。
    • 主要命令包括 CREATE INDEXDROP INDEXCREATE VIEW 等。
  8. 信息检索语言

    • 用于从数据库中检索数据的 SQL 部分。
    • 包括 SELECT 语句和相关的子句,如 WHEREORDER BYLIMIT 等。
  9. 维护语言

    • 用于维护数据库的 SQL 部分。
    • 包括用于备份和恢复数据库的命令,如 BACKUP DATABASERESTORE DATABASE 等。
  10. 嵌入式SQL

    • 用于在宿主编程语言(如 C、Java)中嵌入 SQL 语句的语言。
  11. 扩展SQL

    • 用于提供特定于数据库系统的功能和扩展的语言。
  12. 对象关系SQL

    • 结合了面向对象编程的概念和传统的关系型数据库模型。

不同的数据库管理系统(DBMS)可能会有不同的扩展和实现方式,但上述分类提供了一个通用的 SQL 分类框架。

三、PostgreSQL SQL

PostgreSQL SQL,通常简称为PostgreSQL方言,是一种遵循SQL标准的数据库查询和编程语言,专门用于PostgreSQL数据库管理系统。以下是PostgreSQL SQL的一些关键特点和简介:

  1. 标准遵从性

    • PostgreSQL致力于遵循ANSI SQL(美国国家标准协会)和ISO SQL标准,这意味着它支持大多数标准SQL功能,确保了代码的可移植性。
  2. 功能丰富

    • PostgreSQL提供了许多高级功能,包括窗口函数、部分索引、表继承、高级数据类型(如数组、JSON、XML、HSTORE和PostGIS)等。
  3. 扩展性

    • 用户可以扩展SQL语言,通过创建自定义的数据类型、函数、操作符等来满足特定的需求。
  4. 数据完整性

    • 支持多种约束,包括主键、外键、唯一性、检查和排他性约束,以确保数据的完整性。
  5. 事务和并发控制

    • 支持ACID(原子性、一致性、隔离性、持久性)事务,确保数据操作的可靠性。
    • 提供多种隔离级别,以控制并发事务的可见性和一致性。
  6. 触发器和规则系统

    • 支持触发器,允许在INSERT、UPDATE或DELETE操作之前或之后自动执行代码。
    • 规则系统允许复杂的查询改写和数据流控制。
  7. 安全性

    • 提供角色基于的访问控制,可以精细地管理用户权限。
  8. 备份和恢复

    • 支持各种备份和恢复技术,包括热备份和点时间恢复。
  9. 全文搜索

    • 内置全文搜索功能,支持文本数据的高效搜索。
  10. 国际化和本地化

    • 支持多种字符编码,包括UTF-8,以及多种语言和区域设置。
  11. 存储过程

    • 支持存储过程和函数,允许编写复杂的业务逻辑并存储在数据库中。
  12. 复制功能

    • 支持逻辑复制和物理复制,允许数据在多个数据库实例之间同步。

PostgreSQL SQL是一种功能强大、灵活且可扩展的SQL方言,它为开发人员和数据库管理员提供了广泛的工具和选项,以满足各种复杂的数据库需求。

四、PostgreSQL SQL语法

PostgreSQL SQL的语法约定遵循标准的SQL规范,并有一些特定的约定和扩展。以下是一些基本的语法约定:

  1. 标识符

    • 标识符(如表名、列名、别名等)可以用双引号"括起来,特别是当它们包含特殊字符或关键字时。
    • 例如:SELECT "columnName" FROM "tableName";
  2. 关键字

    • PostgreSQL中的SQL关键字不区分大小写,但习惯上使用大写。
    • 例如:SELECTFROMWHERE等。
  3. 注释

    • 使用--添加单行注释,使用/* ... */添加多行注释。

    • 例如:

      sql 复制代码
      -- 这是一个单行注释
      SELECT
      /* 
       这是一个
       多行注释
      */
      column_name FROM table_name;
  4. 字符串字面量

    • 字符串可以用单引号'括起来。
    • 例如:SELECT 'text';
  5. 数字字面量

    • 数字不需要引号,直接写数字即可。
    • 例如:SELECT 123;
  6. 布尔值

    • 布尔值使用小写truefalse表示。
    • 例如:SELECT true;
  7. 空值

    • 空值使用小写null表示。
    • 例如:SELECT null;
  8. 函数和操作符

    • 函数名和操作符通常不使用引号,除非它们是关键字或包含特殊字符。
    • 例如:SELECT NOW();
  9. SQL语句结构

    • SQL语句以分号;结束,允许在单个查询中使用多个分号分隔的语句。

    • 例如:

      sql 复制代码
      SELECT * FROM table_name;
      UPDATE table_name SET column_name = 'value';
  10. 大小写敏感性

    • PostgreSQL中的字符串比较默认是大小写敏感的,除非在创建数据库或表时指定了不同的排序规则。
  11. 数据类型

    • PostgreSQL支持多种数据类型,包括数值、日期/时间、字符串、布尔值等,以及一些特殊的数据类型如数组、JSON、XML等。
  12. PL/pgSQL

    • PostgreSQL提供了PL/pgSQL过程语言,用于编写存储过程和函数,它遵循自己的一套语法规则。

这些是PostgreSQL SQL的一些基本语法约定。由于PostgreSQL支持广泛的SQL功能和一些特有的扩展,因此在实际使用中可能会遇到更多特定的语法和约定。

五、PL/pgSQL

PL/pgSQL 是 PostgreSQL 数据库的存储过程语言,它是一种基于 SQL 的过程式编程语言,用于在数据库中编写和存储复杂的逻辑。PL/pgSQL 结合了 SQL 的数据操作能力和传统的编程语言(如 C 或 Pascal)的控制结构,使得开发者能够在数据库层面实现复杂的业务逻辑。

以下是 PL/pgSQL 的一些关键特性:

  1. 变量声明

    • 可以在 PL/pgSQL 代码块中声明变量,并指定它们的数据类型。
    sql 复制代码
    variable_name data_type;
  2. 控制结构

    • 支持标准的编程控制结构,如 IF 条件语句、CASE 语句、LOOPWHILEFOR 循环。
    sql 复制代码
    IF condition THEN
        -- code to execute if condition is true
    ELSE
        -- code to execute if condition is false
    END IF;
  3. 异常处理

    • 可以捕获和处理异常,类似于其他编程语言中的 TRY...CATCH 块。
    sql 复制代码
    BEGIN
        -- code that might raise an exception
    EXCEPTION WHEN exception_type THEN
        -- code to handle the exception
    END;
  4. 事务控制

    • 可以在 PL/pgSQL 中控制事务,使用 COMMITROLLBACK 语句。
    sql 复制代码
    BEGIN;
        -- some SQL statements
    COMMIT; -- or ROLLBACK;
  5. 游标

    • 可以使用游标在 PL/pgSQL 代码中处理查询结果集。
    sql 复制代码
    CURSOR cursor_name FOR SELECT statement;
  6. 函数和过程

    • 可以创建存储函数和存储过程,这些可以接收参数并在数据库中被调用。
    sql 复制代码
    CREATE OR REPLACE FUNCTION function_name(参数列表)
    RETURNS 返回类型 AS $$
    DECLARE
        -- 变量声明
    BEGIN
        -- 函数体
        RETURN 返回值;
    END;
    $$ LANGUAGE plpgsql;
  7. 复合数据类型

    • 可以创建复合数据类型(类似于 C 结构体),并在 PL/pgSQL 中使用它们。
  8. 触发器

    • 可以创建触发器函数,这些函数会在特定的数据库事件(如 INSERT、UPDATE、DELETE)发生时自动执行。
  9. 动态 SQL

    • 可以使用 EXECUTE 语句执行动态构建的 SQL 命令。
  10. 并发和并行

    • PL/pgSQL 支持并发控制,允许在多用户环境中安全地执行操作。

PL/pgSQL 是 PostgreSQL 强大的功能之一,它允许开发者在数据库层面实现复杂的逻辑,而无需依赖外部应用程序代码。这有助于提高性能,因为数据处理更接近数据存储的位置,并且可以减少网络通信的开销。

六、标识符

在PL/pgSQL中,标识符是用来标识变量、常量、游标、函数等用户定义的名称。以下是PL/pgSQL中标识符的分类、规则和特殊符号的使用等详细信息:

标识符分类

  1. 变量:用于存储程序运行时的数据。
  2. 常量:用于存储不变的值。
  3. 游标:用于逐行处理查询结果集。
  4. 函数名:用于定义或调用函数。
  5. 异常名:用于定义异常处理。

标识符规则

  1. 命名规则

    • 标识符必须以字母(a-z,包括带变音符的字母和非拉丁字母)或下划线(_)开始。
    • 后续字符可以是字母、下划线(_)、数字(0-9)或美元符号($)。
    • 标识符名不能超过NAMEDATALEN-1字节,默认情况下NAMEDATALEN的值为64,因此标识符的长度上限为63字节。
  2. 大小写敏感性

    • PostgreSQL中的标识符默认是大小写不敏感的,但是被双引号括起来的标识符被视为受限标识符,这种标识符对大小写敏感。
  3. 关键字和标识符

    • 关键词是SQL语言中具有特定意义的词,如SELECTUPDATE等。标识符用于标识表、列或其他数据库对象的名字。

特殊符号的使用

  1. 双引号

    • 被双引号括起来的标识符称为受限标识符,这种标识符可以包含任何字符,包括那些通常不是标识符一部分的字符,如空格和关键字。
    • 例如:"MY_TABLE""A"都是受限标识符。
  2. 转义字符

    • PostgreSQL使用反斜杠(\)作为转义字符。当我们想在字符串中包含引号、反斜杠或其他特殊字符时,我们可以使用转义字符来表示这些字符。
    • 例如,如果我们想在字符串中包含一个单引号,我们可以写作两个单引号:'I''m fine'
  3. 动态SQL中的引号处理

    • 在动态SQL中,使用quote_identquote_literal函数来正确处理引号和特殊字符。
    • quote_ident用于转义标识符,quote_literal用于转义字面量值。

这些规则和约定定义了如何在PL/pgSQL中正确地使用标识符,以确保代码的正确性和可读性。

七、常量

在PL/pgSQL中,常量是一种特殊的变量,其值在定义后不能被改变。以下是关于PL/pgSQL中常量的详细信息:

常量的定义和使用

  1. 声明常量

    在PL/pgSQL中,常量可以通过在变量声明时使用CONSTANT关键字来定义。这表示一旦常量被初始化,其值就不能被修改。常量的声明语法如下:

    sql 复制代码
    name CONSTANT type [ COLLATE collation_name ] [ NOT NULL ] [ { DEFAULT | := | = } expression ];

    例如,声明一个名为MAX_SIZE的常量,其值为100:

    sql 复制代码
    DECLARE
        MAX_SIZE CONSTANT integer := 100;

    参考:[PL/pgSQL 常量]。

  2. 常量的类型

    常量可以是任何数据类型,包括数值类型、字符串类型、布尔类型等。例如:

    • 数值常量:DECLARE max_items CONSTANT integer := 100;
    • 字符串常量:DECLARE app_name CONSTANT text := 'MyApplication';
    • 布尔常量:DECLARE is_active CONSTANT boolean := true;
  3. 常量的默认值

    在声明常量时,可以指定一个默认值,如果未指定,默认值为SQL空值(NULL)。例如:

    sql 复制代码
    DECLARE
        default_value CONSTANT integer DEFAULT 0;
  4. 常量的作用域

    常量的作用域限制在声明它们的块内。如果在一个函数或过程中声明了一个常量,它只能在该函数或过程内部访问。

  5. 常量与变量的区别

    常量与普通变量的主要区别在于常量的值在初始化后不能被改变,而普通变量的值可以在程序执行过程中被重新赋值。

  6. 使用常量的好处

    使用常量可以提高代码的可维护性,因为如果需要更改某个值,只需在定义常量的地方更改一次,而不需要在代码的多个地方进行更改。

  7. 常量的特殊符号

    在PL/pgSQL中,常量可以使用与普通变量相同的标识符规则,并且可以使用双引号来创建受限标识符,如果常量名称与SQL关键字冲突或包含特殊字符。

通过使用常量,你可以在PL/pgSQL代码中创建一个值不可变的变量,这有助于减少程序中的错误,并提高代码的清晰度和可维护性。

八、变量

在PL/pgSQL中,变量是用来存储数据值的临时存储位置,这些值在程序执行过程中可能会改变。以下是关于PL/pgSQL中变量的详细信息:

变量的声明

  1. 基本声明

    在PL/pgSQL中,变量在使用前必须声明,声明时需要指定变量的名称和数据类型。例如:

    sql 复制代码
    DECLARE
        v_variable_name some_data_type;

    其中v_variable_name是变量的名称,some_data_type是变量的数据类型。

  2. 初始化

    变量在声明时可以初始化,即赋予一个初始值。例如:

    sql 复制代码
    DECLARE
        v_counter INTEGER := 0;
  3. 作用域

    变量的作用域是其被声明的代码块,包括函数、过程或匿名代码块。在作用域外,变量不可见。

变量的类型

  1. 基本数据类型

    PL/pgSQL支持PostgreSQL的所有基本数据类型,如INTEGERVARCHARBOOLEANDATETIMESTAMP等。

  2. 复合数据类型

    除了基本数据类型,PL/pgSQL还支持数组、复合类型(用户自定义的数据类型)等复合数据类型。

  3. 引用类型

    PL/pgSQL允许声明引用类型变量,这些变量存储对另一个变量的引用。

变量的使用

  1. 赋值

    变量可以在声明后被赋新值。例如:

    sql 复制代码
    v_counter := v_counter + 1;
  2. 参数传递

    在函数中,变量可以作为参数传递给其他函数或过程。

  3. 返回值

    函数可以返回变量的值。

变量的生命周期

  1. 局部变量

    在PL/pgSQL的函数或过程中声明的变量是局部变量,它们只在当前函数或过程中有效。

  2. 持久变量

    在异常处理块中声明的变量在异常处理结束后仍然存在,直到整个函数或过程结束。

变量的默认值

  1. 默认值
    如果变量在声明时没有初始化,它们将被赋予默认值,对于大多数数据类型来说,这个默认值是NULL。

变量的规则和约定

  1. 命名约定

    变量名应遵循标识符的命名规则,通常使用小写字母和下划线来提高可读性。

  2. 避免关键字

    避免使用SQL关键字作为变量名,如果必须使用,可以用双引号括起来。

  3. 清晰性

    变量名应尽可能描述性,以提高代码的可读性。

示例

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中常用的运算符及其详细说明:

算术运算符

  1. 加法 (+):

    • 用于计算两个数值的和。
    • 例如:result := a + b;
  2. 减法 (-):

    • 用于计算两个数值的差。
    • 例如:result := a - b;
  3. 乘法 (*):

    • 用于计算两个数值的乘积。
    • 例如:result := a * b;
  4. 除法 (/):

    • 用于计算两个数值的商。
    • 例如:result := a / b;
  5. 模运算 (%):

    • 用于计算两个整数的余数。
    • 例如:result := a % b;
  6. 指数运算 (**):

    • 用于计算一个数的另一个数次幂。
    • 例如:result := a ** b;

比较运算符

  1. 等于 (===):

    • 检查两个值是否相等。
    • 例如:IF a = b THEN ...;
  2. 不等于 (<>!=):

    • 检查两个值是否不相等。
    • 例如:IF a <> b THEN ...;
  3. 大于 (>):

    • 检查一个值是否大于另一个值。
    • 例如:IF a > b THEN ...;
  4. 小于 (<):

    • 检查一个值是否小于另一个值。
    • 例如:IF a < b THEN ...;
  5. 大于等于 (>=):

    • 检查一个值是否大于或等于另一个值。
    • 例如:IF a >= b THEN ...;
  6. 小于等于 (<=):

    • 检查一个值是否小于或等于另一个值。
    • 例如:IF a <= b THEN ...;

逻辑运算符

  1. 逻辑与 (AND):

    • 用于组合两个布尔表达式,只有当两个表达式都为真时,结果才为真。
    • 例如:IF condition1 AND condition2 THEN ...;
  2. 逻辑或 (OR):

    • 用于组合两个布尔表达式,只要有一个表达式为真,结果就为真。
    • 例如:IF condition1 OR condition2 THEN ...;
  3. 逻辑非 (NOT):

    • 用于反转布尔表达式的值,将真变为假,将假变为真。
    • 例如:IF NOT condition THEN ...;

赋值运算符

  1. 赋值 (:=):
    • 将右侧的值赋给左侧的变量。
    • 例如:variable := expression;

字符串连接运算符

  1. 拼接 (||):
    • 用于连接两个字符串。
    • 例如:result := string1 || string2;

位运算符

  1. 按位与 (&):

    • 对两个整数的二进制表示进行按位与操作。
    • 例如:result := a & b;
  2. 按位或 (|):

    • 对两个整数的二进制表示进行按位或操作。
    • 例如:result := a | b;
  3. 按位异或 (#):

    • 对两个整数的二进制表示进行按位异或操作。
    • 例如:result := a # b;
  4. 按位非 (~):

    • 对一个整数的二进制表示进行按位非操作。
    • 例如:result := ~a;
  5. 左移 (<<):

    • 将一个整数的二进制表示向左移动指定的位数。
    • 例如:result := a << b;
  6. 右移 (>>):

    • 将一个整数的二进制表示向右移动指定的位数。
    • 例如:result := a >> b;

这些运算符在PL/pgSQL中扮演着重要的角色,它们使得程序能够执行复杂的计算和逻辑判断。在使用这些运算符时,需要注意它们的优先级和结合性,以确保程序的正确性和预期的行为。

十、表达式

在PL/pgSQL中,表达式是由变量、常量、运算符和函数调用组成的组合,它们用于计算和返回一个值。表达式可以在PL/pgSQL的任何地方使用,包括赋值语句、条件语句、循环语句等。以下是PL/pgSQL中表达式的详细说明:

类型和结构

  1. 简单表达式

    • 只包含一个元素,如一个变量、常量或函数调用。
    • 例如:my_variable100CURRENT_TIMESTAMP
  2. 复合表达式

    • 包含多个元素,使用运算符连接。
    • 例如:my_variable + 10UPPER('hello') || ' world'

运算符

PL/pgSQL支持多种运算符,包括:

  1. 算术运算符+, -, *, /, %, **(指数)。
  2. 比较运算符=, <>, >, <, >=, <=
  3. 逻辑运算符AND, OR, NOT
  4. 赋值运算符:=
  5. 字符串连接运算符||
  6. 位运算符&(按位与),|(按位或),#(按位异或),~(按位非),<<(左移),>>(右移)。

函数调用

函数调用是表达式的一部分,可以是内置函数或用户自定义函数。

  1. 内置函数

    • PostgreSQL提供了大量的内置函数,如LENGTH(), TRIM(), NOW()等。
    • 例如:LENGTH('Hello')
  2. 用户自定义函数

    • 用户可以在PL/pgSQL中或其他SQL代码中定义函数,并在表达式中调用它们。
    • 例如:my_custom_function(param1, param2)

控制结构

PL/pgSQL中的控制结构允许在表达式中使用条件和循环。

  1. IF语句

    • 用于根据条件执行不同的代码块。
    • 例如:IF condition THEN ... END IF;
  2. CASE语句

    • 用于多条件分支选择。
    • 例如:CASE expression WHEN value1 THEN result1 WHEN value2 THEN result2 ... END;
  3. 循环

    • LOOP, WHILE, FOR循环允许在满足条件时重复执行表达式。
    • 例如:LOOP ... EXIT WHEN condition; ... END LOOP;

表达式求值

  1. 类型转换

    • 可以使用::运算符或CAST()函数显式转换数据类型。
    • 例如:my_variable::integerCAST(my_variable AS integer)
  2. 优先级和结合性

    • 运算符具有不同的优先级,如指数运算符的优先级高于乘法和除法。
    • 括号()可以用来改变运算顺序。
  3. NULL处理

    • 表达式中包含NULL时,结果可能是NULL,这取决于运算符和上下文。

示例

sql 复制代码
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是一个变量,它被赋值为amounttax_rate的复合表达式的结果。这个表达式计算了包含税的总成本。

表达式是PL/pgSQL中实现逻辑和计算的基础,它们使得程序能够动态地处理数据和控制程序流程。

十一、通配符

在PL/pgSQL中,通配符主要用于模式匹配,尤其是在使用LIKE操作符进行字符串比较时。以下是PL/pgSQL中通配符的详细说明:

通配符字符

  1. 百分号(%)

    • 用于匹配任意数量的字符,包括零个字符。
    • 例如:LIKE '%abc%'将匹配包含"abc"的任意字符串,如"123abc456"或"abc"。
  2. 下划线(_)

    • 用于匹配单个字符。
    • 例如:LIKE '_abc'将匹配以"a"开头,以"bc"结尾的任意4个字符的字符串,如"aabc"或"1abc"。

使用通配符选择多列数据

在PostgreSQL中,通配符字符可以与SELECT语句中的LIKE关键字一起使用,以从数据库中选择特定的列。例如,如果你想要从一个名为employees的表中选择所有以"S"开头的员工的姓名和年龄,可以使用如下查询:

sql 复制代码
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_:标识一个八进制转义值或一个后向引用。

这些正则表达式通配符可以在~(匹配)和!~(不匹配)操作符中使用,例如:

sql 复制代码
SELECT * FROM employees WHERE name ~ '\w+';

这个查询将匹配所有姓名由单词字符组成的员工记录。

综上所述,通配符在PL/pgSQL中用于模式匹配,可以简化字符串的搜索和比较操作。通过使用这些通配符,可以更加灵活地查询和处理数据库中的数据。

十二、注释

在PostgreSQL(通常简称为pgsql)中,可以使用两种类型的注释:

  1. 单行注释

    单行注释以两个连字符 -- 开始,直到行尾的所有内容都被视为注释。例如:

    sql 复制代码
    -- 这是一个单行注释
    SELECT * FROM table_name; -- 这行代码后面也有注释
  2. 多行注释

    多行注释使用 /* 开始,以 */ 结束,可以跨越多行。例如:

    sql 复制代码
    /*
    这是一个
    多行注释
    */
    SELECT * FROM table_name;

    注意:多行注释不能嵌套。

这些注释在SQL脚本中用于提供额外的信息,帮助解释代码的目的和逻辑,它们不会被数据库执行,因此对性能没有影响。

在PL/pgSQL(PostgreSQL的过程式语言)中,注释的使用与SQL脚本中相同。无论是单行注释还是多行注释,都可以在PL/pgSQL代码块中使用,以提供对代码逻辑的解释。

请注意,尽管注释对于代码的阅读和维护非常重要,但应避免在生产环境中的SQL查询中使用过多的注释,因为它们可能会增加代码的复杂性和维护难度。

十三、数据定义语言

在PostgreSQL(pgsql)中,数据定义语言(Data Definition Language,DDL)是用于定义和管理数据库对象(如表、视图、索引、数据类型、函数等)的SQL语句。以下是PostgreSQL中常用的一些DDL语句:

  1. CREATE

    • 用于创建新的数据库对象。
    • 例如:CREATE TABLE table_name(...); 创建新表,CREATE VIEW view_name AS SELECT ...; 创建新视图。
  2. ALTER

    • 用于修改现有数据库对象的结构。
    • 例如:ALTER TABLE table_name ADD COLUMN column_name data_type; 添加新列。
  3. DROP

    • 用于删除数据库对象。
    • 例如:DROP TABLE table_name; 删除表,DROP VIEW view_name; 删除视图。
  4. TRUNCATE

    • 用于快速删除表中的所有行。
    • 例如:TRUNCATE TABLE table_name;
  5. COMMENT ON

    • 用于为数据库对象添加注释。
    • 例如:COMMENT ON TABLE table_name IS 'table description';
  6. GRANT

    • 用于授予用户或角色对数据库对象的访问权限。
    • 例如:GRANT SELECT ON table_name TO user_name;
  7. REVOKE

    • 用于撤销用户或角色对数据库对象的访问权限。
    • 例如:REVOKE SELECT ON table_name FROM user_name;
  8. CREATE INDEX

    • 用于创建索引以提高查询效率。
    • 例如:CREATE INDEX index_name ON table_name(column_name);
  9. DROP INDEX

    • 用于删除索引。
    • 例如:DROP INDEX index_name;
  10. CREATE TYPE

    • 用于创建自定义数据类型。
    • 例如:CREATE TYPE type_name AS ENUM ('value1', 'value2');
  11. ALTER TYPE

    • 用于修改自定义数据类型。
    • 例如:ALTER TYPE type_name ADD VALUE 'new_value';
  12. DROP TYPE

    • 用于删除自定义数据类型。
    • 例如:DROP TYPE type_name;
  13. CREATE SCHEMA

    • 用于创建新的模式(Schema),用于组织数据库对象。
    • 例如:CREATE SCHEMA schema_name;
  14. ALTER SCHEMA

    • 用于修改模式的属性。
    • 例如:ALTER SCHEMA schema_name RENAME TO new_schema_name;
  15. DROP SCHEMA

    • 用于删除模式。
    • 例如:DROP SCHEMA schema_name;
  16. CREATE DOMAIN

    • 用于创建域,即约束特定类型的列的范围。
    • 例如:CREATE DOMAIN domain_name AS data_type CHECK (condition);
  17. ALTER DOMAIN

    • 用于修改域的定义。
    • 例如:ALTER DOMAIN domain_name ADD CONSTRAINT constraint_name CHECK (condition);
  18. DROP DOMAIN

    • 用于删除域。
    • 例如:DROP DOMAIN domain_name;
  19. CREATE FUNCTION

    • 用于创建自定义函数。
    • 例如:CREATE FUNCTION function_name() RETURNS data_type AS $$ ... $$ LANGUAGE plpgsql;
  20. ALTER FUNCTION

    • 用于修改函数的定义。
    • 例如:ALTER FUNCTION function_name() OWNER TO new_owner;
  21. DROP FUNCTION

    • 用于删除函数。
    • 例如:DROP FUNCTION function_name();

这些DDL语句是PostgreSQL中定义和修改数据库结构的基础,它们对于数据库的初始化、维护和优化至关重要。使用DDL语句时,通常需要具有相应的权限。

十四、数据操作语言

在PostgreSQL(pgsql)中,数据操作语言(Data Manipulation Language,DML)是用于查询和修改数据库中数据的SQL语句。以下是PostgreSQL中常用的一些DML语句:

  1. SELECT

    • 用于查询数据库中的数据。
    • 例如:SELECT column1, column2 FROM table_name WHERE condition;
  2. INSERT

    • 用于向表中插入新的数据行。
    • 例如:INSERT INTO table_name (column1, column2) VALUES (value1, value2);
  3. UPDATE

    • 用于修改表中的现有数据。
    • 例如:UPDATE table_name SET column1 = value1 WHERE condition;
  4. DELETE

    • 用于从表中删除数据。
    • 例如:DELETE FROM table_name WHERE condition;
  5. TRUNCATE

    • 用于快速删除表中的所有数据,不记录行的删除。
    • 例如:TRUNCATE TABLE table_name;
  6. COPY

    • 用于将数据从一个文件复制到表中,或者从表中复制到一个文件。
    • 例如:COPY table_name FROM 'file_path';(从文件复制到表)
    • 例如:COPY (SELECT * FROM table_name) TO 'file_path';(从表复制到文件)
  7. RETURNING(与INSERT、UPDATE、DELETE一起使用):

    • 用于在插入、更新或删除操作后返回受影响的行。
    • 例如:INSERT INTO table_name (column1, column2) VALUES (value1, value2) RETURNING *;
  8. CALL(用于调用存储过程):

    • 用于执行存储过程。
    • 例如:CALL procedure_name(param1, param2);

这些DML语句是PostgreSQL中操作和处理数据库数据的基础,它们允许用户执行数据检索、插入、更新和删除等操作。使用DML语句时,通常需要具有对相应数据库对象的访问权限。

十五、数据控制语言

在PostgreSQL(pgsql)中,数据控制语言(Data Control Language,DCL)是用于定义数据库的安全策略和访问权限的SQL语句。以下是PostgreSQL中常用的一些DCL语句:

  1. GRANT

    • 用于授予用户或角色对数据库对象(如表、视图、函数等)的特定权限。
    • 例如:GRANT SELECT, INSERT ON table_name TO user_name;
  2. REVOKE

    • 用于撤销用户或角色对数据库对象的特定权限。
    • 例如:REVOKE SELECT ON table_name FROM user_name;
  3. ALTER ROLEALTER USER

    • 用于修改角色或用户的属性,如密码更改、角色更新等。
    • 例如:ALTER USER user_name WITH PASSWORD 'new_password';
  4. CREATE ROLECREATE USER

    • 用于创建新的角色或用户。
    • 例如:CREATE USER user_name WITH PASSWORD 'password';
  5. DROP ROLEDROP USER

    • 用于删除角色或用户。
    • 例如:DROP USER user_name;
  6. SET ROLESET USER

    • 用于切换当前会话的角色。
    • 例如:SET ROLE user_name;
  7. SHOW

    • 用于显示当前会话的某些配置参数,如角色。
    • 例如:SHOW ROLE;
  8. CURRENT_USERSESSION_USER

    • 这些函数返回当前会话的用户名称。
    • 例如:SELECT CURRENT_USER;
  9. IS SUPERUSER

    • 这个函数检查指定的用户是否是超级用户。
    • 例如:SELECT IS SUPERUSER;
  10. pg_roles 系统表

    • 可以查询这个系统表来获取数据库角色的信息。
    • 例如:SELECT * FROM pg_roles;

这些DCL语句是PostgreSQL中管理和控制数据库访问权限的基础,它们对于确保数据库的安全性和数据的完整性至关重要。使用DCL语句时,通常需要具有相应的权限,特别是超级用户权限。

十六、流程控制语句

在PostgreSQL的PL/pgSQL(过程式语言)中,流程控制语句用于控制程序的执行流程。以下是PL/pgSQL中支持的一些主要流程控制语句:

  1. BEGIN/END

    • 用于定义一个代码块的开始和结束。

    • 例如:

      sql 复制代码
      BEGIN
          -- 代码块内容
      END;
  2. IF/ELSIF/ELSE/END IF

    • 用于条件执行。

    • 例如:

      sql 复制代码
      IF condition THEN
          -- 条件为真时执行的代码
      ELSIF another_condition THEN
          -- 另一个条件为真时执行的代码
      ELSE
          -- 所有条件都不为真时执行的代码
      END IF;
  3. CASE

    • 用于多条件分支选择。

    • 例如:

      sql 复制代码
      CASE expression
          WHEN value1 THEN
              -- 值1时执行的代码
          WHEN value2 THEN
              -- 值2时执行的代码
          ELSE
              -- 其他情况执行的代码
      END CASE;
  4. LOOP/END LOOP

    • 用于创建一个无限循环,直到遇到EXIT或RETURN语句。

    • 例如:

      sql 复制代码
      LOOP
          -- 循环体代码
          EXIT; -- 退出循环
      END LOOP;
  5. WHILE/END LOOP

    • 用于创建一个当条件为真时重复执行的循环。

    • 例如:

      sql 复制代码
      WHILE condition LOOP
          -- 循环体代码
          -- 需要包含退出循环的逻辑
      END LOOP;
  6. FOR/END LOOP

    • 用于创建一个固定次数的循环,通常与游标一起使用。

    • 例如:

      sql 复制代码
      FOR record IN SELECT column FROM table LOOP
          -- 循环体代码
      END LOOP;
  7. RETURN

    • 用于从函数中返回值或退出过程。

    • 例如:

      sql 复制代码
      RETURN value;
  8. RAISE

    • 用于抛出错误和异常。

    • 例如:

      sql 复制代码
      RAISE EXCEPTION 'error message';
  9. CONTINUE

    • 用于跳过当前循环的剩余代码并继续下一次循环迭代(在某些循环中可用)。

    • 例如:

      sql 复制代码
      CONTINUE;
  10. EXIT/RETURN

    • 用于退出当前循环。

    • 例如:

      sql 复制代码
      EXIT;
  11. PERFORM

    • 用于执行不返回值的SQL语句。

    • 例如:

      sql 复制代码
      PERFORM some_function();

这些流程控制语句在编写复杂的存储过程、函数和触发器时非常有用,它们允许开发者控制程序的执行逻辑。使用这些语句时,需要确保逻辑清晰,以避免程序运行中出现错误或异常。

十七、声明语句

在PostgreSQL的PL/pgSQL(过程式语言)中,声明语句用于定义变量、常量、游标和其他局部存储区域。以下是PL/pgSQL中常用的声明语句:

  1. 变量声明

    • 用于声明局部变量以存储数据。

    • 语法:variable_name data_type [ DEFAULT default_value ];

    • 例如:

      sql 复制代码
      DECLARE
        v_counter INTEGER := 0;
        v_name VARCHAR(50);
  2. 常量声明

    • 用于声明常量,其值在声明后不能改变。

    • 语法:CONSTANT constant_name data_type [ DEFAULT default_value ];

    • 例如:

      sql 复制代码
      DECLARE
        MAX_ROWS CONSTANT INTEGER := 100;
  3. 游标声明

    • 用于声明游标,以便在循环中处理查询结果集。

    • 语法:CURSOR cursor_name FOR SELECT_statement;

    • 例如:

      sql 复制代码
      DECLARE
        my_cursor CURSOR FOR SELECT column_name FROM table_name;
  4. 条件变量声明

    • 用于在异常处理中声明条件变量。

    • 语法:condition_name CONDITION FOR condition_type;

    • 例如:

      sql 复制代码
      DECLARE
        -- 声明条件变量
        my_condition CONDITION FOR SQLSTATE 'sql_state_code';
  5. 异常处理声明

    • 用于声明异常处理程序。

    • 语法:EXCEPTION WHEN condition THEN exception_block;

    • 例如:

      sql 复制代码
      DECLARE
      BEGIN
        -- 可能引发异常的代码
      EXCEPTION WHEN division_by_zero THEN
        -- 异常处理代码
      END;
  6. 返回代码声明

    • 在函数中声明返回值的变量。

    • 语法:return_variable data_type;

    • 例如:

      sql 复制代码
      DECLARE
        v_result INTEGER;
      BEGIN
        -- 计算结果
        v_result := 10 * 5;
        RETURN v_result;
      END;
  7. 记录声明

    • 用于声明记录类型,以便存储行数据。

    • 语法:record_name RECORD;

    • 例如:

      sql 复制代码
      DECLARE
        my_record RECORD;
      BEGIN
        -- 从表中获取一行数据
        my_record := (SELECT * FROM table_name LIMIT 1);
      END;
  8. 数组声明

    • 用于声明数组类型的变量。

    • 语法:array_name data_type[];

    • 例如:

      sql 复制代码
      DECLARE
        v_numbers INTEGER[];
      BEGIN
        v_numbers := ARRAY[1, 2, 3, 4];
      END;

这些声明语句在PL/pgSQL程序的开始部分使用,它们定义了程序中将要使用的变量和存储结构。正确的声明对于确保程序逻辑正确和性能优化至关重要。

十八、比较

PostgreSQL(通常称为pgsql)使用的是PL/pgSQL,而Microsoft SQL Server使用的是T-SQL。这两种语言都是过程式数据库语言,用于在数据库中执行存储过程、函数、触发器等。以下是PL/pgSQL和T-SQL之间的一些主要区别:

  1. 语法和关键字

    • PL/pgSQL和T-SQL在语法上有一些差异,例如,PL/pgSQL使用BEGIN ... END;来定义代码块,而T-SQL使用BEGIN ... END
    • T-SQL使用PRINT语句来输出消息,而PL/pgSQL使用RAISE NOTICE
  2. 数据类型

    • PostgreSQL和SQL Server支持的数据类型有所不同。例如,PostgreSQL有SERIAL类型用于自动增长的整数,而SQL Server使用IDENTITY属性。
    • PostgreSQL支持数组数据类型,而SQL Server需要使用表变量或临时表来模拟数组。
  3. 游标使用

    • 在PL/pgSQL中,游标只能在LOOP语句中使用,而在T-SQL中,游标可以在任何地方使用。
  4. 错误处理

    • PL/pgSQL使用EXCEPTION块来处理异常,而T-SQL使用TRY ... CATCH结构。
    • PL/pgSQL的异常处理是基于SQLSTATE代码的,而T-SQL是基于错误编号的。
  5. 函数和过程

    • 在PL/pgSQL中,函数和过程的语法略有不同。例如,PL/pgSQL不允许在同一个代码块中同时声明函数和过程。
    • T-SQL允许在函数中执行SELECT语句并返回结果集,而PL/pgSQL不允许函数返回结果集,需要使用游标或创建临时表。
  6. 触发器

    • PostgreSQL的触发器可以定义为BEFORE、AFTER或INSTEAD OF,而SQL Server的触发器可以定义为BEFORE、AFTER或INSTEAD OF,但INSTEAD OF触发器在两种语言中的工作方式不同。
  7. 表操作

    • PostgreSQL使用RETURNING子句在INSERT、UPDATE或DELETE操作后返回受影响的行,而T-SQL不提供类似的功能。
  8. 字符串连接

    • 在PL/pgSQL中,字符串连接使用||运算符,而在T-SQL中使用+运算符。
  9. 索引和约束

    • PostgreSQL支持部分索引和表达式索引,而SQL Server不支持。
    • SQL Server支持 UNIQUEIDENTIFIER 数据类型和NEWID() 函数,用于生成全局唯一标识符(GUID),而PostgreSQL使用UUID数据类型和gen_random_uuid()函数。
  10. 权限管理

    • PostgreSQL使用GRANTREVOKE语句来管理权限,而SQL Server使用GRANTDENYREVOKE
  11. 事务控制

    • PostgreSQL和SQL Server都支持事务控制,但默认的事务行为可能有所不同。例如,SQL Server默认使用自动提交模式,而PostgreSQL默认使用显式提交模式。

这些区别反映了两种数据库系统在设计和功能上的差异。开发者在两种语言之间迁移代码时需要特别注意这些差异。

十九、BEGINEND

在不同的数据库系统中,BEGINEND关键字用于定义存储程序中的代码块,但它们的使用在语法和上下文中可能有所不同。以下是PostgreSQL(PL/pgSQL)和Microsoft SQL Server(T-SQL)中BEGINEND的使用差异:

PostgreSQL (PL/pgSQL)

  1. 代码块分隔

    • 在PL/pgSQL中,BEGINEND;用于定义一个代码块,通常包含一系列要顺序执行的语句。

    • 每个BEGIN必须以END;结束,分号是必需的,以区分END关键字和后续的SQL语句或PL/pgSQL代码。

    • 例如:

      sql 复制代码
      DO $$
      BEGIN
          RAISE NOTICE 'Hello, world!';
      END $$;
  2. 异常处理

    • 在PL/pgSQL中,BEGINEND;也用于定义异常处理块。

    • 例如:

      sql 复制代码
      DO $$
      BEGIN
          PERFORM some_procedure();
      EXCEPTION WHEN others THEN
          RAISE NOTICE 'An error occurred.';
      END $$;

Microsoft SQL Server (T-SQL)

  1. 批处理分隔

    • 在T-SQL中,BEGINEND用于定义一个批处理或代码块的开始和结束,但不是必须的,因为T-SQL可以通过分号;来分隔语句。

    • 例如:

      sql 复制代码
      BEGIN
          PRINT 'Hello, world!';
      END;
  2. 事务控制

    • 在T-SQL中,BEGINEND用于定义事务的开始和结束。

    • 例如:

      sql 复制代码
      BEGIN TRANSACTION;
      UPDATE Accounts SET Amount = Amount - 100 WHERE Name = 'Alice';
      UPDATE Accounts SET Amount = Amount + 100 WHERE Name = 'Bob';
      COMMIT TRANSACTION;
  3. 异常处理

    • 在T-SQL中,BEGINEND也用于定义异常处理块,但通常与TRYCATCH关键字一起使用。

    • 例如:

      sql 复制代码
      BEGIN TRY
          UPDATE Accounts SET Amount = Amount - 100 WHERE Name = 'Alice';
      END TRY
      BEGIN CATCH
          PRINT 'An error occurred.';
      END CATCH;

总结

  • PostgreSQL 中,BEGINEND;用于定义代码块和异常处理块,且END后必须跟分号。
  • SQL Server 中,BEGINEND用于定义批处理、事务和异常处理块,且END后不是必须的,通常与TRYCATCH一起使用。

这些差异反映了两种数据库系统在编程模型和错误处理机制上的不同。开发者在编写跨数据库的存储程序时需要特别注意这些差异。

相关推荐
程序边界18 分钟前
从 Oracle 到 KingbaseES:企业信创改造的“抄作业”模板,直接套用!
数据库·oracle
funfan051729 分钟前
奇怪的“bug”--数据库的“隐式转换”行为
数据库·bug
Jasonakeke41 分钟前
【重学MySQL】八十八、8.0版本核心新特性全解析
android·数据库·mysql
comeoffbest1 小时前
PostgreSQL 能存万物:从安装到高级功能实战
数据库·postgresql
时序数据说1 小时前
IoTDB如何解决海量数据存储难题?
大数据·数据库·物联网·时序数据库·iotdb
小楓12012 小时前
MySQL數據庫開發教學(二) 核心概念、重要指令
开发语言·数据库·mysql
花果山总钻风3 小时前
MySQL奔溃,InnoDB文件损坏修复记录
数据库·mysql·adb
TDengine (老段)4 小时前
TDengine IDMP 运维指南(管理策略)
大数据·数据库·物联网·ai·时序数据库·tdengine·涛思数据
Full Stack Developme4 小时前
PostgreSQL interval 转换为 int4 (整数)
数据库·postgresql
larance4 小时前
FastAPI + SQLAlchemy 数据库对象转字典
数据库·fastapi