数据库系统原理 笔记

  • 第一章 绪论
    • 第一节 数据库
    • 第二节 数据库管理系统
    • 第三节 数据管理技术发展趋势
  • 第二章 关系模型
    • 第一节 关系结构和约束
    • 第二节 基本关系代数运算
    • 第三节 附加关系代数运算
    • 第四节 扩展关系代数运算
  • 第三章 PG数据定义与操作
    • 第一节 SQL概述
    • 第二节 数据定义与修改
    • 第三节 简单查询
    • 第四节 联接查询
    • 第五节 嵌套查询
  • 第四章 PG应用
    • 第一节 数据库应用体系结构
    • 第二节 嵌入式pgSQL
    • 第三节 JDBC编程
    • 第四节 PG中的函数
  • 第五章 PG数据保护
    • 第一节 数据保护
    • 第二节 视图
    • 第三节 访问控制
    • 第四节 完整性约束
    • 第五节 触发器
    • 第六节 事务
    • 第七节 加密

第一章 绪论

第一节 数据库

包含关于某单位、机构、部门,或是某领域、业务、主题,或是某对象的信息、互相关联的大量数据的集合称作数据库

数据库的种类:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
本课程所讲的数据库特指用专门通用软件管理,长期储存在计算机内、有组织、可共享的大量数据的集合。

第二节 数据库管理系统

1. 定义: 英语为Database Management System,缩写为DBMS。DBMS是位于用户与操作系统之间的一层软件,它是一个大型的复杂的系统软件/领先的著名数据库管理系统。
2. 种类: DBMS有PostgreSQL, IBM DB2, Oracle, Microsoft SQL Serve等。
3. 目标: 简单、高效、安全地共享数据
4. 模型: 数据库库管理系统基于特定数据模型来组织管理数据
数据模型是数据结构和语义的概括(以树结构组织数据是层次模型,以表组织就是关系模型)
数据库模型:面相特定数据模型、针对特定应用的数据库结构
关系型数据库中具体的表结构就称为关系模式或表模式(考生表的模式就是考生表包括的那些属性组成的属性集合)
特定数据库中特定时刻存储的数据的集合称为该数据库的一个实例
模式与实例:数据库模式相对稳定,很少需要修改, 实例是其对应模式的一个具体值,反映的是某一时刻数据库的状态。同一个模式可以有很多实例,实例的值随数据库中数据的更新不断变化
5. 数据抽象的层次:
在这里插入图片描述
在这里插入图片描述

  • 概念层:对现实世界事物的状态进行选择 加工 组织,形成人对全部用户数据需求在大脑中的认识(实体—联系模型,也就是E-R模型)

  • 逻辑层:描述全部用户数据的整体结构,由DBMS提供,通过便于人理解的相对简单的结构来描述数据库当中存储的数据,以及这些数据之间存在的联系(模式)

  • 视图层:从某个或某类用户角度出发,只描述与其相关的那一部分数据(外模式)

  • 物理层:描述数据实际上是怎样在磁盘设备上组织的(典型模型:B+树)(内模式)

支持逻辑、视图、物理三层模式的建立和之间的两级映射,三层的数据结构可以不同。
三层模式两级映射,既为简单、安全地共享数据提供支持,又为应用系统易于扩展来适应应用需求的变化奠定了基础。
6. 数据逻辑独立性: 当模式改变时,由数据库管理员DBA对各外模式/模式映射作相应的改变,外模式保持不变,应用程序依据外模式编写,完全无需修改。
7. 数据物理独立性: 如果数据库的内模式改变,即物理改变,只要对模式/内模式映射作相应的修改,可以使模式保持不变
8. 基本功能: 数据库管理系统最基本功能就是允许用户逻辑地使用数据而无需关注这些数据在计算机中是如何存放 如何处理的
在这里插入图片描述
在这里插入图片描述
9. DBMS体系架构:

  • 数据字典:存放元数据,如数据模式 外模式 内模式的定义
  • 索引:帮助快速定位特定数据项
  • 统计数据:反应数据库数据分布特征
  • 日志:依次登记对数据的修改

10.数据库的语言(SQL语言):

  • 数据定义语言:定义数据库结构
  • 数据操纵语言:操纵数据库
  • 数据保护语言:数据保护相关

第三节 数据管理技术发展趋势

在这里插入图片描述
随着大数据现象出现,为应对新需求新挑战,数据管理技术正面临基础架构带来的深刻变革
利用计算机集群这种新架构来存储和处理,大数据的NoSQL系统已成为关系数据库系统的巨大危险,关系型数据库要与其竞争需要重新设计以适应新架构,尽快适应硬件的快速发展(主存成本急剧下降,计算机内存容量大幅提高)

  • 关系型数据库以关系为数据模型,采用声明性语言,支持完全ACID特性的数据一致性。
  • NoSQL系统强调可扩展性和高性能,放弃了关系模型 声明性语言 完全ACID特性。
  • NewSQL可兼顾以上5种性能。
  • spanner使模式演变更简单,支持的广域(网范围)复制一致性更强。

第二章 关系模型

第一节 关系结构和约束

1.关系表
关系数据库使用一个或多个表来存储数据。数学上把一系列域上的笛卡尔积的子集关系称为关系
这里的表正好符合这个定义:每个表有多个行,每个行有多个列,每个行列单元都是不能再分的原子值。
同一表中,各行相异,不能重复出现完全相同的行,行次序和列次序无关紧要
实际应用中,数据库通常给每个一个唯一名字(属性/字段),每个属性有一个允许值的集合,称为该属性的取值范围
表中的行(Row),也称作元组(Tuple)或记录(Record)。表中的数据是按行存储的。表中的一行数据即为一个元组或一条记录,其每行由若干字段值组成,每个字段值描述该对象的一个属性或特征。
给定一个关系表,习惯上把关系模式写成表名后面跟一对圆括号里面罗列列名,如
examinee(eeid,eename,eesex,eeage,eedepa)
在这里插入图片描述
数据库保存现实世界中的状态,并服务现实世界中的应用,数据库中的数据应与现实世界时时保持一致才有意义。
理想情况下,系统能判断数据库中各个数据项值是否与现实世界一致(数据是否真实正确),然而这个目标无法实现。退而求其次,可在系统中定义一些正确数据应满足的约束,系统自动检测数据是否满足约束条件,并且只允许满足这些约束条件的数据进入数据库。
软件系统无法保证数据的真实正确性,可以保证数据符合明确定义的约束完整性约束,数据安全性的一部分)。

2. 常见的简单约束:
1 对属性取值范围的限定,如性别只有男、女两种取值
2 对属性值之间相互关系的限定,最典型为关系模型中“键”的概念。
键: 超键 候选键 主键 外键
超键: 在给定关系模式中,能唯一标识出各个元组的属性集合,被称为该关系模式的超键。超键中可能包含无关紧要的属性,也就是说超键的真子集也可能是超键。
在这里插入图片描述
候选键: 在给定关系模式中,能够唯一标识出各个元组属性集合,并且不包含多余属性,称这个属性集合为该关系模式的候选键。(候选键是超键,但超键不一定是候选键)
在这里插入图片描述
主键: 一个关系中可能有多个候选键,通常指定其中一个,并且只能是一个,用来标识元组,该候选键称为主键。(主键具有唯一性,主键是候选键,但候选键不一定是主键。)

主关键字(主键,primary key)是表中的一个或多个字段,它的值用于唯一地标识表中的某一条记录。在数据库中能够唯一地标识一个记录被称为主键
主键是数据库中具有唯一性的字段,也就是说数据表中的任意两条记录都不可能拥有相同的主键字段。
在这里插入图片描述
关系模式R2中的某属性不是R2的候选键,而是关系模式R1中的候选键,则这个属性集对模式R2而言是外键。

外键: 如果关系表S1的一个属性子集A,必须匹配另外一个关系表S2中出现的数值,则称A是关系表S1的外键。其中S1称为引用关系,S2称为被引用关系。
外键的值,或与被引用关系中出现的数值对应,或为空值。
在这里插入图片描述
examinee表中的考生所在院系eedepa属性就是一个外键,取值必须是院系表中院系名dname列已有的某个值或者空值,否则可能是出现了数据值错误。

第二节 基本关系代数运算

关系代数: 可以用代数、逻辑等方法描述关系操作,最基本最常用的是代数方法,即关系代数。关系代数也是一门代数,关系代数包括一个运算集合,这些运算以一个或两个关系作为运算数,产生一个新的关系作为结果。

关系代数把表看作元组集合,既然是集合,就不包括重复元组,也就是说,关系代数每个运算都是去重的。

通常一门代数总是包括一些运算符和一些运算数。
在这里插入图片描述

