SQL高级

5.1 Accessing SQL from Programming Language

应用程序执行数据处理,并调用

  • 与数据库服务器连接
  • 将SQL命令发送到数据库服务器
  • 将结果的元组逐个提取到程序变量中

两种方法访问SQL:
dynamic SQL
程序用function连接数据库服务器并与之通信
程序将 SQL 查询构造为字符串,提交查询,然后将结果检索到程序变量中

  • JDBC (Java DB Connectivity) with Java
  • ODBC (Open DB Connectivity) with C, C++, and Visual Basic
    embedded SQL
    SQL 语句在编译时在高级程序中转换为函数调用
    这些函数调用使用提供动态 SQL 功能的 API 连接到数据库

5.1.1 JDBC

JDBC 是一个基于 Java 的 API
支持查询、更新和检索
与数据库通信的模型:

  1. 创建连接
  2. 创建SQL statement(语句)对象
  3. 用statement对象执行查询并获取结果
  4. 处理错误的异常机制

image.png

使用statement对象 stmt 执行查询以发送查询并获取结果
使用 execute.queryexecute.update,例如 insert/delete/update/createtable
参数:要执行的SQL语句,表示为字符串
获取查询结果,使用 try{...}/catch{...} 构造
将结果中的元组集检索到 ResultSet 对象 rset 中,并一次获取一个元组
next()方法测试结果集是否至少有一个元组,如果是,则获取它
获取结果:如果 dept_name 是 select result 的第一个参数,则rs.getString(“dept_name”)rs.getString(1)是等价的

Prepared Statement

创建一个prepared statement,其中某些值将替换为?,在使用时指定实际值
setString()方法和其他方法,如setInt()指定参数的值
创建:image.png
设置值:image.png
第一个参数指定我们要为其赋值的?参数,第二个参数指定要分配的值

Metadata Features

获取查询结果集中列的数目(结果关系的属性总数),输出各列的列名、数据类型
image.png
DatabaseMetaData dbmd=conn.getMetaData()
参数:catalog目录、schemas架构模式、table表模式和column列模式
null表示所有目录/schemas
""表示当前目录/schemas
%与SQL子句like含义相同
image.png

Transaction Control

每个 SQL 语句都被视为一个单独的transaction,默认情况下自动提交
关闭连接上的自动提交:conn.setAutoCommit (false);
在连接上启用自动提交:conn.setAutoCommit (ture);
Transaction必须最终提交或回滚:conn.commit(); or conn.rollback();

Other Features
  • 调用函数和过程
    CallableStatement cStmt1 = conn.prepareCall("{? = call some function(?)}");
    CallableStatement cStmt2 = conn.prepareCall("{call some procedure(?,?)}");
  • 处理大型对象类型
    getBlob()getClob() 类似于 getString() 方法,但分别返回 Blob 和 Clob 类型的对象
    通过 getBytes() 从这些对象获取数据
Embedded SQL: SQLJ in Java

SQLJ:Java 中的嵌入式 SQL
image.png

5.1.2 从python访问数据库

5.1.3 ODBC

开放式数据库连接 (ODBC) 标准,用于应用程序(作为客户端)与数据库服务器通信
应用程序接口 (API) 到:

  • 打开与数据库的连接
  • 发送查询和更新
  • 取回结果
    image.png

image.png

5.1.4 Embedded SQL

将 SQL 用作数据库查询工具的方法

  1. interactive SQL交互式 SQL: 通过DBS人机界面直接用作DML和DDL
  2. dynamic SQL动态 SQL: e.g JDBC, ODBC
  3. embedded SQL嵌入式 SQL: 嵌入在通用编程语言中,例如 C 语言
    交互式SQL只能进行DB的访问操作,不能对DB访问结果进行进一步的数据处理,Embedded SQL将SQL的数据库访问功能与C语言等宿主语言的数据处理能力相结合,提高了数据应用系统的能力
    SQL标准定义了C,C++,Pascal,Fortran和Cobol等语言中的SQL嵌入, 嵌入 SQL 查询的语言称为宿主语言(host language)

在执行任何 SQL 语句之前,程序必须首先连接到数据库image.png
EXEC SQL语句用于标识对预处理器的嵌入式 SQL 请求image.png
可以在嵌入式 SQL 语句中使用主语言的变量。 它们前面带有冒号:以区别于 SQL 变量。如上所述使用的变量必须在 DECLARE 部分中声明,用于声明变量的语法遵循通常的主语言语法。
image.png

Cursor in Embedded SQL 游标

要编写嵌入式 SQL 查询,我们使用语句image.png
变量 c 用于标识查询
利用Embedded SQL进行查询时,查询结果有可能包括多个元组,此时无法直接将多个元组通过共享变量赋值传递给宿主程序
系统开辟专门working区域存放SQL查询的结果关系,并利用查询游标c指向此区域。宿主程序根据c指向的查询结果关系集合,使用open, fetch, close依次获取结果关系中的各元组
游标c相当于一个临时的table
image.png

Updates Through Embedded SQL

用于修改(更新、插入和删除)的嵌入式 SQL 表达式
可以通过更新游标来更新游标fetch的tuples

5.2 Functions and Procedures

定义一个函数:
e.g. 给定一个部门的名称,返回教师人数
image.png
定义函数后可以在查找时直接使用:
image.png

过程:
image.png
可以使用 call 语句从 SQL 程序或嵌入式 SQL 调用过程。
image.png

过程和函数也可以从动态 SQL 调用。函数、存储过程预先生成对应的查询执行计划(类似于目标代码),存储在DBMS中,应用程序直接调用,不需再进行查询处理和优化

5.3 Trigger(触发器)

触发器是一种基于事件-条件-操作模型的机制,作用:完整性定义、检查和补救措施
触发器执行将在完整性约束检查时进行:指定触发器执行时要执行的操作,如果违反约束,则采取补救措施

指定导致触发器执行的事件(插入、删除、更新)
更新:更新时的触发器可以限制为特定属性
beforeafter属性值:

  • referencing old row as:用于删除和更新
  • referencing new row as:用于插入和更新

将空白成绩转换为 null:
image.png

可以对受事务影响的所有行执行单个操作,而不是对每个受影响的行执行单独的操作


SQL高级
http://example.com/2024/11/27/Notes/课程/大三(上)/数据库/SQL高级/
许可协议