基本关系代数运算包括:选择、投影、集合并、集合差、笛卡尔积、更名运算
在这里插入图片描述

  • 选择运算是选出满足给定谓词(条件)的元组,结果关系和原关系有着相同的模式。用希腊字母δ表示。
    在这里插入图片描述
  • 投影运算用来从给定关系产生一个只有其部分列的新关系。用希腊字母π表示。
    在这里插入图片描述
    并、差、交运算需要满足的条件:
  1. 关系r和s必须是同元的,即它们的属性数目必须相同
  2. 对所有的i, r的第i个属性的域必须和s的第i个属性的域相同
  • 集合并运算
    关系是相容的
    两个关系必须是同元的,即它们所包含的属性个数必须相同(列数相同
    两个关系对应属性的域必须相同或相容。
    在这里插入图片描述
  • 集合差运算
    集合差运算是用来查询,在一个关系中而不在另一个关系中的那些元组,和并运算一样,集合差运算只能在相容的关系间进行。
    在这里插入图片描述
  • 笛卡尔积运算
    结果关系的模式是参与运算的两个关系的模式的串接
    运算符左侧关系中的每一个元组与右侧关系的每一个元组拼接,形成结果关系中的一个元组
    (在属性名称前加上来自的关系名,中间用小数点分隔,但对那些只在两个关系模式之一中出现的属性,一般省略其关系名前缀。)
    在这里插入图片描述
  • 更名运算
    可以对关系进行更名或给关系代数运算的结果关系起个名字。
    在这里插入图片描述
    在这里插入图片描述

一个关系运算的结果可以作为另一个关系运算的参数,从而可以把多个关系运算组合为复杂关系运算。
在这里插入图片描述
在这里插入图片描述

第三节 附加关系代数运算

关系代数基本运算是完备的,足以表达任何普通关系代数查询,但是基本运算的缺陷在于许多查询的表达式显得复杂、冗长。
定义附加运算不能增加关系代数的表达能力,但可以简化一些查询的表达。
常见的附加运算:
在这里插入图片描述
集合交

  • 集合交运算的结果是由那些同时在参与运算关系中存在的元组组成
  • 集合交运算也必须在相容的关系间进行。
    查询既有考官也有报考考生的试卷eid:erexam在eid属性上的投影 交 eeexam在eid属性上的投影
    在这里插入图片描述

自然连接:可以将特定选择运算和笛卡尔积运算合并为一个运算

  • 首先计算笛卡尔积
  • 然后在笛卡尔积的结果上,基于两个关系模式中都出现的属性,即两个关系模式的所有同名属性值相等的选择运算
  • 最后去除重复列(因为在任何元组中同名属性上的值都是相等的)

计算examine自然连接eeexam(examine ∞ eeexam):
由于examine 和 eeexam只有一个相同属性dname,选择examine.dname和 eeexam.dname值相等的元组,最后去掉重复列,只保留一个dname列
在这里插入图片描述
在这里插入图片描述
用自然连接查询
在这里插入图片描述

属性连接:在笛卡尔积的基础上选取指定同名列上取值相等的行,结果关系中这些指定同名列只出现一次

  • 首先计算笛卡尔积
  • 然后在笛卡尔积的结果上,基于两个关系模式中都出现的属性,即按指定同名属性进行属性值相等的选择运算
  • 最后去除重复列(因为在任何元组中指定的同名属性上的值都是相等的)

计算examinee按属性dname与department进行联结,算出笛卡尔积,由于运算指定按属性dname进行连接,所以选择examine.dname和 eeexam.dname值相等的元组,最后去掉重复列,只保留一个dname列
在这里插入图片描述
在这里插入图片描述
用属性联接查询,按属性eeid进行联接
在这里插入图片描述
自然连接和属性连接的区别:
当参与联接运算的两个表有多个同名列时,自然联接的匹配条件是所有同名列全部取值相等;而属性联接的匹配条件是指定其中若干同名列取值相等。如果属性联接指定全部同名列来匹配则等价于自然联接。

条件连接:在笛卡尔积的基础上,选取满足给定条件的元组

  • 首先计算笛卡尔积
  • 然后选取满足给定条件的元组

examinee和department按照examine.dname = eeexam.dname进行联接
在这里插入图片描述
在这里插入图片描述
条件联接查询
在这里插入图片描述

 赋值
赋值运算是将←右侧的表达式的结果赋给←左侧的关系变量,该关系变量可以在后续的表达式中使用
在这里插入图片描述

第四节 扩展关系代数运算

除了基本关系代数运算、附加关系代数运算,为了表达用户其他方面的查询需求,需对关系代数运算做进一步扩充。
关系代数运算的进一步扩充包括三方面:
在这里插入图片描述
广义投影
在这里插入图片描述
广义投影的结果对应F1, F2, …,Fn包括n列,它是对关系代数表达式t的每一行计算F1, F2, …,Fn作为对应行相应输出表达式的值。

聚集函数:用G表示聚集计算
在这里插入图片描述
计算examiner中erage属性的平均值,查询结果只包含一个元组,只有单个属性,可以运用更名运算指定属性名的关系,对应的是学校所有考官的平均年龄。

分组聚集
在这里插入图片描述
G左下标是分组属性,右下标是聚集函数,后面一对圆括号给出参与聚集运算的关系代数表达式。
对examiner表按院系名dname的值分组,并计算每组erage的平均值,也就是查询每个院系考官的平均年龄。

外联接:内联接(自然联接、属性联接、条件联接)可能产生悬浮元组,也就是说有些元组不能跟另外关系的任何一个元组匹配,一些实际应用系统可能希望在结果中保留悬浮元组,这就有了外联接运算。

外联接运算的三种形式:
在这里插入图片描述
步骤:
在这里插入图片描述
在这里插入图片描述
对应左(右,全)外联接左侧(右侧,两侧)关系的元组都要在连接结果中出现。

首先计算两个关系的内联接,然后再在左侧(右侧、两侧)关系中找出那些没有在联接结果中出现的元组,把这些元组也加入到联接结果中去,并且用空值null来填充那些来自相对的另一侧关系的属性值。
在这里插入图片描述
右外联接先算内联接得到三个元组,找出右侧关系department中与左侧关系任何元组都不匹配的悬浮元组,向联接结果中加入元组,从右侧关系得到的属性被赋为悬浮元组当中的值。而其他属性,也就是从左侧关系得到的属性,这里的eename被赋值为空值null
在这里插入图片描述
在这里插入图片描述

即使有的考官没有参加组卷,他个人的信息也会出现在结果关系当中。

第三章 PG数据定义与操作

第一节 SQL概述

关系数据库的标准语言是Structured Query Language,即结构化查询语言,简称SQL。虽然SQL字面含义是“查询语言”,但其功能却包含数据定义、查询、修改和保护等。
PostgreSQL(PG)目前最强大,特性最丰富和开源数据库系统软件。
网上考试数据库系统:
在这里插入图片描述

网上考试数据库系统设计6个表:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
基本Select语句的一般形式:
在这里插入图片描述

WHERE子句与HAVING子句的区别:
在这里插入图片描述

整个语句的执行过程:
在这里插入图片描述
注意点:

  • 在实际执行时数据库管理系统为了尽可能快地获得等价查询结果而采取完全不同的执行步骤。
  • 大小写不敏感(系统默认小写)
  • 用单引号做字符串常量的标识(只有引号中的字符才区分大小写)

第二节 数据定义与修改

数据定义包括数据库对象的创建、删除和更改三部分。
表的定义:表模式的创建、修改和删除。表是数据库中最重要、最基本的操作对象,是数据存储的基本单位。
数据修改:给表里添加数据、更新数据以及删除数据
表的创建:约定表中各个属性的属性名及其数据类型
在这里插入图片描述
在这里插入图片描述

定义表的属性时需要指明数据类型,PG支持的数据类型远比其他数据库管理系统多得多,有点、线、框、圆、多边形等几何类型,网络地址类型,xml类型,JSON类型等
PG中常用的基本数据类型:
在这里插入图片描述
PG中使用单引号做字符串常量的标识,对于包含单引号的字符串,使用两个单引号表示一个单引号,注意不能写成双引号。

修改表名:
在这里插入图片描述
当不再需要一个表时,可以用“DROP TABLE”语句删除
在这里插入图片描述
在这里插入图片描述
PG使用ALTER TABLE语句进行表结构修改:

  • 给表中添加一个新列
  • 把表中对应的列的名称进行修改
  • 把表中给定的列的数据类型进行修改
  • 删除表中给定的列
    在这里插入图片描述
    不论基本表当中原来是否已有数据,新增加列的列值一律为空值
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    向表中插入数据的语句是INSERT语句,有以下三种方法:
    (1) 向表中直接插入常量元组
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

(2)向表中插入查询结果,这个语句可以把一个SELECT语句的查询结果插到一个表中
在这里插入图片描述

(3)向表中插入表
在这里插入图片描述
删除关系中的元组
在这里插入图片描述
执行时先从表中找出所有满足<条件表达式>的元组,然后把它们从表中删去,如果没有任何条件限制,将删除所有元组
在这里插入图片描述
在这里插入图片描述
当需要更新表中元组的某些列值时,用UPDATE语句
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

这个UPDATE语句会更新指定表中满足WHERE子句条件的元组,SET子句指定要更新的列以及更新后的列值

第三节 简单查询

投影、选择、聚集查询
(1)投影:
基本投影:指选取表中的某些列的列值
广义投影:指在选取属性列时,允许进行适当运算

查询全部试卷的试卷号与试卷名, 查询要求列出每一个试卷号和每一个试卷名的值
在这里插入图片描述
在这里插入图片描述

如果SELECT后面是最简单的形式(单独一个*),这种情况输出FROM子句给出表中的所有

查询试卷的详细信息
在这里插入图片描述

SELECT后面可以是表达式,也就是广义投影,为FROM后面给出表的每一行计算一个表达式值,作为对应行中相应输出表达式的值

查询全体考生成绩与满分(100分)之差
在这里插入图片描述
在这里插入图片描述

还可以用ORDER BY子句让查询结果中的行按一个或多个列或列表达式的值进行排序,升序ASC,排序列为空值的行最后显示;降序DESC, 排序列为空值的行最先显示。默认为升序

查询全体考官的情况:

查询结果按所在学院名升序排列,同一学院的考官按年龄降序排列
在这里插入图片描述
注意: 投影结果当中可能出现所有列值均相等的重复行,但从数据库管理系统实现的角度看,投影过程会对每个新产生的结果进行标识,即系统能区分每个行,也就是说,由于去重是一项耗时的工作,DBMS采取惰性原则:除非在SELECT后跟DISTINCT明确指出要求去重,否则,默认情况下、或者SELECT后跟ALL时都保留重复。( 默认情况下SELECT的执行不会自动去重

(2)选择
选择操作用WHERE子句实现,从表中选择满足给定条件的行。

查询年龄大于20的所有考生的信息
在这里插入图片描述

如果没有WHERE子句就是无条件选择所有行,WHERE子句中的选择可以用各种运算符组合而成(比较运算符、逻辑运算符、SQL语言专有运算符)
比较运算符:
在这里插入图片描述
逻辑运算符:
在这里插入图片描述
SQL语言专有运算符:
在这里插入图片描述
查询历史学院和心理学院年龄在58岁以上工资在6000~9000元之间所有姓罗的考官
在这里插入图片描述

(3)聚集: 从多个输入行中计算出一个结果
聚集函数
在这里插入图片描述
查询考官总人数
在这里插入图片描述
查询考生218811011013的平均成绩
在这里插入图片描述

SUM和AVG的输入必须是数值型的,其他聚集函数还可以用在非数值数据类型的列上。另外,聚集函数不能进行复合运算

GROUP BY子句利用指定列进行分组,所有给出列上取值相同的行被分在一个组。还可以使用GROUP BY子句将聚集函数作用在组上

查询各个学院考官的平均年龄,按平均年龄升序排列
在这里插入图片描述
这里AS使用了别名

HAVING子句对GROUP BY子句形成的分组进行筛选
HAVING子句给出的条件只针对GROUP BY子句形成的分组起作用,也可以使用聚集函数

查询报考了3门以上试卷的报考号,按报考门数降序排列
在这里插入图片描述

COUNT()实际就是每个eeid的报考门数
COUNT() 函数返回匹配指定条件的行数。
COUNT(column_name) 函数返回指定列的值的数目(NULL 不计入)
COUNT(
) 函数返回表中的记录数
COUNT(DISTINCT column_name) 函数返回指定列的不同值的数目

第四节 联接查询

如果查询的数据涉及两个或多个表,可以使用联接操作,称为联接查询

联接查询涉及联接条件联接类型两个方面
在这里插入图片描述
如果联接条件为永真则等价于笛卡尔积,也叫交叉联接

联接类型: 是按照对悬浮行的不同处理方式来分的,分为内联接和(左/右/全)外联接。
在这里插入图片描述
在写多表联接查询语句的时候,如果查询涉及多个表,最简单直接的方法就是在FROM后面依次写上这些表名,并以逗号或CROSS JOIN分隔,FROM子句的结果表就是这些表的 笛卡尔积
结果表包含所有这些表的所有,如果两个表中有同名列,在列名前加上表名作前缀,表名该列的来源表。
根据查询需要,还可通过WHERE子句对笛卡尔积结果表施加选择操作,以撷取那些符合查询条件的

查询每个考生及其报考的试卷
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
进而需要在笛卡尔积结果表中选出examinee.eeid等于eeexam.eeid的行,只有这样的行才是其左边来自examinee的列值和右边来自eeexam的列值是同属同一个eeid的。
在这里插入图片描述
完整的查询语句
在这里插入图片描述

  • 自然联接
    即自然内联接,是在笛卡尔积的基础上选取所有同名列上取值相等的行,结果表中同名列只出现一次。

查询每个考生及其报考的试卷
在这里插入图片描述
由于自然联接包含了选取所有同名列取值相等行的操作,与使用笛卡尔积的查询语句不同,这里不再需要WHERE子句,在一个查询的FROM子句中,可以用自然联接将多个表结合在一起。

  • 属性联接
    即属性内联接,是在笛卡尔积的基础上选取指定同名属性上取值相等的行,结果表中这些指定同名属性只出现一次

查询每个考生及其报考的试卷
在这里插入图片描述
由于属性联接包含了选取指定同名属性取值相等行的操作,虽然都是查询每个考生及其报考的试卷,但与使用笛卡尔积的查询语句不同,这里不再需要WHERE子句

属性联接与自然联接的区别:
当参与联接运算的两个表有多个同名属性时,自然联接的匹配条件是所有同名属性全部取值相等,而属性联接的匹配条件是指定若干同名属性取值相等,如果属性联接指定全部同名列来匹配,则等价于自然联接。
在这里插入图片描述

  • 条件联接
    即条件内联接,是在笛卡尔积运算的基础上选取满足给定条件的行

查询每个考生及其报考的试卷
在这里插入图片描述
内联接可能会出现左表当中的一些行在右表中没有相匹配的行,或右表当中的一些行在左表当中没有相匹配的行,这些没有找到匹配的行称为悬浮行
在这里插入图片描述
内联接和外联接的区别就在对于悬浮行的处理不同
在这里插入图片描述
三种外联接的处理方式都要首先计算内联接,然后再在内联接的结果中加上相应的左(右、左和右)表中的悬浮行

  • 左外联接
    在这里插入图片描述

  • 右外联接就是把右侧表中的悬浮行补上空值后加入结果表

  • 全外联接是左外联接和右外联接的结合,左侧表中的悬浮行补上空值后加到结果表中,同时右侧表中的悬浮行补上空值后也加到结果表中
    在这里插入图片描述

pgSQL的联接的计算
在这里插入图片描述
查询表erexam和表exampaper自然左外联接的语句
在这里插入图片描述

第五节 嵌套查询

PG提供嵌套子查询机制
查询块:一个SELECT-FROM-WHERE语句称为一个查询块
将一个查询块嵌套在另一个查询块的SELECT、FROM、WHERE、GROUP BY、HAVING、ORDER BY、LIMIT、OFFSET、WITH子句中的查询称为嵌套查询
在这里插入图片描述
在写嵌套查询语句时,由于SELECT语句的结果就是一个表,所以查询块可以出现在另外一个查询中表名可以出现的任何地方。

  • 表式嵌套:查询块可以出现在另外一个查询中表名可以出现的任何地方
    在这里插入图片描述

用WITH子句定义临时表
查询平均成绩良好(>=80)的考生人数
在这里插入图片描述
在SELECT子句前给出WITH子句定义临时表WITH后面给出临时表的模式,这里是表名avgach,包括两个属性,AS后面一对圆括号里给出查询语句的查询结果就是临时表的内容。这里是对eeexam表中的行按eeid分组后,每组的eeid和相应的achieve平均值,也就是报考号及平均成绩,定义好临时表就可以基于它来查询。
这里是对临时表avgach选择avgachieve>=80的行并计算行数。
注意点:WITH子句只在包含它自己的查询语句中有效WITH子句中的AS不能省略

查询平均成绩>=80的考生人数也可以用FROM子句嵌套来实现
在这里插入图片描述
FROM子句中出现表名的地方可以是临时表的定义,像这样AS前面一对圆括号里的查询语句的查询结果是临时表的内容,这里是对eeexam表中的行按eeid分组后,每组的eeid和相应的achieve平均值,也就是报考号及平均成绩,AS后面给出临时表的模式,这里是表名avgach,包括两个属性。
FROM子句定义好临时表就可以基于它来写其他查询子句,这里WHRER子句选择avgachieve>=80的行,SELECT子句计算行数,就得到了平均成绩80分以上的人数。FROM子句中的AS可以省略不写
以上就是把查询块执行结果看作表的FROM子句和WITH子句嵌套的情形。

  • 集合式嵌套
    既然查询语句的执行结果是一个表,而表又可以看作行的集合,从而查询块也可以出现在集合能够出现的任何合适的地方,主要有WHERE子句嵌套和HAVING子句嵌套
    在这里插入图片描述

查询218811011013号考生报考的试卷号和试卷名
实质上就是要列出eeexam表中保存的218811011013号考生报考了的eid集合中的每一个eid对应的exampaper表中的eid和ename的列值
在这里插入图片描述
IN后面括号中给出一个内层子查询,WHERE子句中IN后面括号中给出的子查询的结果是一个eid集合IN就是判断exampaper表每一行的eid是否属于此集合。执行这个查询语句时,首先执行内层子查询,然后用其结果重写外层查询并执行。
也可以这么理解,对exampaper表中的每一行,如果eid属于eeexam表中保存的218811011013号考生报考了的eid集合,则输出此行的eid和ename值。
像这样如果内层子查询不依赖于外层查询,称为不相关嵌套查询,可由内向外逐层处理,也就是每个内层子查询在上一层查询处理之前求解,内层子查询的结果用于建立其外层查询。
在这里插入图片描述
查询所有报考了0205000002号试卷的考生详细信息
在这里插入图片描述
eeexam保存考生报考数据,但只有这里需要的考生报考号,没有考生姓名年龄等其他数据,要查询考生详细信息还需要examinee表,但是对examinee表并不是列出其所有行,而只需要列出报考了0205000002号试卷的考生对应的那些行。这个查询实质上就是对examinee表中的每一行,如果该eeid出现在eeexam表中的一些行里面,并且其中一行的eid值是0205000002,就输出该examinee表的行。
在这里插入图片描述
带有EXISTS谓词的子查询不返回任何数据,只产生逻辑真“true”或逻辑假“false”
在这里插入图片描述
该查询的一个解释是:
在examinee中依次取每个行的eeid值,用此值去检查eeexam表,如果eeexam表中存在有这样的行,eeid=examinee.eeid值,并且eid=’ 0205000002’,则把examinee表的这个行送入结果表。
像这样,如果内存子查询依赖于外层查询称为相关嵌套查询,这种情况下,对外层查询表中的每一行,根据它与内层子查询相关的列值处理内层查询,直至外层查询处理完为止。

HAVING子句嵌套和WHERE子句嵌套类似
查询有考生名叫刘诗诗的学院的考生平均年龄,列出学院名和平均年龄
在这里插入图片描述
当select后面同时出现聚集和不聚集的属性,不聚集的属性一定要出现在GROUP BY子句中
HAVING子句中IN后面给出的子查询,就是查询有考生名叫刘诗诗的学院名集合,整个查询就是对examinee表中的每一行按eedepa值分组,HAVING子句选出有考生名叫刘诗诗的那些组,输出eedepa和每组的eeage平均值。

标量式嵌套
在写嵌套查询语句时,如果能确定查询块只返回单行单列的单个值,查询块可以出现在单个属性名、单个表达式、单个常量,即单值表达式能够出现的任何地方。
查询各个院系名及其考官人数
在这里插入图片描述
该查询实质上就是对department表中的每一行,输出dname列值,以及examiner表中erdepa列值与此dname值相等的行数。这里是SELECT子句嵌套。

查询与218810011028号考生同院系的考生的报考号、姓名(假设一个考生只能属于一个院系,并且必须属于一个院系)
在这里插入图片描述
WHERE子句中的子查询是找出218810011028号考生的院系名,由于一个考生只能属于一个院系,并且必须属于一个院系,这个子查询肯定返回单个值,所以这里第三行可以用“=”。
整个查询的解释:
对于examinee表中的每一行,列出eedepa值与218810011028号考生相等的那些行的eeid、eename。

查询每个院系的平均分
在这里插入图片描述
该查询的实质是对eeexam表中的每一行,按行中eeid值在examinee表中,找到的eedepa值分组,输出每组的eedepa值和平均值,每个eeid对应考生的eedepa值是通过一个子查询来查的,子查询出现在GROUP BY子句和SELECT子句。
查询每个院每个考生得分,列出院名、考生名和分数,按院名升序排列,同院按分数升序排序
在这里插入图片描述
查询的实质是:(先看SELECT再看ORDER BY)
对eeexam表中的每一行,输出按行中eeid值在examinee表中找到的eedepa、eename值,eeexam的achieve值按此eedepa值升序排列,同院按achieve值升序排列。此查询中对eeexam表中每个eeid值,对应考生的eedepa、eename是用子查询在examinee中找的。子查询出现在ORDER BY子句和SELECT子句。

子查询还可以出现在LIMIT子句
对examinee表按照eeid升序,从考生人数的四分之一处开始,列出四分之一的考生信息在这里插入图片描述
这个查询语句中输出行数和偏移量都是用子查询查到的examinee表行数计算得到的。
在这里插入图片描述

嵌套查询的执行逻辑
在这里插入图片描述

  • 父子不相关嵌套查询
    在这里插入图片描述
    在这里插入图片描述
    要点:
    父子独立 自内向外 逐层执行
    先执行最内层,再执行次内层,……,直到次外层,最后执行最外层。

  • 父子相关嵌套查询
    在这里插入图片描述
    在这里插入图片描述
    取父查询的第一行。因为查询结果有一行,EXISTS返回true,于是第一行就按照SELECT*作为查询结果来输出
    取父查询的第二行。
    ……
    步骤总结:
    依次取examinee每个行eeid值,用此值执行子查询:检查eeexam表
    若eeexam中存在有这样的行:eeid值等于此examinee当前行eeid值,并且eid=‘0205000002’,则此examinee当前行送入结果表
    查询所有报考了0205000002号试卷的的考生详细信息

第四章 PG应用

第一节 数据库应用体系结构

网络上的数据库系统通常把数据表示、处理和存储分为两层、三层甚或多层
常见的有C/S(Client/Server)结构,B/S(Browser/Server)结构两类
在这里插入图片描述
1. C/S(Client/Server)结构
包括服务器、客户机两层
数据存储由服务器负责,数据处理任务可以在客户机和服务器之间灵活分配,数据表示由客户机负责,客户机需要时向服务器发出请求,服务器响应这些请求并把结果或状态信息返回给客户机
在这里插入图片描述
从开发的角度看,既需要SQL语言访问数据库,又需要C/C++/Java/C#等高级语言进行数据处理和表示。
两类语言混合编程,可以将静态或动态SQL语句嵌入高级语言,也可以让高级语言通过ODBC、JDBC、ADO等桥梁调用SQL。
在这里插入图片描述
C/S结构的软件需要针对不同的操作系统开发不同版本的软件,每台客户机需要安装专门的客户端,而且当系统升级时,每台客户机都需要重新安装客户端新版本,其维护和升级成本也比较高。
如腾讯QQ、网络多人游戏等的就是典型的基于C/S体系结构
在这里插入图片描述
2. B/S(Browser/Server)结构
也就是浏览器和服务器结构,客户机不需要安装任何特定的软件,只需要有一个浏览器就可以与服务器进行交互,比如很多很多采用ASP、PHP、JSP技术的网站就是典型的基于B/S体系结构的
在这里插入图片描述
B/S结构随着intranet(内联网)而兴起,并在internet上得到了广泛的应用,它是对C/S结构的一种变形或者改进,现在几乎已经完全取代了C/S,在这种结构下,用户工作界面通过浏览器来实现,浏览器只负责发送请求、接受数据,几乎不进行数据处理,主要的任务在服务器端处理

B/S结构通常包括多层
第一层客户端浏览器层,也就是安装在客户机上的浏览器,用网页制作软件的网页一般是用HTML标记语言编写,它通过互联网向Web服务器提出访问Web页面的请求,并接受从Web服务器返回的页面
第二层Web服务器,它接受从浏览器发来的请求,然后根据情况有两种处理方式,或者直接返回HTML格式Web页面,或者调用应用服务器中的应用程序,并接受从应用服务器返回的数据,整合成HTML格式页面发送给浏览器
第三层应用服务器,由中间件与应用程序组成,应用服务器接收Web服务器的调用请求,访问互联网上的数据库服务器,并将结果返回Web服务器,Web服务器和应用服务器有时在同一层,将访问数据库的结果数据以HTML格式作为输出,同普通HTML一起返回给浏览器
第四层数据库服务器,可以是PG、Oracle、Sybase、DB2、MySql、SQLServer等数据库管理系统,接受从应用服务器发来的SQL请求,经相应处理后将结果返回给应用服务器
第五层数据库,也就是由相应数据库管理系统管理的数据集
在这里插入图片描述
Web与数据库是当今互联网上两大无处不在的关键基础技术,数据库管理具有严格的数据模型与数据模式,有标准查询语言SQL,Web结构松散、随意、访问自由
在这里插入图片描述
浏览器和Web服务器主要使用HTML语言,应用程序通常使用高级语言编写的,从HTML到SQL就需要两个桥梁,HTML与高级语言之间的CGI、ASP、JSP等桥梁,高级语言与数据库之间的JDBC、ODBC、ADO等桥梁
在这里插入图片描述

B/S结构的系统有一个极大的优点就是维护和升级方式简单,由于B/S结构的固有特点,所以无论客户的规模有多大,系统都只需要在服务端维护升级就可以了,所有的客户端只是浏览器,一般不需要做特殊的专门维护,这样极大地减少了维护升级的费用和时间,还有另外一个好处,由于客户端只是一个浏览器,所以需要对客户进行的培训很少。

第二节 嵌入式pgSQL

PG提供的SQL语言pgSQL不仅可以作为独立的数据语言直接以交互式的方式使用,还可以作为子语句嵌入在宿主语言中使用,这里所说的宿主语言就是指我们常见的高级程序设计语言,如C、C++语言等,实现pgSQL嵌入。
在这里插入图片描述
宿主语言编程,比如C语言,
首先使用任意文本编辑器编写,包含了pgSQL语句的宿主语言语句的混合源代码,并将这种混合式源程序文件的扩展名指定为pgc
然后用嵌入式pgSQL预处理程序ECPG对混合式源程序.pgc文件进行预处理,主要就是把其中的pgSQL语句转换成主语言能够识别的SQL函数调用的形式,结果是同名.c文件,这样就可以利用宿主语言开发环境,在宿主语言SQL函数定义库的帮助下,编译、连接、运行这个包含了数据库访问的宿主语言程序。
在这里插入图片描述
在具体程序编写方面,把pgSQL嵌入到宿主语言中使用,还必须要解决以下四个方面的问题
第一连接数据库,高级语言需要与数据库服务器建立连接
第二嵌入识别问题,宿主语言的编译程序不能识别pgSQL语句,要解决如何区分宿主语言的语句和pgSQL语句
第三, 宿主语言与pgSQL语言的数据交互问题,pgSQL语句的查询结果,必须能够交给宿主语言处理,宿主语言的数据也要能够交给pgSQL语句使用
第四宿主语言单记录pgSQL多元组的协调问题,宿主语言一般一次处理一个记录,相当于数据库中的一行,而pgSQL常常处理的是行的集合,这个矛盾必须解决

1.如何解决连接数据库问题?
首先,宿主语言如何连接数据库,通常需要给出数据库服务器地址、端口号、数据库名、用户名、口令等,另外,必要时可能还需要安装和加载数据库驱动程序,C语言连接PG数据库的语句格式为
在这里插入图片描述

2.如何解决嵌入式识别问题?
为了区分宿主语言和pgSQL语句,为pgSQL语句加一个识别前缀标识EXEC SQL和结束标志分号 ;
在这里插入图片描述
3.如何解决宿主语言和pgSQL语言的数据交换问题?
引入共享变量的概念。
共享变量的声明格式是:在EXEC SQL BEGIN DECLARE SECTION和EXEC SQL END DECLARE SECTION之间给出共享变量的声明
比如,int v1声明整型共享变量v1,varchar v2声明变长字符串型共享变量v2,等等
在这里插入图片描述
共享变量声明后,可以用在pgSQL语句中任何需要和允许常量的地方,在pgSQL语句中使用共享变量时,变量名前需加一个冒号

现在,假定我们声明了共享变量长度为12的定长字符串变量bs_eeid,长度为20的定长字符串变量bs_eename,整型变量bs_eeage
在这里插入图片描述
如果要修改examinee表中一个考生的年龄eeage,需要修改年龄的考生的报考号由共享变量bs_eeid给出,年龄要修改为共享变量bs_eeage当中的值可以用这个语句
在这里插入图片描述
4.如何解决宿主语言的单记录与pgSQL的多元组问题?
为了解决宿主语言一次只能处理一个记录而pgSQL语言一次处理多个元组的矛盾,引入游标cursor的概念
相关语句有:DECLARE CURSOR, OPEN, FETCH, CLOSE
在这里插入图片描述
当无法确定SELECT语句查询结果至多是一个元组时,需要用游标机制把多个元组一次一个地传送给宿主语言程序进行处理;另外,在游标处于活动状态时,也可以更新或删除游标指向的元组

在这里插入图片描述
比如这是一个在基本表examinee表中检索各位考生的各门考试成绩信息的程序
在这里插入图片描述
SQLSTATE是一个特殊变量,用于连接pgSQL执行系统和宿主语言,它是一个五字符的数组,每次调用pgSQL的库函数,向SQLSTATE变量中存放一个代码,以反应调用中出现的问题
比如00000表示没有产生任何错误02000表示没有找到结果元组
程序首先定义了一个宏,NO_MORE_TUPLES,显然当SQLSTATE为02000时,也就是没有找到元组时,(SQLSTATE, “02000”),字符串比较结果的非,这个逻辑值为真,此时程序中宏NO_MORE_TUPLES出现的地方就会是逻辑真;如果SQLSTATE不是02000,也就是找到了元组时,程序中宏NO_MORE_TUPLES出现的地方就会是逻辑假

函数queryachieve当中定义了共享变量长度为12的字符串seeid,长度为10的字符串seid,整型sachieve.
语句EXEC SQL DECLARE quecur CURSOR WITH HOLD FOR SELECT eeid, eid, achieve FROM eeexam;这个语句声明游标quecur,用于查询SELECT eeid, eid, achieve FROM eeexam
接着语句EXEC SQL OPEN quecur打开游标quecur,游标打开初始时指向第一行的前面
然后程序中是一个永真while循环,循环体第一句使得游标前进一行并把对应行内容放入共享变量seeid,seid,sachieve,
循环体第二句是一个条件语句,意味着没有找到元组,也就是查询结果为空或元组依次处理完时循环终止,如果FETCH子句成功获得一个元组,NO_MORE_TUPLES为假时,程序会接着执行循环体第三句,输出共享变量seeid,seid,sachieve这些变量的值,然后继续下一轮循环
while循环后面是EXEC SQL CLOSE quecur,是在循环结束后关闭游标quecur

如果应用程序处理过程中需要游标做后向移动,则需将游标定义为卷游标,也称卷标,就是在游标定义语句中CURSOR前加上SCROLL

句法格式如下:
EXEC SQL DECLARE <游标名>
卷标的推进句法可以是下面这些中的任意一个
EXEC SQL FETCH NEXT FROM <游标名> INTO <变量表>
在这里插入图片描述
这些语句与前面FETCH语句的区别在于,这里的FETCH后面给出了卷游标移动的方向和行数,NEXT表示把游标从当前位置推进一行,PRIOR表示把游标从当前位置返回一行,FIRST表示把游标移向查询结果的第一行,LAST表示把游标移向查询结果的最后一行,FETCH后面是RELATIVE、ABSOLUTE时,我们可以举例来说明:
RELATIVE 3是指把游标从当前位置推进3行,RELATIVE -3是指把游标从当前位置返回3行;
ABSOLUTE 3是指把游标移向查询结果的第3行,ABSOLUTE -3是指把游标移向查询结果的倒数第3行

我们截至目前所讲的嵌入式编程,pgSQL语句本身都是固定不变的,但是实际应用中有时SQL语句只能在实际运行时才能完全确定,这就需要动态pgSQL语句
动态pgSQL语句需要先准备再执行

动态pgSQL预备语句的格式:
在这里插入图片描述
这里字符串的值应该在运行时结合用户输入,可以生成完整的pgSQL语句,使用动态pgSQL语句时还可以在两种情况下作改进
第一种情况,当pgSQL语句只需执行一次时,预备语句和执行语句可合并成一个语句

EXEC SQL EXECUTE IMMEDIATE <字符串>
第二种情况,当在预备语句中组合pgSQL语句时, 允许暂时缺某些条件值,这些值可以在执行语句中用USING短语以共享变量给出,语句格式是:
EXEC SQL EXECUTE <动态pgSQL语句名> USING <共享变量>

在这里插入图片描述

pgSQL动态嵌入式编程的例子
在这里插入图片描述
第一行,指定了数据库名postgres
在这里插入图片描述
EXEC SQL BEGIN 和 EXEC SQL END之间,定义了四个共享变量,字符指针tt指向字符串“update…;”,是一个pgSQL语句的雏形
字符指针ttc指向字符串“commit”,是一个完整的pgSQL语句“commit”,整型变量ii,jj分别赋值
在这里插入图片描述
EXEC SQL PREPARE mmtt from :tt; 用共享变量tt准备语句
EXEC SQL EXECUTE mmtt USING :jj, :tt; 执行共享变量tt准备的语句,第一个?用jj的值替换,第二个?的值用ii替换。这样共享变量tt准备的语句就是把eeid为ii值的行中eeyear属性值加上jj
EXEC SQL EXECUTE IMMEDIATE :ttc; 把上一句对数据的修改提交到数据库中
EXEC SQL DISCONNECT; 最后断开数据库连接
在这里插入图片描述
左边给出了程序执行前的数据库状态,右边给出了程序执行后的数据库状态,可以看到执行前eeid是199的那一行中eeyear的值是2000,程序执行后该行的eeyear的值就是加20000后的22000
在这里插入图片描述

第三节 JDBC编程

JDBC(Java Database Connectivity)是一种用于执行SQL语句,不仅是PG的SQL语句,而且是包含各种关系数据库系统SQL语言语句的Java API,它定义了用来访问数据库的标准Java类库,使用这个类库可以以一种标准的方法方便地访问各种关系数据库,包括pgSQL

JDBC的目标是使应用程序开发人员使用JDBC可以连接任何提供了JDBC驱动程序的数据库系统,为访问不同的数据库提供了一种统一的途径。
在这里插入图片描述
Java通过JDBC来访问数据库,这些包含了JDBC连接访问数据库语句的Java程序就是普通Java程序,用Java语言编译器编译成字节码就可以在Java虚拟机上运行,只是需要导入相应的包,也就是import Java.sql.* **
在这里插入图片描述
具体到
编写程序**:
首先Class.forName(…)加载PG的JDBC驱动程序
然后用DriverManager的getConnection方法,指定访问协议jdbc、数据库管理系统postgresql、数据库服务器主机及端口号、数据库名postgres、用户名、口令,创建连接Connection对象
继而用Connection的createStatement()方法创建可以执行pgSQL语句的Statement类对象,比如stmt
执行完数据库访问,关闭Statement和Connection对象,用Statement对象的executeUpdate方法可以执行数据库修改
在这里插入图片描述
数据修改
在这里插入图片描述
往eeexam中插入一个218811011116号考生的新元组

数据查询
在这里插入图片描述
用Statement的executeQuery方法可以执行数据库查询
查询每个考生的平均成绩,结果放在ResultSet对象中,当打开结果集对象时,游标指向结果集第一行的前面,第一次使用ResultSet的next()方法,使游标指向结果集的第一行,,使用next()方法一次就使游标指向前进一行,可以按属性名或属性在结果表中的从1开始的列序号,用getString()撷取字符串型属性值,getFloat()撷取浮点型属性值,getInt()撷取整型属性值,等等

比如myrset.getString(“eeid”)与myrset.getString(1),都是返回结果集中的第一列eeid的属性值。
也可以通过用“?”代表以后再给出实际参数值来创建一个预备语句,pgSQL允许在准备的时候预先对查询语句进行编译,每次以新赋值代替“?”执行的时候,重用预先编译的查询形式
使用预备语句的JDBC程序例子
在这里插入图片描述
首先,用Connection的prepareStatement()方法对给出的pgSQL语句创建,PrepareStatement对象此时虽然给出了查询语句但并不执行,直到PrepareStatement的executeUpdate()或executeQuery()方法才执行
每次调用PrepareStatement的executeUpdate()或executeQuery()方法执行前,需要用PrepareStatement的setString、setInt等类似方法对“?”代表的参数设定新值,特别是当需要参数以不同值多次执行相同语句时,预备语句的执行速度通常比分开的pgSQL语句快得多
JDBC还提供了查询结果集模式查询数据库模式的机制
在这里插入图片描述
ResultSet有一个getMetaData()方法,用来获得结果集元数据ResultSetMetaData对象

用ResultSet接口来输出结果集所有属性的名称和类型的JDBC程序的例子
在这里插入图片描述
首先用ResultSet的getMetaData()方法获取结果集元数据ResultSetMetaData对象
然后通过一个循环来依次输出结果集模式中的每个属性名和类型,循环的次数由ResultSetMetaData的getColumnCount()方法返回结果集模式中的列数来控制,每次输出ResultSetMetaData的getColumnName()返回的属性列名和getColumnType()返回的属性列类型
在这里插入图片描述
接口Connection有一个getMetaData方法,该方法返回一个DatabaseMateData对象,DatabaseMateData接口又有大量查询数据库及数据库系统元数据的方法,有的方法返回数据库系统产品名称、版本号以及其它特性。还有其他方法返回数据库本身信息,比如返回表名、外键、授权、数据库最大连接数等等元数据。

查询数据库中属性列信息的JDBC程序的例子
在这里插入图片描述
首先,用Connection的getMetaData方法,返回程序当前连接数据库的元数据到DatabaseMateData对象
然后,用DatabaseMateData的getCollumns(null, null, “eeexam”, “%”)方法获取eeexam表中的所有属性列信息到ResultSet对象
最后,利用游标通过一个循环依次用ResultSet的getString()方法获取列名和列类型
DatabaseMateData的getCollumns有四个参数,第一个是目录名,第二个是模式名模板,第三个是表名模板,第四个是列名模板,可以使用pgSQL字符串匹配特殊字符如”%”、”_”,也就是说该方法返回给定目录下满足模式名模板和表名模板表中满足列名模板的列信息

使用JDBC连接PG数据库的JSP程序例子
在这里插入图片描述
在这里插入图片描述
JSP是一种使用Java开发Web应用程序的服务器端脚本技术,允许将静态html和Java动态生成的html混合在一起,它把Java代码嵌入在html文档中,Web服务器在将html页面传送给客户端浏览器之前,会抽取页面中的Java代码形成单独Java程序,调用相关机制执行这些来自html页面中的Java代码,按照执行结果在原始html文档中,Java代码向out对象输出的地方,用输出信息替换输出语句,并把其余Java代码从页面中删除。
客户端浏览器收到的就是这样得到的html页面,根本无法察觉页面中原来是否曾经包含Java代码
用JSP编写的动态Web页面
在这里插入图片描述
其中大部分是用html编写的静态内容,只有中间用<% %>括起来的部分是Java代码,包括通过JDBC访问数据库的加载驱动程序、建立数据库连接,创建Statement对象,执行pgSGL语句以及善后处理等,最后向out对象输出一个字符串。
在这里插入图片描述
当有客户浏览器请求该页面时,服务器抽取其中的Java代码并执行
在这里插入图片描述
向exam表插入一行元组,并准备好像out对象输出的内容,在原来的html文档中,用拟向out对象输出的结果替换相应的Java输出语句,并删除原来html文档中的<% %>以及所有非输出Java语句。最后Web服务器将这个最终得到的html文档返回给发出请求的客户浏览器
在这里插入图片描述
实际中的JSP页面,其中html代码和Java代码可以根据需要任意交替出现,只需要注意这么几点:
第一, 每段Java代码用<% %>括起来,从html代码的角度看,仅关注Java中的输出语句,只要求输出语句位置合适,能最终生成合适的页面,
第二, 关于Java代码,假设去掉所有html代码和分界符<% %>后符合Java语法
在这里插入图片描述

第四节 PG中的函数

PG允许使用各种不同的程序设计语言来编写函数,特别是内建了PL/pgSQL,函数经编译和优化后,存储在数据库服务器中,可以反复被调用
存储函数的优点
第一, 由于存储函数不需要额外的语法分析步骤,因而运行效率高
第二, 客户端不需要的中间结果无需在服务器端和客户端来回传递,降低了客户机和服务器之间的通信量,客户机上的应用程序只需向服务器发出存储函数的名字和参数,就可以调用执行存储函数
第三, 便于实施业务规则,通常把业务规则计算程序写成存储函数,由数据库管理系统集中管理,方便进行维护
在这里插入图片描述
基本的pgSQL是非过程化的声明语言
PL/pgSQL是为PG扩展的过程语言部分,它为pgSQL增加了控制结构,结合了pgSQL的数据、操作能力和过程化语言的流程控制能力,用于创建存储函数,在服务器执行复杂的计算等
PL/pgSQL是基于块结构的,块中的每个声明和每条语句都是以分号结束,如果某子块在另一块中,那么该子块的END保留字后面必须以分号结束,函数体的最后一个END保留字后面可以省略分号
在这里插入图片描述
PL/pgSQL可以使用pgSQL的所有数据类型来声明变量,比如integer、varchar、char等
比如uid integer定义了一个整型变量uid
变量achieve是小数,两边总共五个数字,小数点后含两位小数的数值型,就可以定义为numeric(5,2);
在这里插入图片描述
PL/pgSQL中定义变量的一般形式是
在这里插入图片描述
初始表达式给变量赋初值

PL/pgSQL中常量的定义类似于变量的定义,格式如下
在这里插入图片描述
定义常量时必须要给常量一个初始值,并且该值存在期间或常量的作用域内不能改变,如果试图修改它,PL/pgSQL将返回一个异常

PL/pgSQL中的赋值号是 := ,赋值语句格式如下
在这里插入图片描述
除了基本的变量、常量定义和赋值语句,PL/pgSQL还提供了流程控制语句,主要有条件控制语句和循环控制语句,这些语句的语法、语义和一般的高级语言比如C语言非常类似

PL/pgSQL中条件控制语句一共有五种形式的IF语句
第一种 条件控制语句是IF-THEN结构,语句的形式是
在这里插入图片描述
如果逻辑表达式为真,则执行THEN和END IF之间的语句序列,否则,直接执行END IF后面的语句序列

第二种 条件控制语句是IF-THEN-ELSE结构,语句形式是
在这里插入图片描述
如果逻辑表达式为真,则执行THEN和ELSE之间的这些语句;如果逻辑表达式为假,则执行ELSE和END IF之间的这些语句

第三种 条件控制语句是IF-THEN-ELSE IF结构,语句形式是
在这里插入图片描述
实质上就是在一个IF语句的ELSE部分嵌套了另一个IF语句。如果逻辑表达式1为真,则执行语句序列1;如果逻辑表达式1为假,而逻辑表达式2为真,则执行语句序列2

第四种 条件控制语句是IF-THEN-ELSIF-ELSE结构,语句形式是
在这里插入图片描述
这种形式就是多层嵌套,可以方便地在一条语句中检查许多候选条件。如果逻辑表达式1为真,则执行语句序列1;如果逻辑表达式1为假,而逻辑表达式2为真,则执行语句序列2;如果逻辑表达式2为假,而逻辑表达式3为真,则执行语句序列3等等;最后如果所有ELSIF后面给出的逻辑表达式都为假,则执行ELSE后面的语句序列n

第五种 条件控制语句和第四种条件控制语句完全类似,只是把ELSIF可以写作ELSEIF,ELSIF和ELSEIF完全是等价的
在这里插入图片描述
PL/pgSQL有多种循环控制语句LOOP、WHILE、FOR,也有控制循环执行状态的语句,比如EXIT、CONTINUE
在这里插入图片描述
LOOP循环语句的格式
在这里插入图片描述
LOOP循环是无限循环,反复执行循环体,直到EXIT或RETURN语句终止,其中label是可选的,由EXIT和CONTINUE语句使用,用于在嵌套循环中声明应该应用于哪一层循环

WHILE循环语句的格式
在这里插入图片描述
对WHILE循环来说,在每次进入循环体的时候检查逻辑表达式的值,只要WHILE后面的逻辑表达式为真,就不停地循环执行循环体

FOR循环语句的格式
在这里插入图片描述
变量count会被自动定义为整数类型,bound1和bound2给出范围上下界。这两个表达式在第一次进入循环的时候计算BY后面的expression,指定循环的步长,默认为1,但如果声明了REVERSE,步长将变为相应的负值。
FOR循环的基本执行过程是将count设置为循环的下界bound1,检查是否小于上界bound2,当指定REVERSE时则将count设置为循环的上界bound2,检查count是否大于下界bound1,如果越界则跳出循环,否则执行循环体,然后按照步长更新count值,重新判断循环条件

EXIT语句用于结束整个循环过程,使流程跳转到循环体之外,接着执行循环体后面的语句,不再判断执行循环的条件是否成立
在这里插入图片描述
如果没有label则退出最内层的循环,然后执行跟在最内层END LOOP后面的语句;如果有label退出label对应层的循环然后执行跟在对应层END LOOP后面的语句;如果有WHEN,循环退出只有在WHEN后表达式为真的时候才发生,否则继续执行EXIT后面的语句

CONTINUE语句用于结束本轮循环,意即提前结束本轮循环,接着执行下一轮循环
在这里插入图片描述
如果没有label,就开始最内层循环的下一次执行;如果出现了label,继续执行标签对应的循环;如果有WHEN,那么循环的下一次执行只有在WHEN后表达式为真的情况下才能进行,否则继续执行CONTINUE后的下一个语句

CONTINUE可以用于所有类型的循环,可以通过pgSQL语言创建、执行或删除使用PL/pgSQL编写的存储函数

创建存储函数的例子
在这里插入图片描述
CREATE OR REPLACE FUNCTION后面的add是函数名,add后面括号中的参数列表是调用该函数时应该给出的参数值,必须指定值的数据类型,这里是两个整数。
RETURNS后面是函数返回值类型名
DECLARE部分定义了一个整数变量intsum,$1和$2依次引用函数调用时给出的参数值,SELECT $1+$2 INTO intsum计算$1+$2的和,并传给intsum,然后RETURN intsum返回intsum的值
最后一行LANGUAGE plpgsql声明函数编写使用的语言是plpgsql
对于编写好的PL/pgSQL存储函数,有两种方式执行
在这里插入图片描述
如果需要存储函数执行返回的结果用 SELECT 函数名([参数1,参数2……])
如果只是需要调用执行存储函数,执行结果的内容无关紧要可以丢弃,那么用PERFORM,语句格式是PERFORM 函数名([参数1,参数2……])

对于不再需要的存储函数,可以予以删除
在这里插入图片描述

第五章 PG数据保护

第一节 数据保护

作为实用化最成功的软件系统之一,数据库系统如今已经成为全球化经济基础设施的重要基础部件,对商务管理、业务管理、数据分析、电子商务、慕课……来说,它都是必不可少的。人类社会对数据的依赖达到了前所未有的地步。

数据安全关系到社会的每个组织单位和个人,数据安全建立在数据保密性、数据完整性、数据可用性之上

数据库系统的特点之一就是由数据库管理系统提供统一的机制保护数据的保密性、完整性、可用性

  • 数据保密性是指对数据资源的隐藏,通常在数据库中,保护保密性是指仅仅允许经过授权才能读数据,涉及数据值的保密和数据存在性的保密,数据保密性的需求源于数据的敏感性,数据存在性有时候比数据值本身更需要保护
    在这里插入图片描述

  • 数据完整性指的是数据的可信度,保护数据完整性通常是指防止非法或者未经授权的数据修改,数据完整性包括数据值的完整性和数据来源的完整性,完整性遭到破坏,也就是产生无效或损坏的数据,将导致用户由于错误的或无效的数据做出错误的决策
    在这里插入图片描述

  • 数据可用性是指对数据的期望使用能力,保护数据可用性通常指减少数据库系统停工时间,保持数据持续可访问,可用性遭到破坏将影响用户正常获取数据,意味着用户不能访问数据库或操作困难
    在这里插入图片描述

数据保护允许说明数据资源使用的安全策略,并提供机制予以支持。策略和机制不同,策略决定做什么,也就是对允许什么、禁止什么的规定;机制决定怎么做,也就是实施策略的功能、方法、工具和规程
描述系统访问策略的最简单模型是访问控制矩阵,矩阵的行对应用户或角色,列对应数据库对象,矩阵中的元素表示相应用户对相应数据库对象的访问权限,访问控制矩阵通常依据用户在系统应用中担任的角色确定。
在这里插入图片描述
PG中的授权和收权语句可以赋予或撤销用户相应的访问权限,数据库管理系统确保只有获得授权的用户有资格访问数据库对象,令所有未授权人员无法接近,从而保护数据保密性和完整性。
视图作为外模式的实现,支持“见之所需”原则,不仅简化了用户操作,而且结合访问控制可以保护视图数据保密性和完整性,更重要的是提供了一种保护数据存在性的手段。
在这里插入图片描述
PG提供加密函数,以允许对存储数据进行加密处理,支持保护数据保密性和完整性验证。
数据库系统都允许对数据库的并发访问以改进系统响应性能,提高可用性,但是,如果对数据库访问的并发执行不加以控制,将可能破坏数据完整性,另外数据库系统总会面临这样那样的故障,故障也可能破坏数据完整性。

数据库管理系统通过将数据库操作组织成事务,以事务为单位实施并发控制和故障恢复,PG允许显示或隐式的事务边界定义。数据库管理系统中的并发控制机制,维护并发访问情况下的数据完整性。数据库管理系统中的故障恢复机制,不仅维护故障情况下的数据完整性,并且由于故障恢复机制对故障的有效处理,它也是保护数据可用性的重要手段。

访问控制、视图、加密、事务等这几种方法,都是从数据值以外的因素考虑数据保护。
理想情况下,数据值发生变化时,比如进行插入或更新时,系统能够判断数据库中的各个数据项值是否与其对应的现实世界状态一致,也就是数据是否真实正确,然而这个目标是无法实现的,退而求其次,可以在系统中定义一些正确数据应该满足的约束,系统自动检查数据库中的数据是否满足这些约束条件,并且只允许满足这些约束条件的数据进入数据库。
也就是说,软件系统无法保证数据的真实正确性,但可以保证数据符合可明确定义的约束,这种约束通常称为完整性约束
在这里插入图片描述
总的来说,数据安全是数据库技术广泛使用的前提条件之一,也是数据库管理系统的重要目标和优势之一,利用技术,保护数据安全,是以数据库为中心的应用系统必不可少的重要方面。

第二节 视图

视图能够使不同用户从不同角度看待同一数据,从而对数据存在性方面的保密性,提供安全保护,同时视图还有如下作用
视图可以简化用户操作,适当的利用视图,可以更清晰的表达查询,创建视图用CREATE VIEW语句实现,语句的格式如下
在这里插入图片描述
组成视图的属性列名,可以全部省略或全部指定,视图属性名省略时,取select结果关系属性名。
比如对于组卷系统,数据库中的基本表eeexam,用户经常要查询报考号eeid及其平均成绩这两项,那么可以用下列语句建立视图
在这里插入图片描述
这个语句创建了视图avgachieve,它有两个属性eeid和average,average属性的值就是对应eeid考生的平均成绩

也可以使用视图定义视图,比如可以在examinee、eeexam、exampaper三个表的基础上创建视图eeexamv1,语句如下
在这里插入图片描述
这个语句创建了视图eeexamv1有四个属性eeid,eedepa,ename,achieve,也就是考生报考号、考生院系名、试卷名和成绩
在这里插入图片描述
然后基于视图eeexamv1,可以进一步创建视图eeexamv2,语句如下
在这里插入图片描述
这个视图eeexamv2有三个属性eeid,ename,achieve,也就是历史学院的考生报考号、试卷名和成绩.

创建视图后,就可以在SQL语句中使用,视图名能够出现在表名可以出现的任何地方
比如我们已经定义了视图avgachieve(eeid,average),要查询平均分86分以上的人数就可以用这样的查询语句
在这里插入图片描述
视图和表的异同
虽然视图和表都是关系,都可在查询中直接使用,但是视图与表有一点重要不同,数据库中存储表的模式定义和数据,而只存储视图的定义,不存储视图的数据,视图中的数据是在使用视图时按照视图定义中的查询临时计算的
在这里插入图片描述
视图定义中引用的表成为基表,当基表中的数据发生变化时,相应的视图数据也随之改变
在这里插入图片描述
视图可以把基表结构的细节封装起来,表可以随应用进化而变化,但视图以及基于视图的应用程序,可以尽可能少地受表变化的影响,这也就是数据的逻辑独立性

通过视图,用户只能查询或修改视图中见得到的数据,看不见数据库的其他数据,这也就提供了数据存在性的保密性保护,由于视图是基于最基本的查询来定义的,系统只存储视图的定义,不存储视图的数据,对视图的更新化通常是转化为基表的相应操作来执行,这就要求对视图的更新慎之又慎。
PG只允许对可更新视图进行修改操作,可更新视图需要满足如下条件:

  • 视图是从单个关系只使用投影、选择操作导出
  • SELECT子句中只包含属性名,不包含其它表达式、聚集、DISTINCT声明等,查询中没有GROUP BY或HAVING子句,WHERE子句子查询不出现基表名
    -并且对视图的更新操作符合一般更新语句的规则,比如插入时主键不能为空,执行插入操作的视图的投影列需包含基础关系的键
    在这里插入图片描述

关于视图更新的例子
有一个男生视图eemale的定义, 视图eemale是考生表examinee表中的男生报考号,姓名和年龄
在这里插入图片描述
执行左1系统会将此对视图eemale的插入操作传递到基本表examinee上执行以下语句左2
提示:
如果在视图定义的末尾包含WITH CHECK OPTION,数据库管理系统自动检查对视图的更新应满足视图定义中WHERE的条件,这种情况下此插入操作便会被拒绝执行投影

第三节 访问控制

PG提供访问控制,以便声明给定用户拥有在给定数据库对象上的给定操作权限,这里关键包括用户、数据库对象和操作权限三个方面
在这里插入图片描述
PG使用角色来同一管理用户,分登陆角色和组角色。登陆角色就是具有登陆权限的角色,相当于用户。组角色就是作为组使用的角色,一般不应当具有LOGIN属性。

在创建数据库对象,比如说表属性等的时候,对象会被赋予一个所有者,通常所有者就是执行创建语句的角色,对大多数类型的对象,初始状态是只有所有者或者超级用户可以对该对象做任何事情,要允许其他角色使用这个对象,必须赋予相应的权限。
在这里插入图片描述
默认情况下,新建立的数据库总是包含一个超级用户角色,并且默认这个角色名是postgres。创建组角色yanni用语句:CREATE ROLE yanni
创建具有登陆权限的组角色yuxiaotong,可以用CREATE ROLE yuxiaotong LOGIN
创建可创建数据库的组角色masu,用语句CREATE ROLE masu CREATEDB
创建可创建角色的组角色lichen,可以用语句CREATE ROLE lichen CREATEROLE
创建具有口令的组角色wangxi,可以用一句CREATE ROLE wangxi PASSWORD ‘654321’
创建数据库超级用户角色nini,可以用语句CREATE ROLE nini SUPERUSER
注意:只有超级用户才有权创建超级用户
在这里插入图片描述
如果要修改组角色名yanni为newyanni,就可以用语句ALTER ROLE yanni RENAME TO newyanni
如果要给组角色yangchen添加创建角色和数据库的这个权限,就可以用一句ALTER ROLE yangchen CREATEROLE CREATEDB
收回组角色yangchen创建角色和数据库的权限,用语句ALTER ROLE yangchen NOCREATEROLE NOCREATEDB
为了与SQL标准兼容,PostgreSQL也有用户管理命令,该角色管理的命令很相似。
创建用户lini可以用语句CREATE USER nini和CREATE ROLE nini login等价
删除组角色yangni,用语句DROP ROLE yangni
删除用户wangni,用语句DROP USER wangni
一旦组角色已经存在了,那么就可以用GRANT和REVOKE命令添加和撤销权限,但是不能建立循环的成员关系
在这里插入图片描述
GRANT和REVOKE命令:

GRANT group_role TO rolet
REVOKE group_role FROM rolef

一个组角色的成员可以用两种方法使用组角色的权限
首先,一个组的每个成员都可以明确用SET ROLE临时“扮演”该组的成员,在这个状态下,数据库会话具有该组角色的权限,而不是登录角色,这个时候创建的数据库对象被认为是由角色拥有,而不是登录角色
第二,拥有INHERIT属性的角色成员自动具有它们所属组角色的权限
在这里插入图片描述
比如我们执行了下列语句

CREATE ROLE Alice LOGIN INHERT
CREATE ROLE Bob NOINHERIT
CREATE ROLE Rose NOINHERIT
GRANT Bob TO Alice
GRANT Rose TO Bob

那么,在以角色Alice连接之后,该数据库会话将立刻拥有直接赋予Alice的权限加上任何赋予Bob的权限,因为Alice“继承”Bob的权限,不过属于Rose的权限不可用,因为即使Alice是Rose的一个间接成员,但该成员关系是通过Bob过来的,而该组有NOINHERIT属性,
在SET ROLE Bob之后,该会话将只拥有那些已经赋予Bob的权力,而不包含那些已经赋予Alice的权限,
在CREATE ROLE Rose之后,该会话将只能使用已赋予Rose的权限,而不包括已赋予Alice或Bob的权限

原来的权限需要的时候可以用下列方式中的任何一个来进行恢复
可以用SET ROLE Alice,SET ROLE NONE,RESET ROLE
在这里插入图片描述
PG提供GRANT语句和REVOKE语句来给角色授予或撤销数据库操作权限
GRANT语句的一般格式
在这里插入图片描述
这个语句可以赋予给定角色对给定对象的给定操作权限
当这个GRANT语句包含WITH GRANT OPTION选项的时候,在此语句获得权限的角色可以将所获得权限授予其他角色

例如,我们把查询examiner表和修改考官号的权限授予角色uYing,可以用下列这个语句

GRANT UPDATE(erid),SELECT
ON TABLE examiner
TO uYing;

剩余的权限可以由DBA或授权者用REVOKE语句收回
REVOKE语句的一般格式:
在这里插入图片描述
PG中的授权和收权语句可以赋予或撤销用户相应的访问权限,数据库管理系统确保只有获得授权的用户有资格访问数据库对象,从而保护数据保密性和完整性。

第四节 完整性约束

基于完整性约束的数据保护。
假如DBMS足够智能,理想情况下当数据库中的任意数据项发生变化时,比如执行插入或更新操作时,DBMS能够判断出数据项的新值是否与其对应的现实世界状态一致,也就是数据是否真实正确。
当然这个目标是没有办法实现的,我们能做的是,在系统中定义一些正确数据应该满足的约束条件,系统自动检查数据是否满足这些约束条件,并且只允许满足这些约束条件的数据进入数据库。
换句话说DBMS无法保证数据始终与其对应的现实世界状态一致,但可以保证数据始终与系统中明确定义的约束一致。这种约束通常称为完整性约束
在这里插入图片描述
完整性约束的种类
在这里插入图片描述

  • 主键约束
    意味着各元组主键值不能重复,并且不能为空
    在这里插入图片描述

主键约束在CREATE TABLE语句当中PRIMARY KEY定义。单属性构成的主键约束,在属性级,也可以在元组级定义主键;对多个属性构成的主键约束,需要在元组级进行定义
在这里插入图片描述
比如,将examinee表中的eeid属性声明为主键,可以在eeid属性声明后面直接写上PRIMARY KEY,这就是属性级定义的主键。
也可以在属性声明后面单独附加一行PRIMARY KEY(eeid),那么这就是元组级定义主键。
在这里插入图片描述
又比如,eeexam表的主键它是由eeid和eid两个属性一起组成,因为主键有两个属性只能在元组级进行定义,那就要在所有属性声明的后面单独附加一行PRIMARY KEY(eeid, eid)
在这里插入图片描述
将一个表的一个或几个属性定义为主键后,插入元组或对主键列进行修改操作时,系统自动检查元组的各个属性是否为空,只要有一个为空就拒绝插入或修改,并且检查主键值是否唯一,如果不唯一就拒绝插入或修改
在这里插入图片描述
由于实际上删除操作不会导致违背主键约束,只有插入元组或修改涉及主键列时,才可能发生违背主键约束,因此只有对关系进行插入或修改时,系统才检验主键约束

  • 外键约束
    声明一个字段或者一组字段的数值必须匹配另外一个表中出现了这个数值
    在这里插入图片描述
    在CREATE TABLE中用FOREIGN KEY子句定义外键,并用REFERENCES子句指明这些外键引用哪个表哪个的属性
    在这里插入图片描述

比如定义eeexam表中外键,eeexam中的eeid引用examinee表当中的eeid,eeexam中的eid引用exampaper当中的eid
在这里插入图片描述
将一个表的一个或几个属性定义为外键后,引用表插入元组或对外键列进行修改操作时,系统自动检查是否会导致违背外键约束,如果将违背外键约束,那么就拒绝插入或修改。
在这里插入图片描述
将一个表的一个或几个属性定义为外键后,被引用表删除或修改时,系统也会自动检查是否会违背外键约束,如果会违背外键约束,有以下几种处理策略:
1 拒绝执行,当且仅当在引用关系中构造出一个或多个悬浮元组时,对于被引用关系的删除和修改操作将予以禁止,生成¬¬一个错误,表名删除或更新将产生一个违反外键约束的动作,如果约束被声明为DEFERABLE,那么约束检查将推迟到当前事务完成时执行,也就是NO ACTION,是默认动作;
2 RESTRICT操作,禁止对被引用行的操作,并生成一个表明删除或更新将导致违反外键约束的错误,RESTRICT不允许约束检查推迟到事务的晚些时候
3 级联,删除任何引用了被删除的行,或者分别把引用行的属性值更新为被引用属性的新数值
4 设置为空值或默认值,把每个悬浮元组当中的外键值都设置为NULL或默认的一个值
在这里插入图片描述

  • 非空约束
    意味着每个元组对应列值不能为空,将一个或几个属性声明为非空后,系统会阻止相应属性值为空的数据输入或更新。非空约束用NOT NULL声明
    在这里插入图片描述

比如在创建eeexam时,声明属性achieve值非空
在这里插入图片描述

  • 唯一值约束
    意味着相应的属性(或属性组)为候选键,将一个表的一个或几个属性声明为唯一值约束(也就是候选键)后,系统自动检查是否违背唯一值约束。
    与主键约束不同,除非同时显式定义为非空,候选键的属性可为空值
    唯一值约束用UNIQUE声明
    在这里插入图片描述

比如建立部门表department时,部门电话dtele列取值唯一
在这里插入图片描述

  • CHECK约束
    CHECK( P )子句指定一个谓词P,关系中的每一个元组都必须满足谓词P。
    PostgreSQL目前仅支持属性级和元组级CHECK约束,尚不允许CHECK约束出现子查询
    在这里插入图片描述
    假设examinee表的eeage只允许15~60周岁,由于该约束只涉及一个属性,可以在CREATE语句当中属性eeage类型声明后附加上CHECK(0<eeage AND eeage<60),这种方式称为属性CHECK约束
    也可在所有属性类型声明后单独一行做CHECK约束声明,这种方式称为元组CHECK约束。涉及多个属性的CHECK约束,只能以元组CHECK约束方式来声明。
    在这里插入图片描述
    由于元组修改或插入可能给属性引入新值,对于在属性处声明的属性CHECK约束,每当插入元组或修改此属性值时,系统自动检查是否违背相应的CHECK约束,也就是每当任何元组得到该属性的新值时,就对基于该属性的CHECK约束进行检验,如果新值与约束相违背,那么就拒绝更新,如果数据库修改,并没有改变同约束相关的属性值,不会导致与约束相违背,那么就不会检查基于该属性CHECK约束。
    作为元组CHECK约束,即使该约束只涉及一个属性,当关系插入元组或修改一行中任意属性时,即使修改的属性与CHECK约束的约束属性无关,都要进行完整性检查,也就是每当插入元组或者修改表当中的元组时,就对基于元组的CHECK约束中的条件进行检验
    在这里插入图片描述
  • 命名约束
    可以给约束取一个独立的名字,并通过这个名字在需要时对约束进行修改,声明一个命名约束,使用关键字CONSTRAINT后面跟一个作为名字的标识符,然后再跟上约束定义。如果我们没有为约束命名,PG会自动为每个约束指定一个名字。
    在这里插入图片描述

比如将department属性dtele值唯一约束命名为dnu,就可以用这样的语句CONSTRAINT dnu UNIQUE(dtele),然后需要时可以用ALTER TABLE department DROP CONSTRAINT dnu,从department表中删除唯一值约束dnu。
也可以用ALTER TABLE这个语句来添加约束,比如需要的时候也可以用ALTER TABLE department ADD CONSTRAINT dnu1 UNIQUE(dloca);,添加约束dloca这个值唯一的约束。
在这里插入图片描述
在这里插入图片描述

第五节 触发器

触发器(Trigger)是用户定义在关系表上的由事件驱动调用的函数的机制
在这里插入图片描述
触发器比CHECK约束更灵活,可以实施各种复杂的检查和操作,具有更精细和更强大的数据保护能力,在创建触发器之前,必须首先创建触发器函数,触发器函数的语法如下:
在这里插入图片描述
触发器函数中有两对$ $ ,第一对$ $ 之前是函数头部 CREATE FUNCTION function_name() RETURNS TRIGGER AS;
需要注意的是,触发器函数定义的头部RETURNS后面只能是TRIGGER,并且触发器这个函数不能带任何参数
两对$ $ 之间是函数体,包括DECLARE部分的变量声明,以及BEGIN和END之间的函数执行代码,DECLARE部分是可选的,由于PG允许使用各种语言,比如PL/pgSQL、C、Python等来编写函数;
第二对$$之后是对函数编写语言的说明,这里是PL/pgSQL

触发器函数创建之后,使用CREATE TRIGGER命令创建触发器,语法格式如下
在这里插入图片描述
EXECUTE PROCEDURE后面是触发器函数,这里的事件{event[OR…]}包括数据库数据修改操作,比如INSERT、DELETE、UPDATE命令等等;
○1在INSERT型触发器中,NEW用来表示将要(BEFORE)或已经(AFTER)插入的新数据
○2在UPDATE型触发器中,OLD用来表示将要或已经被修改的原数据,NEW用来表示将要或已经修改为的新数据
○3在DELETE型触发器中,OLD用来表示将要或已经被删除的原数据

BEFORE | AFTER的意思是触发器可以分为BEFORE和AFTER触发器,分别在操作完成前和操作完成后出发执行触发器;
ON TABLE后面给出触发器所在表的表名
触发器可以按行或语句出发,也就是行级触发器和语句级触发器
在这里插入图片描述
注意:

  • 行级触发器的触发器函数为触发语句影响的每一行执行一次
  • 语句级触发器的触发器函数为每条触发语句执行一次
    假设在examiner表上创建了一个AFTER UPDATE触发器,如果表examiner有10000行,执行如下这样一个语句UPDATE examiner SET erage=erage+1

如果该触发器为语句级触发器,那么执行完该语句后,触发动作只发生一次,如果是行级触发器,触发动作将执行10000次

WHEN子句
WHEN子句的condition是个布尔表达式,指明触发条件:触发器被激活时,只有触发条件为真触发器函数才执行;否则触发器函数不执行;如果没有WHEN子句,则触发器函数在触发器激活后立即执行
在这里插入图片描述
EXECUTE PROCEDURE后的触发器函数给出的就是触发动作
注意:

  • 触发器函数必须返回一个NULL或者一个元组类型的变量
  1. 语句级触发器应返回NULL
  2. 行级after触发器的值总是被忽略,可以返回null
  • 行级before触发器的返回值不同,对触发器操作的影响也不同。
  1. 如果返回null则忽略该触发器的行级操作,其后的触发器也不会被执行;
  2. 如果返回非null值则返回的行将成为被插入或者更新的行

通常用行级before触发器检查或修改将要插入或者更新的数据,用行级的after触发器更新其他表或进行一致性检查
注意:

  • 如果是行级触发器,可以在触发器函数中使用NEW和OLD引用UPDATE/INSERT事件之后的新值和UPDATE/INSERT事件之前的旧值。
  • 如果是语句级触发器,则不能在触发器函数中使用NEW或OLD

比如,如果要建立INSERT触发器,如果插入examiner表的考号长度不为10位,提示“考号格式错误!”

函数CHAR_LENGTH(),能够取得这个参数的字符串的长度
1用plpgsql创建触发器函数,函数名是examineeid(),
BEGIN和END之间的代码:NEW代表INSERT或UPDATE操作产生的新的数据行,函数CHAR_LENGTH(new.eeid)返回的是新插入行eeid值的长度,RAISE EXCEPTION是抛出一个异常信息,这段代码的意思是:如果新插入的eeid的值的长度不等于10,则提示考号格式错误,返回NULL放弃插入;否则返回NEW,正常插入新元组。
然后就可以创建触发器,触发名是examineeid_insert

在examinee表的INSERT前触发,也就是行级BEFORE触发器,触发器函数时examineeid(),所以完整的创建触发器语句如下右
在这里插入图片描述
又比如,如果要建立UPDATE触发器,对examinee表进行UPDATE操作之后,若报考号被修改,则将eeexam表中报考号进行相应修改。
在这里插入图片描述
用plpgsql创建触发器函数examinee_up(),BEGIN和END之间的代码:
与NEW代表INSERT或UPDATE操作产生的新的数据行类似,OLD代表被UPDATE或DELETE操作修改或删除的旧的数据行。
这段代码的意思是,如果对examinee表进行UPDATE操作,那么就用UPDATE eeexam SET eeexam.eeid=new.eeid WHERE eeexam.eeid=old.eeid对应修改eeexam表中的报考号。
在这里插入图片描述
有了这个触发器函数,就可以用来创建触发器,触发器名是examineeid_updata,在examinee表的UPDATE后触发,也就是行级AFTER触发器,触发器函数是examineeid_up(),所以完整的创建触发器语句就是,下图右
在这里插入图片描述
再比如,如果要建立DELETE触发器,当examinee表中元组被删除后,删除eeexam中相应的考生考试信息
首先创建触发器函数eedele(),BEGIN和END之间的代码如下。这个语句对应删除eeexam表当中相应的考生考试信息,有了这个触发器函数,我们就可以来创建触发器,触发器名字是ee_delete,在examinee表的DELETE后触发,也就是建一个行级AFTER触发器,触发器函数时eedelete(),所以完整的创建触发器的语句如下图右
在这里插入图片描述
定义触发器的事件一旦发生,数据库管理系统就会自动激活触发器
自动激活触发器

  • 语句级before触发器在触发语句开始之前触发
  • 行级before触发器在对特定行进行操作之前触发
  • 行级after触发器在修改由触发SQL语句影响的每一行元组之后触发
  • 语句级after触发器在触发语句结束时触发

通常,用行的after触发器更新其它表,或进行一致性检查。

一个关系表上可以定义多个触发器,同一个表上定义的多个触发器,激活时按照这样一个顺序来执行,若在执行激活触发器的SQL语句之前,先执行这个表上语句级before触发器,然后执行这个表上行级before触发器,在执行激活触发器的SQL语句之后,先执行这个表上的行级after触发器,然后再执行这个表上的语句级after触发器。

对已经存在的触发器,如果不在需要,具有相应权限的用户可以删除它。
删除触发器的语句的格式如下
在这里插入图片描述

第六节 事务

事务是对数据库进行操作的程序单位,具有原子性、一致性、隔离性、持久性。
在这里插入图片描述

  • 一致性:事务一致性指应用程序所定义的事务,其单独成功的执行,必定是使数据库从一个一致性状态变到另一个一致性状态。当多个事务同时对数据库进行更新时,即使每个单独的事务都是正确的,数据的一致性也可能被破坏。
  • 隔离性:事务隔离性指一个事务的执行不能被其他事务干扰。如果数据库系统运行中发生故障,有些事务尚未完成就被迫中断,这些未完成事务对数据库所做的修改,有一部分已经写入数据库,这时数据库就处于一种不正确的状态。
  • 原子性:事务原子性指事务中包含的所有操作要么都做,要么都不做。
  • 持久性:事务持久性指一个事务一旦被提交,它对数据库中数据的改变就应该是持久性的,接下来的其他操作或故障不应该对其执行结果有任何影响。

在这里插入图片描述
ACID特性
在这里插入图片描述
比如,假设考试数据库包括表examroom
在这里插入图片描述
相应的SQL语句非常简单
在这里插入图片描述
UPDATE examinee这一句登记考生座位号
UPDATE examroom这一句登记相应的座位已经被分配

命令的细节不做过多关注,关键是这里的两个更新操作,给考生分配座位的更新座位状态,共同完成一个报考事务,这两个更新要么都生效,要么都不生效。
如果一次偶发事故导致给218811001166分配的座位,比如说是五号座位在examroom表中仍然是空,系统就可能再次将该座位分配给另一个考生,这样就带来实际当中混乱。
在这里插入图片描述
把这些更新组成一个事务,DBMS就会保证如果操作过程中出现了故障,那么所有这些步骤都不会发生效果,也就是说事务是原子的,它的操作要么是全部发生,要么完全不发生,另外,一旦一个事务完成并且得到数据库管理系统的认可,那么它的结果必须被永久地存储,并且不会受此后故障的影响而消失。比如,如果一个考生报考成功,不应该在他报考完后的某一天的一次系统崩溃就导致他的报考信息丢失。

把这两个更新操作组成一个事务,DBMS会保证一个事务所做的所有更新在事务提交时就永
久保存起来,当多个考生并发的进行报考时,每个考生的报考都不应受到其他报考操作的影响。比如,如果两个考生同时查看到room001的0号座位为空,系统把这个座位分配给两个考生的情况不应该发生。

把这些更新组合成一个事务,DBMS会保证并发事务之间相互隔离,也就是互相影响不到对方结果的正确性。

PG用BEGIN和COMMIT(或ROLLBACK)将数据库访问操作指令序列包围起来,以声明一个事务。如果没有显示的BEGIN命令,PG把每个SQL语句当做一个事务来看待。
在这里插入图片描述
PG提供三种独立的事务隔离级别

  • 读已提交READ COMMITTED(默认),在这个隔离级别事务中的语句,看到的是其开始执行时瞬间数据库的一个快照,在同一个事务里两个相邻的SELECT命令可能看到不同的快照,因为其他事务会在第一个SELECT执行期间提交,读已提交提供的这种部分隔离对于许多应用而言就足够,并且这个模式速度快,使用简答。
  • 可重复读REPEATABLE READ,如果一个事务需要连续做若干个命令,而这几个命令必须看到完全相同的数据库视图,可以选择可重复读隔离级别,同一个事务内部后面的SELECT命令总是看到同样的数据。在PG中用SET TRANSACTION ISOLATION LEVEL REPEATABLE READ来设置隔离级别为REPEATABLE READ。
  • 可串行化SERIALIZABLE。REPEATABLE READ和SERIALIZABLE隔离级别事务中的语句,看到的是该事务开始时的快照,而不是该事务内部当前查询开始时的快照,这一点和读已提交不一样。REPEATABLE READ和SERIALIZABLE隔离级别的事务里面的SELECT命令总是看到相同的数据状态。可串行化级别提供最严格的事务隔离,就像事务是一个接着一个那样串行执行似的。
    在这里插入图片描述

第七节 加密

数据加密技术已经广泛应用于因特网、电子商务、手机网络、银行自助取款机等领域。
数据被称为明文,用某种方法伪装数据以隐藏它的内容的过程称为加密。加密所用的方法称作加密算法,数据被加密后的结果被称为密文,把密文还原为明文的过程称为解密,解密所用的算法称为解密算法
在这里插入图片描述
加密就是加密算法利用加密密钥将明文转换为密文,解密就是解密算法利用解密密钥将密文还原为明文,可以看到,加密体系中最核心的是用于加密解密的算法和密钥
在这里插入图片描述
密钥的重要性
现代加密体系中算法通常是公开的,密钥是保密的并且需要向可信权威机构申请,安全性完全取决于密钥的保密性。

加密算法的分类
加密算法一般可分为加密解密密钥相同的对称加密、加密解密密钥不同的非对称加密、单向加密三种。
对称加密体系当中代表性的算法有DES算法、三重DES、AES算法等等。
非对称加密体系当中的代表性算法有RSA算法、DSA算法。
单向加密体系当中的代表性算法有MD5、SHA算法等等。
在这里插入图片描述
pgcrypto扩展包
在PG中使用加密技术,首先需要通过CREATE EXTENSIOIN pgcrypto创建pgcrypto扩展包。
该扩展包包含了当前主流加密解密算法的函数定义。
比如MD6(str)计算str里面给定字符串的MD5的128位校验和,以十六进制返回结果,若参数为null则返回null。
比如我们可以用SELECT MD5(‘43543’),得到对字符串43543的MD5加密结果。
在这里插入图片描述
再如,假设有examiner有两个属性(erid, password),可以使用函数MD5(str)对要插入表中的元组的password进行加密,SQL语句如下
INSERT INTO examiner (erid, password)
VALUES(‘28113699’, MD5(‘82180588’));
然后需要的时候,可以检验保存在变量:pw当中的用户口令是否与数据库当中的匹配,SQL语句如下
SELECT MD5(:pw) = (select password from examiner WHERE erid=’28113699’);
等于号右边是一个子查询

再比如encrypt(‘123456’, ‘key’, ‘aes’),实现用AES算法以字符串key做密钥对’123456’进行对称加密
在这里插入图片描述
decrypt函数可以实现用aes算法以字符串key做密钥,对’123456’的对称加密密文进行解密,还原出’123456’
在这里插入图片描述
其他加密算法的使用方法完全类似。

查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. 程序设计与算法(二):3. 二分算法

    目录 例 查找p 例 查找lowerbound 例 二分法求方程的根 例 找一对数 例 农夫和奶牛 例子源于慕课课程&#xff1a;程序设计与算法二 二分查找&#xff1a;有序、时间复杂度是log(n) 例 查找p int BS(int a[], int size, int p) {int low 0, high size - 1;while (low &l…...

    2024/4/14 9:47:40
  2. 2022-2028年全球与中国智能扬声器行业市场需求预测分析

    本文研究全球与中国市场智能扬声器的发展现状及未来发展趋势&#xff0c;分别从生产和消费的角度分析智能扬声器的主要生产地区、主要消费地区以及主要的生产商。重点分析全球与中国市场的主要厂商产品特点、产品规格、不同规格产品的价格、产量、产值及全球和中国市场主要生产…...

    2024/4/14 9:48:05
  3. javaScript语言学习(二)

    运算符 1.基本运算符 typeof:用来获取一个值的类型以字符串的形式返回 一元运算符 加减乘除 1.1 算术运算符 * / %&#xff08;取余&#xff09; 只需要一个 注意&#xff1a;–true为1 false为0加法&#xff1a;可以合并字符串 值与字符串也会转化为字符串 c c"&quo…...

    2024/4/20 5:42:14
  4. 001 C语言程序设计概念总结(更新ing)

    前言 此笔记主要参考自赵海英老师的C语言课程&#xff0c;此笔记是在考研重新学习C语言的情况下进行的整理&#xff0c;主要用于后续的C语言概念温故知新。 第一章 基础知识 1、数制及转换 四种数制&#xff1a;二进制 十进制 八进制 十六进制 二进制定义&#xff1a;0 1两…...

    2024/4/14 9:48:05
  5. 2022-2028年全球与中国医用级AC-DC电源行业竞争格局与投资战略研究

    本文研究全球与中国市场医用级AC-DC电源的发展现状及未来发展趋势&#xff0c;分别从生产和消费的角度分析医用级AC-DC电源的主要生产地区、主要消费地区以及主要的生产商。重点分析全球与中国市场的主要厂商产品特点、产品规格、不同规格产品的价格、产量、产值及全球和中国市…...

    2024/4/14 9:48:26
  6. 第五天翻译

    https://acs.jxnu.edu.cn/contest/18/board/challenge/B 描述&#xff1a; 看在上帝的份上&#xff0c;你是有腿的箱子&#xff0c;这是你唯一的目的。走到按钮上。你怎么能不做你设计的那件事呢&#xff1f;哦&#xff0c;真有趣&#xff0c;是吗&#xff1f;哦&#xff0c;很…...

    2024/4/28 1:34:15
  7. SpringBoot > 服务注册

    SpringBoot服务注册到Nacos&#xff0c;yml配置 server:port: 81spring:application:name: gym-login # 应用名称datasource:type: com.alibabadruid.pool.DruidDataSource #指定使用的数据源druid:driver-class-name: com.mysql.jdbc.Driver #指定数据源用的驱动url: jdbc:my…...

    2024/4/27 23:20:57
  8. 全球及中国光电传感器行业商业模式分析及投资风险预测2022年版

    本文研究全球与中国市场光电传感器的发展现状及未来发展趋势&#xff0c;分别从生产和消费的角度分析光电传感器的主要生产地区、主要消费地区以及主要的生产商。重点分析全球与中国市场的主要厂商产品特点、产品规格、不同规格产品的价格、产量、产值及全球和中国市场主要生产…...

    2024/4/14 9:48:26
  9. 2022-2028年全球与中国汽车开口模锻件行业产销需求与投资预测分析

    本文研究全球与中国市场汽车开口模锻件的发展现状及未来发展趋势&#xff0c;分别从生产和消费的角度分析汽车开口模锻件的主要生产地区、主要消费地区以及主要的生产商。重点分析全球与中国市场的主要厂商产品特点、产品规格、不同规格产品的价格、产量、产值及全球和中国市场…...

    2024/4/14 9:48:56
  10. 2022-2028年全球与中国盘式电容器行业竞争格局与投资战略研究

    本文研究全球与中国市场盘式电容器的发展现状及未来发展趋势&#xff0c;分别从生产和消费的角度分析盘式电容器的主要生产地区、主要消费地区以及主要的生产商。重点分析全球与中国市场的主要厂商产品特点、产品规格、不同规格产品的价格、产量、产值及全球和中国市场主要生产…...

    2024/4/20 9:15:46
  11. 厂区送货机器人---图论基础

    学习目标&#xff1a; 基本掌握几种重要的图论算法知识&#xff0c;例如Dijkstra、Floyed算法 图论算法知识是为了在实现送货机器人的路径规划时使用 学习内容&#xff1a; 1、 Dijkstra单源非负边权最短路算法 Dijkstra 算法&#xff0c;是由荷兰计算机科学家 Edsger Wybe Di…...

    2024/4/19 9:37:07
  12. 2022-2028年全球与中国应急移动变电站行业深度分析

    本文研究全球与中国市场应急移动变电站的发展现状及未来发展趋势&#xff0c;分别从生产和消费的角度分析应急移动变电站的主要生产地区、主要消费地区以及主要的生产商。重点分析全球与中国市场的主要厂商产品特点、产品规格、不同规格产品的价格、产量、产值及全球和中国市场…...

    2024/4/14 9:48:36
  13. 2022-2028年全球与中国铲运车行业产销需求与投资预测分析

    本文研究全球与中国市场铲运车的发展现状及未来发展趋势&#xff0c;分别从生产和消费的角度分析铲运车的主要生产地区、主要消费地区以及主要的生产商。重点分析全球与中国市场的主要厂商产品特点、产品规格、不同规格产品的价格、产量、产值及全球和中国市场主要生产商的市场…...

    2024/4/7 15:34:37
  14. pyecharts第十节、地图(一、世界地图)

    需要的包 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pyecharts0.5.10 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple echarts-countries-pypkg pip install -i https://pypi.tuna.tsinghua.edu.cn/simple echarts-china-provinces-pypkg pip inst…...

    2024/4/21 14:57:09
  15. 《设计模式》— 行为型模式 — 解释器模式

    《设计模式》— 行为型模式 — 解释器模式一、动机二、适用性三、结构四、参与者1、AbstractExpression2、TerminalExpression&#xff08;终结符表达式&#xff09;3、NonterminalExpression&#xff08;非终结符表达式&#xff09;4、Context5、Client五、效果1、易于改变和扩…...

    2024/4/20 17:33:51
  16. 2022-2028年全球及中国红外(IR)传感器行业投资前景分析

    本文研究全球与中国市场红外&#xff08;IR&#xff09;传感器的发展现状及未来发展趋势&#xff0c;分别从生产和消费的角度分析红外&#xff08;IR&#xff09;传感器的主要生产地区、主要消费地区以及主要的生产商。重点分析全球与中国市场的主要厂商产品特点、产品规格、不…...

    2024/4/5 4:38:53
  17. 重读经典:《Masked Autoencoders Are Scalable Vision Learners》

    MAE 论文逐段精读【论文精读】...

    2024/4/14 9:48:56
  18. 软件系统架构师如何不知不觉搞垮公司

    之前我在视频里讲了架构师搞垮公司的技巧&#xff0c;获得了几百万次的播放&#xff0c;得到了大家的热烈反响&#xff0c;收到了很多朋友的留言和私信&#xff0c;很多朋友表示这种反讽式教学方法非常好&#xff0c;既有趣又生动&#xff0c;非常容易记住。 今天我综合整理了…...

    2024/4/14 9:48:46
  19. 2022-2028年全球及中国手机功率放大器行业投资前景分析

    本文研究全球与中国市场手机功率放大器的发展现状及未来发展趋势&#xff0c;分别从生产和消费的角度分析手机功率放大器的主要生产地区、主要消费地区以及主要的生产商。重点分析全球与中国市场的主要厂商产品特点、产品规格、不同规格产品的价格、产量、产值及全球和中国市场…...

    2024/4/18 16:00:15
  20. 条件查询练习题

    --基础题 1.查询20号部门的员工姓名、岗位、薪资 SELECT ENAME,JOB,SAL/*,DEPTNO*/ FROM EMP WHERE DEPTNO 20; 2.查询工资超过3000的员工的姓名、薪资 SELECT ENAME,SAL FROM EMP WHERE SAL >3000; 3.查询10号部门以外的员工的所有信息 SELECT * FROM EMP WHERE DE…...

    2024/4/19 16:13:54

最新文章

  1. 香港BTC、ETH现货ETF同时通过,对行业意义几何?

    香港比美国更快一步通过以太坊现货 ETF。 2024 年 4 月 15 日&#xff0c;香港嘉实国际资产管理有限公司&#xff08;Harvest Global Investments&#xff09;今天宣布&#xff0c;得到香港证监会的原则上批准&#xff0c;将推出两大数字资产&#xff08;比特币及以太坊&#…...

    2024/4/28 4:08:43
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. MATLAB 自定义中值滤波(54)

    MATLAB 自定义中值滤波(54) 一、算法介绍二、算法实现1.原理2.代码一、算法介绍 中值滤波,是一种常见的点云平滑算法,改善原始点云的数据质量问题,MATLAB自带的工具似乎不太友好,这里提供自定义实现的点云中值滤波算法,具体效果如下所示: 中值滤波前: 中值滤波后:…...

    2024/4/27 7:14:52
  4. 第十四届蓝桥杯(八题C++ 题目+代码+注解)

    目录 题目一&#xff08;日期统计 纯暴力&#xff09;&#xff1a; 代码&#xff1a; 题目二&#xff08;01串的熵 模拟&#xff09;&#xff1a; 代码&#xff1a; 题目三&#xff08;治炼金属&#xff09;&#xff1a; 代码&#xff1a; 题目四&#xff08;飞机降落 深度…...

    2024/4/26 13:48:45
  5. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/4/26 18:09:39
  6. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/4/28 3:28:32
  7. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/4/26 23:05:52
  8. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/4/27 4:00:35
  9. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/4/27 17:58:04
  10. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/4/27 14:22:49
  11. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/4/28 1:28:33
  12. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/4/27 9:01:45
  13. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/4/27 17:59:30
  14. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/4/25 18:39:16
  15. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/4/28 1:34:08
  16. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/4/26 19:03:37
  17. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/4/28 1:22:35
  18. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/4/25 18:39:14
  19. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/4/26 23:04:58
  20. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/4/27 23:24:42
  21. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/4/25 18:39:00
  22. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/4/26 19:46:12
  23. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/4/27 11:43:08
  24. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/4/27 8:32:30
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57