绪论
数据库系统概述
-研究问题:存储数据、高效获取处理数据、安全共享数据
-信息与数据:信息-被加工为特定形式的数据,有意义;数据-事务的符号记录(文字、图像、声音等——数据形式——信息不随数据形式不同而改变),语义,数据的解释;数据是信息的具体表现形式
-数据库与数据库系统:数据库DB-长期存储在计算机内、有组织、可共享的数据集合,一定数据模型、较小冗余度、较高数据独立性、易扩展性、共享;数据库管理系统DBMS-位于用户与操作系统之间的一层数据管理软件,功能-数据定义DDL(create table alter table drop table drop database)、数据操纵DML(insert into values update set where delete from where、数据查询DQL(select where from)、数据控制DCL(grant revoke);数据库系统DBS-计算机系统中引入数据库后构成的系统集合,包括数据库、数据库管理系统及其开发工具、应用系统、数据库管理员DBA、用户
-数据管理技术的发展:数据处理-收集存储加工传播,获取信息做决策;数据管理-分类组织编码存储检索维护,是数据处理的中心问题;数据管理技术经理三阶段-人工管理(数据不保存、不共享、不具有独立性、应用程序管理数据)、文件系统(数据可长期保存、共享性差冗余度高、独立性差、文件系统管理数据、编写应用程序生产率不高、文件之间数据孤立、不支持并发访问)、数据库系统(数据一体化结构化——结构化是数据库系统与文件系统最根本的区别,数据按照某种数据模型组织,不仅文件内部数据彼此相关文件之间在结构上也有机联系在一起,描述数据本身+数据联系,数据库结构是面向全组织的复杂结构;数据共享性高、冗余度低、易扩充;数据独立性高——物理独立性、逻辑独立性;数据由DBMS统一控制和管理,提供更好的安全和保护——数据安全性保护、完整性检查、并发控制、数据库恢复)
-数据模型:现实数据特征的抽象,描述数据、数据联系、数据语义、一致性约束的概念工具的集合;数据模型分类-概念模型/信息模型(描述信息世界,按用户概念观点对数据和信息建模,独立于具体计算机系统和DBMS,用户数据库设计)、逻辑模型(按照计算机系统的观点对数据建模,用于DBMS的实现)、物理模型(描述数据在系统内部的表示方式和存取方法以及在物理存储介质上的组织结构和存取方法)
-实体联系模型ER模型-概念模型设计方法:er模型基本概念及表示-实体(客观存在并可相互区分的事物)、属性(实体所具有的某一特性)、联系(实体(型)内部联系-组成实体的各属性之间存在的联系;实体(型)之间的联系-不同实体集之间的联系-ER模型主要讨论实体间联系)
域:属性取值范围 键/码:唯一标识实体的属性集 实体型:具有相同属性的实体必然具有相同的特征和性质 实体集:同型实体组成的集合
er图:矩形-实体;椭圆-属性(键-下划线);菱形-联系;联系类型
联系类型:一对一(1:1);一对多(1:n)A中每一个实体B中有n个实体与之联系,B中每个实体A中有唯一实体与之联系;多对多(m:n)A中每一个实体B中有n个实体与之联系,B中每个实体A中有n个实体与之对应。
两个以上实体间和单个实体内的联系:供应商项目零件mnp,一个供应商可以供给给多个项目多种零件,每个项目可以使用不同供应商供应的零件,每种零件可有不同供应商供给
——逻辑模型:按照数据的组织方式描述信息,通常所说数据模型指的就是逻辑模型
-数据模型的组成要素:概念集合,用于描述数据、数据联系、数据语义、一致性约束-描述了系统的静态特性、 动态特性和完整性约束条件-与之相对应数据模型包含数据结构(静态特性)、数据操作(动态特性,查询更新 定义其确切含义、操作规则、数据操作语言DML)和完整性定义(数据模型中数据及其联系满足的制约和依存规则)三要素
——关系数据模型概述:层次模型 网状模型 关系模型 面向对象模型 对象关系模型
-关系数据模型的数据结构:逻辑结构上是一张二维表,一张二维表就是一个关系
关系-二维表 元组-表中一行为一个元组 属性-表中一列 域 分量-元组中一个属性的值 键/码 关系模式-二维表表头结构,关系名(属性1,属性2,。。。属性n)
-用关系表示概念模型:实体及实体间联系都可以用关系(二维表,eg学生选课的关系通过sc(学号,课程号,成绩)来表示)来表示
-规范化:每一个分量都是不可再分的数据项,表中不能再有表
-关系数据模型的数据操作和完整性约束:数据操作增删改查,操作对象元组的集合,访问数据时把存取路径向用户隐藏,完整性约束包括实体完整性、参照完整性、用户定义的完整性
-关系模型优缺点:优点-单一数据结构,数据独立性用户生产率高,数学概念数学理论依据;缺点-存取路径对用户透明查询效率低,系统要对用户提出的查询进行优化,增加研制开发DBMS难度
——数据库系统组成及其结构:数据库、硬件系统(存储和运行数据库系统的硬件设备,cpu、内存、大容量辅存、备份设备)、软件系统(DBMS数据库管理系统、OS操作系统、应用开发工具、应用系统-方便用户使用数据库提供接口和数据表示-过程-用户通过应用系统提供的接口提出数据访问请求,应用系统将用户的请求经过分析、处理后形成DBMS所支持的数据定义或操作请求并将其传递给与应用系统建立连接的DBMS,DBMS执行相应的数据访问操作并将结果返回给应用系统,应用系统对DBMS返回的结果和信息进行数据表示并将其以直观的方式呈现给用户)、人员(数据库管理员DBA-数据库中信息内容和结构、存储结构和存取策略、安全性要求和完整性约束条件、监督和控制数据库运行、数据库改进和重组重构,数据库设计人员-数据、结构,最终用户-偶然用户、简单用户、复杂用户,系统分析员SA-确定最终用户需求、需求分析规范说明、软硬件配置、数据库系统概要设计,应用程序员-编写数据库应用程序提供数据访问接口)
——数据库系统的三级模式结构:从应用程序(用户)-集中式、客户/服务器C/S;从数据库管理系统-面向用户或应用程序员的用户级(对应外模式)、面向建立和维护数据库人员的概念级(对应模式)、面向系统程序员的物理级(对应内模式)
-模式和实例:型(对某一类数据的结构和属性说明)和值(型的一个具体赋值);同一个模式可以有多个实例;模式相对稳定实例相对变化;模式反映数据结构及联系,实例反映数据库某一时刻状态
-三级模式:外模式/子模式(应用程序员、最终用户能够看见使用的局部数据逻辑结构和特征 单个用户视图) 模式(逻辑模式或概念模式,全体数据的逻辑结构和特征 所有用户公共视图) 内模式(存储模式或物理模式,数据物理结构存储方式,数据在数据库内部的表示方式 一个数据库只有一个内模式)
-二级映像:外模式/模式间映像(对应关系通常包含在各自外模式的描述中,保证数据逻辑独立性) 模式/内模式间映像(对应关系通常包含在模式的描述中,保证数据物理独立性)
——应用程序的体系结构(用户通过数据库应用系统提供的接口使用数据库):集中式结构 分布式结构 客户/服务器结构C/S 并行结构
数据库系统通常包含两个部分:服务器(也称后端)、客户机(也称前端)
-客户/服务器结构C/S:后端服务器运行某个DBMS(数据库服务器)为客户机上的应用程序提供数据服务
两层C/S结构:客户机-负责页面的描述和显示、业务逻辑和计算、向服务器发出请求并分析从服务器接收的数据;服务器-数据管理和程序处理、响应客户请求并将处理结果返回给客户机
三层C/S结构:客户机-负责页面的描述和显示、与应用服务器进行通信,不再包含直接的数据请求和业务逻辑;应用服务器-负责应用程序的业务逻辑及与数据库服务器和客户机进行通信;数据库服务器-接收请求响应,数据库管理处理
C/S结构优点:交互性强 具有安全的存取模式 网络通信量低 响应速度快
C/S结构缺点:需在客户机安装客户端程序,分布功能弱,不能快速部署安装和配置 缺少通用性,业务变更需重新设计和开发,增加维护和管理难度,进一步业务扩展困难
-浏览器/服务器结构B/S
B/S结构:浏览器 web服务器-数据请求加工结果返回动态网页生成、对数据库的访问和应用程序的执行 数据库服务器;应用程序只需安装在web服务器一台服务器上,用户连接互联网安装浏览器软件即可访问数据库;数据访问基本过程:用户浏览器通过页面形式向web服务器发送请求,web服务器接收用户请求按照特定的方式将请求发送给数据库服务器,数据库服务器执行请求以页面形式返回结果给用户的浏览器
优点:维护和升级方式简单 异地浏览和信息采集灵活性好
缺点:数据安全性问题 对服务器要求较高 数据传输速度慢 软件个性化特点降低
B/S C/S结构比较:B/S互联网、维护工作量;B/S运行速度、数据安全、人机交互
关系数据库
——关系数据结构及形式化定义
-关系形式化定义
域Di 笛卡尔积D1xD2x…xDn 元组/n元组 分量 基数=Di基数的乘积
关系-笛卡尔积的子集R(D1,D2,…,Dn)R关系名字,n关系目或度(n=1,单元关系;n=2,二元关系)元组t
一行为一个元组,通常表示一个现实世界具体事物;一列为同一数据类型来自同一个域;不同列可出自同一个域-区分-列名-属性-不同列有不同属性名,描述某个事物具体特征
码(候选键/候选码/键/码-唯一标识一个元组(实体);主码-根据需要选定其一;主属性-出现在候选码中的属性;非主属性/非键属性-不出现在任何候选码中的属性;候选键可能包含多个属性,使用所有属性组成关系的候选码?主码-全码 )
关系的性质:关系类型-基本表(实际存储表,实际存储数据的逻辑表示)、查询表(查询结果对应表)、视图表(基本表或其他视图导出来的表,不实际存储对应的数据,虚表)
基本关系性质:任意两个元组不能完全相同;元组顺序可任意交换;属性的顺序可任意交换;列同质-属性值同一数据类型来自同一个域;不同列可以来自同一个域但属性名必须唯一;每一分量必须是不可分的数据项
-关系模式与关系数据库
关系模式与关系:关系模式-关系的描述,包含关系名、属性、属性来自的域、属性到域的映像、属性间的数据依赖关系 R(A1,A2,…,An);关系是关系模型在某一时刻对应的实例是一个元组的集合
关系数据库:数据库模式-关系数据库的描述,通常由若干关系模式组成;关系数据库-数据库模式在某一时刻对应的实例,由组成该数据库的所有关系模式在某一时刻对应的关系组成
——关系操作
-基本关系操作
关系操作特点-集合操作,操作对象和结果都是元组的集合
常见关系操作-查询 插入 删除 修改-查询 更新
关系代数-关系运算查询-选择 投影 并 差 笛卡尔积(基本操作) 除 交=R-(R-S) 连接(引入交 连接 除不能增加关系代数表达能力,但能简化其表达)
关系演算-谓词查询-结合算术运算符、逻辑运算符、量词;根据谓词变元不同分为元组关系演算、域关系演算
关系代数、元组关系演算、域关系演算在表达能力上是等价的
-关系数据语言分类:关系代数语言ISBL、关系演算语言(元组ALPHA 域QBE)、具有关系代数演算双重特点的语言SQL
——关系的完整性约束
实体完整性-对主属性取值的约束:所有主属性不能为空;实体完整性针对基本关系
参照完整性-一个关系某些属性的取值需要参照其他关系某些属性值-外键 参照关系R-从表、外键表 被参照关系/目标关系S-主表、主键表(通常是一对多联系):外键不一定是被参照关系的主键,满足唯一性约束即可;属性f是R的外键,则R中每个元组在f上的值必须或空或S中某个元组的主码值
用户定义完整性:静态约束 动态约束
-完整性规则的处理:完整性规则定义 完整性检查 违约处理(实体完整性违约处理-更新主键重复拒绝该更新操作;参照完整性违约处理-插入操作(向被参照表插入数据,无需考虑参照完整性;向参照表插入元组,违反,拒绝)、删除(删除参照,无需;删除被参照,限制删除/级联删除/置空值/置默认值)、修改(修改参照,违反,拒绝;修改被参照,违反,限制更新/级联更新/置空值/置默认值)-级联,修改参照,被参照表保持与参照表的一致性
——关系代数
传统集合运算:并 差 交 笛卡尔积;专门关系运算:选择 投影 连接 除
操作对象 结果都关系(笛卡尔积子集)
-关系代数的运算符:集合运算符 专门的关系运算符 算术比较符 逻辑运算符
并:属于R或属于S的元组构成的关系;差:属于R但不属于S;交:属于R且属于S
并差交运算要求两个关系的属性个数相同,且对应的属性取自同一个域
笛卡尔积:R中每个元组依次与S中每个元组进行元组连接得到的元组集合(tr反Uts 元组连接,是n+m列的元组)
R(A1,A2,…,An),t属于R表示t是R的一个元组,t[Ai]表示元组t中相对应于属性Ai的一个分量,A={Ai1,Ai2,…,Aik}是(A1,…,An)的一部分-属性列/域列,t[A]元组t在属性列A上诸分量的集合,象集-Zx-属性组X上取值为x的诸元组在属性组Z上的取值的集合
选择/限制:选择满足给定条件的诸元组
投影:选择若干属性列组成新的关系-去除重复行
连接:θ连接,从两个关系的笛卡尔积中选取属性间满足一定条件的元组
R中属性组A上的取值与S中属性组B上的取值满足θ条件的元组进行元组连接组成的关系
等值连接:θ为‘=’;从两个关系的笛卡尔积中选取属性组A和B上取值相等的元组
自然连接:两个关系中进行比较的分量是相同的属性组,去掉重复属性列(其他连接都不去除任何属性列)
内连接:连接运算时,元组不满足连接条件被舍弃;外连接:将舍弃元组也保留在连接结果中在其他属性上填上空值Null;左外连接:只保留左边关系中不满足连接条件;右外连接:只保留右边关系;全连接:保留两边关系
除:R(X,Y) S(Y,Z),R中的Y与S中的Y可以由不同的属性名但必须出自相同的域集
RS共同属性BC,找R中不相同属性关于相同属性的象集;找S中相同属性的投影;S中投影在R中象集的不相同属性为结构
sno,cno/cno 剩下的是sno S中与R共同属性的属性值都在R中的元组,取不相同属性
关系数据库标准语言SQL
——SQL语言概况
Sql语言特点:综合统一 高度非过程化 面向集合的操作方式 灵活使用方式(命令交互方式、嵌入式sql)语言简洁易学易用
查询 select 定义 create drop alter 操作 insert update delete 控制grant revoke
SQL操作对象:基本表 视图
一个或几个基本表对应一个存储文件,还可以带若干索引文件,所有存储文件索引文件构成关系数据库内模式;视图对应数据存储在导出该视图的基本表所对应的存储文件中,数据库只存储视图的定义,使用时根据用户的数据访问请求结合视图的定义对相应的基本表进行存取
——Sql server概述:数据库管理系统 启动-配置管理器、windows管理工具服务、管理工作室 系统数据库-master(系统级信息)、model(模板,修改模板之后创建数据库都继承这些修改)、msdb(计划报警、作业调度)、tempdb
-数据库创建与维护
创建-对象资源管理器;T-SQL语句
修改-对象资源管理器;T-SQL语句
使用USE命令切换当前数据库-use dname
数据库更名-对象资源管理器、存储过程 【】是可有可无
删除数据库-对象资源管理器、T-SQL
-数据库分离与附加 附加-选择目录中必须包含创建数据库的所有文件(数据文件、日志文件)
-表的创建(对象资源管理器、sql语句)及数据录入
——数据定义
基本表 视图 索引的创建、删除、修改
-创建
基本表名称、表中属性、数据类型、完整性约束-列级、表级(放在该表最后一列定义之后,对整个表进行约束),有些约束既可是列级约束又可是表级约束;
默认值约束default
Constraint为约束指定唯一约束名,不需指定可以省略,系统自动命名
非空值(当前不知道不确定无法填入,不是0或空白符)约束not null
唯一性约束unique:可列级,可表级(约束多个列的组合-指定列名表)
主键约束primary key:可列级,可表级(约束多个列的组合-指定列名表)
主键约束、唯一性约束区别:一表只有一个主键约束可多个唯一性约束;主键中任何列都不允许空值唯一性约束没有此限制
外键约束foreign key:外键为空或引用表的某主键或唯一性键值;可列级,可表级
on
delete/on update违反参照完整性的处理策略:noaction限制、cascade级联、setnull置空
检查约束check:限定某列取值范围或与其他列的关系;条件表达式由列名、sql支持的运算符、函数等构成的逻辑表达式;可作列级,可作表级,列级只能由一个check约束但可用逻辑运算符and or构成复合条件
-修改和删除
修改Alert table增加列和完整性约束、修改列的定义及删除列和完整性约束
增加完整性约束alter table 名 add default ‘男‘ for Ssex
删除基本表drop table 基本表删除后在其之上定义的索引被删除,定义的视图不会被删除但无法使用
索引:记录/元组的索引关键字的值与该记录的存储地址的对应表;可在单列、多列(复合索引)上建;聚簇索引clustered( 索引项的顺序与表中记录的物理顺序一致且表中数据与索引一同存储)唯一索引unique(每个索引项只对应唯一数据记录,索引关键字的值不重复);升序ASC,降序DESC;一列 多列-各列逗号分隔
建索引:
删除索引:索引建立,数据更新,系统对索引文件维护,影响数据更新性能;不用,立即删除
——数据查询 select(对应投影) from where(对应选择)group by(将查询结果按照指定的分组依据列或表达式值相同的为一组进行分组)having(限定组应该满足的条件)order by(按照该子句所指定列进行升序或降序排列)
-单表查询
指定列 全部列 查询经过计算的值(select子句中目标列表达式变为表达式)为目标列表达式起别名
消除重复行 select distinct sno; 查询满足条件的元组(比较大小,确定范围【not】between and 确定集合【not】in(‘’,‘’,‘’) 字符匹配【not】like 空值is 【not】null 多重条件/逻辑运算符and or-or可以实现in运算)
字符匹配:只知道查询内容的一部分
'DB\_Design'escape ‘\’表示\后边的_不是通配符
对查询结果排序order by asc desc
定额查询
使用聚集函数统计数据,聚集函数不能嵌套
元组个数
<->一列值的个数
对查询结果分组group by having分完组后聚集函数对每组进行运算;聚集函数之外的表达式必须在组内 起别名后,排序可以用别名(排序是对得到结果进行显示的),其余的操作不能用别名
-连接查询:内连接 外连接 交叉连接(不提)
自身连接 整个副本,起别名,起别名后,在查询中任何地方都使用该别名而不使用原来表名
内连接:
连接条件:等值连接非等值连接= 复合连接条件and or
外连接:左外 右外 全
-嵌套查询:执行过程由内向外,子查询的结果用来表达父查询的中间结果并非最终结果不能使用orderby
扫描一个父查询看其是否在子查询 子查询不需要去除重复、排序等 in类似自连接 not in类似差运算
带有in谓词的嵌套查询
带有比较运算符的嵌套查询
带有any all谓词的嵌套查询
相关与不相关嵌套查询
带有【not】exists谓词的嵌套查询
-集合查询 并union 交intersect 差except
-基于派生表的查询
——数据更新
-插入数据insert
-修改数据update
-删除数据delete
--数据更新:插入、修改、删除 insert update,与alter区分 delete删除一行,与drop区分 ——维护数据变化 增删改
--插入:插入单元组 多元组 insert into 表名 属性列 values 值 值与属性列一一对应;属性列可省,默认按照定义时的次序一一对应给出赋值
--将一个新学生记录插入student,看给的次序与定义的是否一致 想省只能按其顺序来,有些值不想给要用空值等填充
insert
into student
values('201215128','陈东',18,'男','IS');
--插入一条选课记录(‘201515128’,'1')
insert into SC(sno,cno)
values('201215128','050602');
insert into SC
values('0905010202','050601',null);
--插入子查询结果 insert into 表名 列名 子查询
--对每个系求平均年龄,结果存入数据库 建一个表,存表里
create table deptage(sdept char(15),avgage smallint);
insert into deptage(sdept,avgage)
select sdept,avg(sage)
from student
group by sdept;
--修改数据 update 表名 set 列名=表达式 where 条件 修改指定表中满足where子句指定条件的元组 set可以同时更新多列‘,’隔开;一旦省略where整表更新,慎重
--修改某一元组
--201215121年龄改为22
update student
set sage=22
where sno='201215121'
--修改多个元组
update student
set sage=sage+1;
--带子查询的修改
--将计算机科学系全体学生成绩置零 扫描一行sc,当sc对应一行sc查student的sdept=cs,置零
update sc
set grade=0
where 'CS'= (
select sdept
from student
where student.sno=sc.sno);
update sc
set grade=0
where sno in (
select sno
from student
where sdept='CS');
--update表名set后可加from set修改值来自其他表
--删除数据 delete from 表名 where 条件 整行删除;where可省,慎重
--删除学号2012050128学生记录
delete
from student
where sno='201215128';
--带子查询
--删除计算机科学系所有学生选课记录
delete
from sc
where sno in (
select sno
from student
where sdept='CS');
delete
from sc
where 'CS'= (
select sdept
from student
where student.sno=sc.sno);
——视图
-创建视图
-删除视图
-查询视图
-更新视图
-视图的作用
表的修改与删除
索引:有序,查找便利,更新代价 唯一索引(主键 一对一)聚簇索引(索引项顺序与表中记录的物理顺序一致,更快,一表只有一个 维护代价更高,不但要移索引文件还要移动数据文件)定义主键、唯一性键有时自动会给他建索引
大数据量 高运发场景 时延低 更新要求不高的
创建索引:CLUDTERED聚簇ASC升序 DESC降序 默认升序
删除索引:索引作为全局对象,DROP INDEX 索引名x,要加‘ON 表‘或者‘表.索引名‘
--注释
字符集:ASCII GBK(汉字内码 GBK兼容ASCII码——一个1字节一个2字节如何区分?——汉字第一个字节第一位为1) Unicode(统一码 容纳世界所有文字符号的字符集)——UTF-32(4个字节表示一个字符 能表示字符多;但占存储空间且通信效率变低)、UTF-8(采取可变长编码方案,共分四个长度区:1、2、3、4个字节 英文、数字只占一个字节-兼容ASCII,汉字占3个字节——解码如何区分——编码方式:ASCII码不变第一位0,从高位到低位,2字节第一个字节前三位110第二个字节前两位10,3字节第一个字节前四位1110第二三个字节前两位10,4字节第一个字节前五位11110第二三四位前两位10,其余位放数)
注意:编码解码使用的字符集保持一致,否则出现乱码;英文、数字一般不会乱码,兼容ASCII 编码:把字符按照指定字符集编码成字节 解码:字节->字符
MySQL:DDL数据定义语言 DML数据操作语言 DQL数据查询语言 DCL数据控制语言(创建用户,控制用户访问权限) TCL事物控制语言 维护
数据库语言与高级语言:一条数据库语言语句相当于高级语言的一个或多个循环程序
数据库语言可以嵌入到高级语言(宿主语言)中使用
数据库系统的结构抽象和演变
难点与重点:
- 三级模式两层映像,物理独立性和逻辑独立性
- 数据->模式->数据模型
- 网状/层次模型->关系模型->OO数据模型
DBMS管理数据的三个层次:外部层次/用户层次——某一用户能够看到与处理的数据,全局数据的某一部分;概念层次/逻辑层次——从全局角度理解/管理的数据,含相关的关联约束;内部层次/物理层次——存储在介质上的数据,含存储路径、存储方式、索引方式等
数据 与 模式——数据的结构:数据/视图——某一种表现形式下表现出来的数据库中的数据;模式——对数据库中数据所进行的一种结构性的描述,所观察到数据的结构信息
模式 与 数据模型——模式的结构:数据模型——规定模式统一描述方法的模型,包括数据结构、操作和约束,数据模型是对模式本身结构的抽象,模式是对数据本身结构形式的抽象(数据的结构的结构——数据模型)
三级模式:外模式——。。。。。。的数据描述 概念模式——。。。。。。的数据描述 内模式——。。
两层映像:E-C映像——将外模式映射为概念模式,从而支持实现数据概念视图向外部视图的转换,方便用户观察和使用;C-I映像——将概念模式映射为内模式,从而支持实现数据概念视图向内部视图的转换,便于计算机进行存储和处理
开发应用程序时,不是基于全局视图开发,而是基于某一个外部视图开发——为什么要按照标准结构进行数据库系统的抽象?——两个独立性
逻辑数据独立性:当概念模式变化时,可以不改变外部模式(只需改变E-C映射),从而无需改变应用程序
物理数据独立性:当内部模式变化时,可以不改变概念模式(只需改变C-I映射),从而不改变外部模式
三大经典数据模型:关系模型:表 层次模型:树 网状模型:图
层次与网状数据间关联关系由复杂的指针系统来维系,结构描述复杂;数据检索操作依赖于由指针系统指示的路径;逐一记录的操作,不能有效支持记录集合的操作
关系模型数据检索操作不依赖于路径信息或过程信息,支持非过程化的数据操作;有效支持记录集合的操作;较为完善理论基础(消除了指针)
文件——数据库
文件系统:数据存取基本以记录为单位
优点:用户/程序不必考虑文件存储的物理细节,解脱了对物理设备存取复杂性处理的负担
不足:数据与程序紧密结合,数据的组织及语义紧密依赖于处理该文件的应用程序,数据结构发生改变则必须修改应用程序,文件之间无联系,文件的记录之间无联系,共享性差,冗余度大,不一致性高
数据库系统:数据存取可以记录为单位,也可以数据项和记录集合为单位
优点:统一的数据控制功能,数据共享程度高;程序可自动检查安全性、完整性和并发正确性;整体数据结构化,文件之间、记录之间相互有关联,数据的冗余度小,易扩充;独立于应用程序的高效率查询/统计操作
层次、网状——关系模型
关系数据库——对象关系数据库——面向对象数据库
关系数据库:按行按列形式组织数据——关系第一范式(数据项的不可再分特性);关系运算;关系数据库设计理论
对象-关系数据库:引入行对象、列对象(结构对象——复合属性对应的 聚集对象——集合),以对象来封装需分解的数据项,可有效支持不满足关系第一范式的数据项
面向对象数据库:支持面向对象的一些特性——类、继承、封装、多态等;支持复杂的数据类型——数据封装和抽象数据结构;面向对象技术(O-O)与集合/聚集操作技术SQL的结合
XML数据库:数据库一种形式,半结构化数据库;数据与数据语义(标记语言 web那种的 尖括号<>元素</>)合并在一起进行存储和处理;面向数据交换提出,在互联网世界得到广泛应用
多种多样数据库——多数据库开放式互连
应用程序DBAP通过接口ODBC与DBMS进行交互
普通数据库——与各种先进技术结合所形成的新型数据库
关系模型之基本概念
关系模型三要素:基本结构 基本操作 完整性约束——实体完整性、参照完整性、用户自定义完整性
关系运算:
关系代数 ——基于集合的运算,操作对象及结果都是集合
基于关系代数设计的数据库语言ISBL——用计算机可识别的符号表征关系的运算符号
关系演算——元组演算、域演算
元组演算——基于逻辑的运算
基于元组演算设计的数据库语言QUEL——用计算机可识别的符号表征元组演算的运算符号
域演算——基于示例的运算
基于域演算设计的数据库语言示例QBE
表的基本构成要素
关系/表 列/字段/属性/数据项 标题/模式 行/元组/记录
域——列取值范围 域的基数——域中元素个数
笛卡尔积——n个域所有可能形成的元组,笛卡尔积每个元素称为一个n-元组
D1xD2……Dn={(d1,d2……dn)|di属于Di} 分量——di 笛卡尔积基数:m1xm2……mn
关系——一组域的笛卡尔积的子集,具有某方面意义的元组;由于关系不同列可能来自同一个域,需要为每一列起一个属性名(区分属性名、域名)
关系模式/表标题——R(A1:D1,……An:Dn)简记R(A1,……An) 关系的度/目n:属性个数
关系模式与关系:同一关系模式下,可有多个关系;关系模式是关系的结构,关系是关系模式在某一时刻的数据;关系模式是稳定的,关系是某一时刻的值,是随时间可能变化的
关系的特性
列是同质的:每列的分量来自同一个域,是统一数据类型
不同的列可以来自同一个域,称其中每一列为属性,不同的属性要给不同的属性名
行列互换性:区分行列不靠其位置,而是其列名-行、某一或几列的值-行(关键字/码)
任意两个元组不能完全相同(关系)现实应用中,表table不全遵守该特性(表跟关系有细微差别)
属性不可再分:关系第一范式
关系重要概念
——候选码/候选键 唯一标识一个元组;关系中有很多候选码,有时——选取一个作为主码/主键
——主属性:包含在任何一个候选码中的属性 非主属性:其余 全码:所有属性构成该关系候选码
——外码/外键 不是该关系候选码,是与另一个关系候选码对应;两个关系通常通过外码连接
关系与表对应
域:值的集合,从每个域中取一个元素构成元组,取遍域中元素得到所有可能元组构成笛卡尔积,有意义的元组形成关系 元组对应行,列的范围对应域
关系模型完整性
——实体完整性(主码):关系的主码中的属性值不能为空值(不知道或无意义的值),若为空无法唯一标识
——参照完整性(外码):可以取空值,但若不取空值则其域必然是其作为主码的表的域,确保两个有关联表的一致性
——用户自定义完整性
关系结构:关系;关系操作:交并差等
关系模型之关系代数——基于集合查询
关系代数操作:集合操作、纯关系操作
并相容性:参与运算的两个关系及其相关属性之间有一定的对应性、可比性或意义关联性;两个关系属性数目相同;第i个属性的域相同
基本操作
——并(合并时去掉重复元组 。。。之一,或者。。。或者) 交 差(是。。。但不含)广义笛卡尔积(涉及到多个表串接检索)选择(运算符优先级:()、非、交、并)投影
扩展操作
——交(可通过差运算实现,R-(R-S)=S-(S-R) 既又)
——θ连接:R与S笛卡尔积中选取R中属性A与S中属性B满足θ条件的元组
属性AB有可比性
θ是比较运算符,> >= < <= = !=
θ连接操作=两表广义笛卡尔积+选择满足θ条件的+投影要的属性
——关系与自身的θ连接:
自连接涉及更名操作
讲解时,使用笛卡尔积后再进行选择,但DBMS可直接进行连接操作,不必先形成笛卡尔积
——等值连接:特殊的θ连接操作,θ为=
——自然连接:R和S的笛卡尔积中选取相同属性组B上值相等的元组
特殊等值连接;RS属性相同,值相等才能连接;要在结果中去掉重复的属性列(R.Bi=S.Bi,只保留一列)—自然连接后的度数与笛卡尔积得到的可能不同
自然连接=笛卡尔积+选择再相同列上值相同的元组+去掉重复列+投影
笛卡尔积与连接的区别:多一个连接条件
不可以,虽然语法看起来对,但语义不对
选择操作是对记录做条件满足判断,无法既是001又是002,其结果为空
使用自连接,更名
使用自然连接,删掉了重复的部分,仍未空值,与交相同
或者使用交运算
第一个:很多学生对应很多课程,通过选择筛选几乎要显示所有学生,除了只选了一门课且不是
002的
第二个:S与S⋈B并相容性不满足
书写关系代数思维:
检索是否涉及多个表,不涉及直接使用并差交选择与投影;涉及检查能否使用自然连接,不能看能否使用等值或θ连接,还不能使用广义笛卡尔积;连接完后使用选择投影等操作——选投连
复杂扩展操作——除(查询。。。全部的)
R÷S前提条件:当且仅当S的属性集是R属性集的真子集
定义:属性k=n-m 元组R÷S与S笛卡尔积形成的元组都必须在R中
复杂扩展操作——外连接:避免找不到匹配的元组信息丢失,假定存在全为空值
左外连接 右外连接 全外连接
关系模型之关系演算——基于逻辑查询
按照谓词变量不同,分为关系元组演算(谓词变量为元组变量)、关系域演算(域变量)
C-常量
θ-比较运算符
存在量词、全称量词 约束变量、自由变量
元组演算等价性变换
DDL:Create Alter Drop 建立修改撤销
创建数据库 create database 数据库名;
创建表(定义关系模式)create table 表名(列名 数据类型 完整性约束,。。。,。。。);
Primary key主键约束,只能有一个;Unique 唯一性约束(候选键),可以有多个;Not null非空约束
数据类型:char(n)、varchar(n)、int、numeric(p,q)、real、date、time
和高级语言的数据类型总体一致,但也有些差异
定义Table完整性约束
定义View外模式及E-C映像
定义Index、Tablespace等物理存储参数
上述各种定义的撤销域修正
通常由DBA来使用,也有经DBA授权后由应用程序员使用
DML:Insert Delete Update Select
DML通常由用户或应用程序员使用,访问经授权的数据库
单表查询:
查询指定列、全部列、经过计算的;消除重复distinct;
查询满足条件元组:空值is null is not null; 确定范围 between and not between and; 确定集合in not in(); 比较><<>;多重条件 and or; 字符匹配模糊查询 like+通配符escape+[多] not like; 排序desc asc;
聚集函数:
——主要集函数count([distinct|all] *|列名) sum avg max min([distinct|all] 列名)
——对查询结果分组:group by;having
连接查询
——等值、非等值连接查询:[表名1.] 列名1 比较运算符 [表名2.] 列名2
[表名1.] 列名1 between [表名2.] 列名2 and [表名2.] 列名3
——自身连接:from重命名,select 重命名.属性,where 重命名.属性=重命名.属性(非ANSI)
ANSI from 表1 join 表2 on 表1.列名=表2.列名
——外连接:左外连接left outer join 右外连接right outer join 全连接full join (ANSI)
——复合条件连接:and or
嵌套查询
子查询不用order by
——带in 可以通过in的嵌套查询实现连接功能;not in相当于差运算
——带比较运算符,子查询返回结果为单值
——多值,any all 可以使用集函数
= | <>或!= | < | <= | > | >= | |
Any | IN | <max | >min | |||
All | NOT IN | <min | >max |
——相关子查询 子查询查询条件依赖父查询 改名
——带exists not exists 可以替换in any all
Sql语言中没有全称量词,使用存在量词的否定:改量词,否结论
Sql语言中没有蕴含逻辑运算,使用p->q等价于非p并q
任意p->q 等价于 不存在p交非q
集合查询
——并Union
——交Intersect
——差except
基于派生表的查询:子查询在from子句中可生成临时表,定义临时表名及属性名
Insert insert into 表名[(列名[,列名]…) values (值[,值]…);
Values后面值的排列需与into子句后面的列名排列一致;若表名后的所有列名忽略,则value后的值排列需与该表存储中的列名排列一致
Select from where 相当于对表进行检索操作后再进行投影操作
检索条件书写:其逻辑运算符使用and or not,同时注意运算符优先级次序及括弧的使用
Eg. 查询课程为1和2的学生 cno=‘1’ and cno=‘2’ 不行,每条记录只有一个课程号
检索唯一性:定义通过Primary key 和Unique;检索通过Distinct
结果排序:order by 列名 asc/desc 升序/降序 默认升序
模糊查询:列名 【not】 like ‘字符串‘ 通配符
多表联合查询:
select 列名
from 表名1,表名2…
where 检索条件;
相当于表名1、2做笛卡尔乘积,再通过检索条件选择,再投影
检索条件要包含连接条件,通过不同的连接条件可以实现等值连接、不等值连接及各种θ-连接
多表连接两表属性名相同,采用表名.属性名方式限定该属性属于哪个表
重名处理:涉及到重名问题,eg. 两个表属性名重名、连接两个表重名(同一表连接),需使用别名加以区分;as可省;有时表名很长,为书写条件简便,也定义表别名简化书写
Select 列名 as 列别名,… (处理属性名重名)
Form 表名1 as 表别名1,表名2 as 表别名2… (处理同一表连接)
Where 检索条件;
学过李明老师但是学过其他老师的课的学生也满足条件,即只有仅学过李明老师的课的学生才会不满足条件
DCL:Grant Revoke
交互式SQL->嵌入式SQL->动态SQL
创建数据库:定义数据库和表(DDL),向表中追加元组(DML)
--关系数据库规范理论
--给定要求设计数据库结构设计 关系数据库设计 -函数依赖 -规范化
--过程化变成 分支循环
--数据保护
--五元组 关系名、属性、域、映射、数据依赖 简化为三元组R<U,F>
--数据依赖 是属性值相等与否体现出来的数据间的相互关系 函数依赖FD 多值依赖?
--不好模式常见问题--部分依赖 传递依赖:插入异常(该插入插入不了)删除异常(不该删除删掉了)更新异常 冗余 主码两个,cno sno,sdept只需sno,但没cno不行 每选一门课插入一个冗余 删除cno,sdept也没了
--分解表
--函数依赖:X取值相同,Y取值一定相同 由语义决定,也可根据现实世界情况进行强制规定
--X决定Y,Y不含与X 非平凡函数依赖;X决定Y,包含 平凡函数依赖;X决定Y,X决定因素;X<->Y;
--完全、部分函数依赖
--传递函数依赖 x决定Y,y决定z,y不含与X(部分函数依赖),Y不决定X(X<->Y) z传递函数依赖于X
--码
候选码:完全函数决定全部属性(真子集不能决定)
主码:候选码多个,选定其中一个作为主码
全码:候选键由组成该关系模式的所有属性组成,没有非主属性,每个属性都不出现在任何依赖中,只有所有属性的值确定才能确定一个元组。
主属性:包含在任何一个候选键中的属性
非主属性、非键属性:不包含在任何候选键中的属性
判断码的原则:不出现再函数依赖的属性一定是主属性,包含在任何码中;属性值存在函数依赖的左部,一定主属性,包含在任何码中;只在右部,一定不是主属性,不出现在任何码。左右都出现,可能主,可能非主。 通过单边出现的判断主属性、非主属性,再看主属性的码是否能决定所有属性,不能决定再将两边都出现的往里并。
--外码/外键
外码:属性不是本身的码,但是另一个关系的码
--规范化
关系模式为什么不好:消除数据依赖中不合适部分
范式:规范化过程中为不同程度规范化要求设立的不同标准
高一级范式在第一级范式基础上,增加进一步限制条件;更高一级范式满足低一级范式
R满足第n范式:R属于什么什么范式
1 2 3 BC 4 5NF
第一范式:所有属性简单属性(不可再分)
第二范式:每一个非主属性都完全函数依赖于码(不存在部分函数依赖);码是单属性,一定第二范式
解决:找到所有违反二范式的函数依赖(部分依赖);每一个函数依赖单独组成关系模式,右部属性去掉构成新的关系模式,左边属性作为主码,左部属性作为外码
第三范式:每个非主属性都不传递函数依赖于码(不存在部分函数、传递函数依赖);一个关系模式不存在非主属性,一定满足第三范式
解决:找多所有传递依赖关系;每一个依赖单独构成关系模式,右部去掉构成新的关系模式,主码为关系左部,外码为关系左部
BC范式:非平凡函数依赖,X->Y(Y不含于X),X中含有码;不存在任何属性对码的部分、传递函数依赖(包括主属性了)
BC范式可能损失信息(连接信息、依赖信息)——三范式不损失信息,一般使用三范式
原则:一事一地,一个关系描述单一实体或实体间联系(关系)
规范化实质是概念的单一化
规范化程度越高,表越多,连接查询,慢——根据实际情况综合考虑,以更新为主,规范化程度高;以查为主,规范化程度低,便于查询
--数据库设计
用户数据需求、处理要求及建立数据库的环境条件出发
--数据库设计任务、内容及方法:
数据库设计内容:数据库逻辑结构设计(表、属性、完整性约束)物理结构设计(优化)数据库行为设计(动态操作)数据库设计结果不是唯一的
数据库设计特点:三分技术,七分管理,十二分基础数据—基础数据非常重要(根据基础数据设计数据类型等);结构(数据)设计、行为(处理数据库设计的特点)设计相结合,先定结构再写程序
设计方法:新奥尔良方法(需求分析、概念设计、逻辑、物理)基于E-R 基于3NF ODL
设计工具:Design2000 PowerDesigner(实体关系图)RationalRose Visio
--数据库设计步骤
需求分析(了解用户需求)、概念结构设计(建立概念模型)、逻辑结构设计(DMS)、物理结构设计(存取方法策略,更有效组织数据 优化)、数据库实施阶段(数据库建立在系统中)、数据库运行维护阶段
--需求分析
收集数据库用户数据分析
-任务:通过详细调查现实世界要处理对象,充分了解原系统的工作概况,明确用户各种需求,收集支持新系统的基础数据并对其进行处理,在此基础上确定新系统功能
包括:信息要求(有什么数据)、处理要求(描述处理过程——eg.输入账号,密码,到数据库比对,取出)、系统要求(运行环境-开发环境、运行环境,运行环境最低要求)、安全性要求、性能要求(响应时间、可靠性24h运行等)
-步骤:
1调查组织机构情况。部门组成情况,各部门职责任务
2调查各部门业务活动情况。各部门输入输出数据与格式、所需表格与卡片、加工处理数据的步骤、输入输出部门等
3熟悉业务活动基础上,协助用户明确新系统的各种需求,包括信息、处理、安全性完整性
4确定新系统边界:哪些活动计算机,哪些活动人工
运营方、使用方
功能要有业务(扫码——访客出示二维码,小区门口保安扫码后台服务器比对你的扫码结果怎么样怎么样)
-需求调查方法:查阅记录 跟班作业 开调查会 请专人介绍 问卷调查 参考同类软件(沟通)
-强调用户参与,用户确认功能正确,阶段性确认,完成一个功能确认一下签字‘
-需求分析方法:自顶向下,慢慢分解;自底向上,慢慢合成;一般自顶向下,用数据流图、数据字典描述系统
-数据流图;任何一个都可以变成信息输入、输出
外部实体/数据源(有主动能力的)
画法:识别系统输入输出,画出顶层图;化系统内部
一层描述系统全貌,二层分别描述各子系统结构
-数据字典:对系统中数据详细描述的集合,对数据流图上各个成分加以定义和说明
包括:数据项、数据结构、数据流、数据存储、处理过程
数据项:不可再分最小单位
数据项描述={数据项名,数据项含义说明,别名,数据类型,长度,取值范围,取值定义,与其他数据项的逻辑关系}
数据结构:数据间组合关系,若干数据项、数据结果混合组成
数据结构描述={数据结构名,含义说明,组成:{数据项或数据结果}}
数据流:数据结构在系统中传输路径
数据流描述:{数据流名,说明,数据流来源,数据流去向,组成:{数据结构},平均流量,高峰期流量}
数据存储:数据结构停留或保存地方,数据流来源与去向之一
数据存储描述={数据存储名,说明,编号,流入数据流,流出数据流,组成:{数据结构},数据量,存取方式}
处理过程描述={处理过程名,说明,输入:{数据流},输出:{数据流},处理:{简要说明}}
数据需求:得到数据流图和数据字典 非数据需求-功能需求:业务流程图
箭头流的是数据流,一般不是空的
4.24.2024
需求分析(数据 功能 安全性 完整性)概念逻辑结构 物理逻辑结构
需求分析报告(技术人员、客户)——数据流图 数据字典(多搜索,多看)数据流图画法不唯一
需求分析应注意两点:设计人员要充分考虑可能的扩充和改变(用户可能有新的想法);强调用户的参与(用户确认)
概念结构设计
数据联系,不是操作关系。把需求抽象为信息世界的结构。
用户浏览是操作:不存储浏览时间
概念设计方法:
从用户角度看待数据及处理要求和约束,与计算机无关,产生一个反映用户观点的概念模型
优点:各阶段任务相对单一化,便于管理;不受特定的给DBMS的限制,概念模型独立于存储安排和效率方面的考虑,比逻辑模型更稳定;不含具体DBMS技术细节,更容易为用户所理解,更有可能准确反映用户信息需求。
特点:语义表达能力丰富,真实充分反映现实世界;易于交流理解;易于扩充修改;易于向各种数据模型转换(关系、网状、层次等转)。
方法:自顶向下,自底向上(先局部),逐步扩张(最核心部分),混合策略
最常用:自顶向下需求分析,自底向上概念分析
自底向上步骤:数据抽象,E-R模型(设计用户视图);集成各局部E-R模型,形成全局E-R模型(视图的集成)
数据抽象于局部视图设计:
三种抽象:忽略非本质细节。分类(把事物分门别类 教师学生等) 聚集(整体与部分 部分在整体,部分还要再分析) 概括(一般与特殊 类和子类 特殊继承一般的属性,加一些自己的特性 加属性区分;分别设不用设一个学生(本科生 研究生)了)
局部E-R模型(视图)设计:
- 选择局部应用
- 逐一设计分E-R图
(根据需求分析的结果判断哪些实体 确定实体、属性、码、联系类型 实体和属性有时无严格分界线)
一个属性不能属于多个实体(若有,其可能是实体,与其他实体有联系)
属性不能再有描述信息
职称在人事系统里算实体(福利待遇等),还要描述职工与职称的联系
病房号实体;病人 病房多对多,病人多次住院
注意:注意实体和联系的抽象,先抽象实体,在分析联系;一个实体的属性中一般不会在出现其他实体的属性
外部(虚线外)实体—批准不批准与计算机无关
送进货单进一步细化
视图集成
两种方式:一次性多个,两个两个
步骤:合并(各分ER可能有冲突);修改重构(消除不必要冗余A-B B-C A-C能推出就不需,生成基本ER)
合并:消除冲突——不一致
冲突:
属性冲突(值域-属性值类型、取值范围或取值集合 取值单位冲突)
用户业务上的约定,必须与用户协商后解决
命名冲突(同名异义-同一个名字意义不同 异名同义-同一个意义的对象在不同部门具有不同名称)
各部门协商讨论
结构冲突(同一个对象在不同应用中不同抽象-职称在人事、教务系统-按复杂的来,把实体转为属性或把属性转为实体 同一个实体在不同er图中属性组成不同-合并后实体的属性组成为各er图同名实体属性的并集,在适当调整属性次序 同一联系在不同er图中呈现不同类型-一对一多对多等-根据应用的语义对实体联系的类型进行综合或调整,一般向复杂方向变化)
消除冗余:
A-B,B-C A-C能推出就不需
4.26.2024
逻辑结构设计(数据类型 完整性约束)(到此就ok)
Er图转为DBMS产品所支持的数据模型相符合的逻辑结构
步骤:转换为一般的关系、网状、层次模型(不针对具体DBMS);特定DBMS数据模型(eg.货币类型,unicode);优化(规范化理论优化)
Er模型转换关系模型
- 实体转换:实体对应一个关系模式(一张表),属性对应属性,键对应键
- 联系转换:
1:1:单独转换(参加联系的码、属性联系属性共同组成一个关系模式)合并(联系的属性、另外实体的码并入到参加联系的某一个实体关系模式中;注意方向,选择哪个实体-选择基数少的eg.经理比公司多,经理可以没公司,公司一般都有经理,合并到经理则很多都空)
1:n :与n端实体合并,并过去的码作为外码
m:n:单独转换,一般其码为实体码的组合
多个实体的多元联系转换:单独;码相同关系模式合并
自联系到关系模型:教师有领导,一般并
键相同,关系模式可合并;多对多通常参加联系的码组合新键,尤其存在于时间相关属性作为联系属性,通常该属性也为键的一部分
数据流图与er图一致,er图与关系模式一致
关系模型的优化(三范式)
外模式设计:视图 查询可以 更新受限
逻辑结构设计得到一个表 表名:列名 说明 数据类型 宽度 含义 是否约束 主键 空
物理结构设计
概念:存储结构 存取方法
时间空间效率 访问数据块越少越好
确定数据存储结构:存储位置、参数(数据块大小、增长因子)
设计数据存取方法:
索引:
一个/组属性经常在查询中出现,最大值最小值聚集函数参数,连接条件,分组依据列
聚簇:
聚簇码进行为主要查询,其余为辅,使用聚簇(把一部分拿出来)
次序与原表一致,一个关系只能加一个聚簇
移动量大
哈希:
散列,关系大小可预知且不变;大小动态可变
实施:定义 数据 代码(数据库内部编程、应用程序编程) 调试
数据载入(真实)录入、原有数据转换、压力测试(多次访问瘫痪)
试运行:功能测试(操作是否满足设计要求) 运行性能测试(响应时间、并发度、)
边界测试、容错测试-用户会犯错,扼杀其犯错可能
注意事项:渐进式数据入库、数据备份
镜像 备份恢复;安全性完整性;性能监督、分析、改造(日志文件备份自动截断;重组织重构造(尽量避免)
数据库编程
——Sql扩展语言介绍
-数据定义语句 create alter drop
-数据操纵语句 select insert update delete
-数据控制语句 完整性控制(完整性约束) 并发控制 恢复 安全性控制
-附加语句 变量 运算符 函数 注释语句 流程控制 事务控制
——数据类型
-动态语言:不生成变量就可以用python 静态语言:c java
-系统提供数据类型 用户自定义
-二进制字符串(图片 用二进制压缩存)查手册
-精确数字:整数bit int4 bigint8 smallint2 tinyint1字节;小数 decimal money float real
n表精度
-日期
-字符串
编码:普通 Unicode;char varchar
-常量
(字符、日期常量-字母数字 !、@、#等特殊字符 单引号)N‘’表示是一个Unicode字符串 0x十六进制
数值:科学计数法 货币常量加$
-变量
局部变量@开头declare定义 declare @变量名 类型;多个,隔开
Select赋值,确保单值赋值 set @变量名=变量值
全局变量@@开头 系统变量 用户不定义
--注释 单行- - 多行/**/
-输出print混合类型不行,通常拼接成字符串输出;在消息框 ralserror将错误信息显示在屏幕,参数
-运算符 算数 赋值 位(转为二进制 每一位进行逻辑运算 位与位或结果与字长有关可能不同) 比较 逻辑 字符串串联运算符(+拼接)字符串一般varchar 不然补空格,可能满了就
——函数 查手册
-内置 自定义
-数学 floor向上取整 ceiling向下取整 round四舍五入
-字符串 子串 去空格
-日期 dateadd(month,12,getdate())detediff(day,‘2023-09-01‘,getdate())2023这天到现在有多少天
-聚集
-转换 cast(expression as type)将表达式expression转化为指定类型;convert(type【length】,expression【,style】)style将日期类型转换为字符串类型,指定转换后样式
-系统 获取信息
-用户自定义
—批处理
-go create完 go 才能use 局部变量只在批处理内有效
-create default create procedure
——流程控制
-begin end
-if else
-case 必须select嵌套 限定select查询的输出
Case 表达式
When 表达式 then 表达式
When
Else 表达式
End
Case when 表达式 then 表达式
When 表达式 then 表达式
Eles 表达式
End
-while
While 表达式
Begin
Break:终止循环
Continue:跳出本次循环进行下次循环
End
-goto
-waitfor 延迟 delay(延迟多少) time(不跨天 到什么什么时间执行)
——存储过程(分析优化不做,直接执行 通过参数传递??)
-名称 参数 返回值 可嵌套
-分类 系统存储过程sp_ 扩展存储过程 用户自定义存储过程
-优点:执行快(sql执行语句:分析 优化 执行) 安全性好(sql注入攻击???) 访问统一(调用方式统一,存储过程名) 命名代码,运行延迟绑定(简单 参数化) 减少网络通信流量(只需传名、参数 减少流量)
-函数、存储过程区别:预编译,快;存储过程可不返回任何值,只返回状态,函数必有一;存储必须单独执行(返回状态),函数嵌入表达式;存储主要对逻辑处理的应用和解决,函数对功能
-创建
-执行
-修改 create-alter
-删除 drop过程名
-参数
输入参数
输出参数
参数传递:按参数名字传递(慢,灵活)exec 名 @sname=‘‘ 按位置传递 exec 名 ’‘,’‘
存储过程返回值return返回执行过程的状态 -1到-99 存储过程失败 只能返回整数值
执行时要把存储过程的名字赋给变量,把结果带回来
完整性约束-静态完整性 动态完整性-新值旧值对比 字段最好不要变,不然年年要改,设出生日期
触发器:数据库发生某个事件才触发,事件自己定义
分类:
按事件分类:DML数据操作更删改insert delete update(新旧值对比完成动态完整性) DDL数据定义 登录
按触发执行方式分类:AFTER/FOR语句成功执行之后触发,INSEAD of前触发器(正常前触发,先触发后更新;sql 先触发触发完了,代替掉更新语句)
行级:每一行一触发,直接截获新行旧行,性能不好
语句级(sql):一个语句触发一次,灵活性差,性能好
新两个表,与原表结构一致,deleted(删除的) inserted表(插入的行放里)update既有inserted又有deleted delete只有deleted 不能更改这两个表
优点:强化约束;跟踪数据变化;支持级联运行(级联触发 嵌套 默认关掉);可以调用存储过程
缺点:触发器性能通常较低;不恰当使用触发器造成数据库维护困难
Sql触发器:
创建触发器
触发器一般不能修改码,设定一个标志,唯一标识这一行
通过视图更新基表instead of触发器
修改 删除 禁用 激活触发器alter drop
游标
单值放变量 行集——游标,开辟一个缓冲区,设一个游标指针,把结果放缓冲区内 每次处理一行或部分行
游标扩展结果处理的方式:再结果集对特定行定位;从结果集的当前位置检索数据行;支持对结果集中当前位置进行数据修改操作;为由其他用户对显示在结果集中的数据库数据所作的更改提供不同级别的可见性支持(静态游标—看不到;动态游标—能看到);支持在脚本、存储过程及触发器中访问结果集中的
步骤:
- 声明游标,定义该游标特性
- 执行sql语句以填充游标
- 检索想查看的行,提取 执行一系列操作一遍向前后检索—滚动
- 根据需要对游标当前位置的行执行修改操作
- 关闭游标
创建游标
Optimistic不加锁,但是更新数据检查是否存在不一致的冲突(读出a后,别人改过,自己再往里写,失败)
打开open
提取fetch
-1超出结果集(找到最后都没找到)-2(被别人删除了)
关闭close 游标名 @游标变量
Deallocate类似free 释放空间
使用游标修改和删除表数据
使用游标变量
存储过程 触发器 游标
数据库保护
数据库完整性
正确性 相容性
完整性:无效操作 错误结果 数据不一致 安全性:非法用户访问使用数据恶意破坏
完整性约束:静态约束——某一时刻满足约束条件 动态约束——数据库状态变化,新旧状态满足约束条件(新旧年龄)
完整性控制机制:定义功能 检查功能 更新(违背 采取一定动作保证数据完整性 触发器)
表定义语句六个 触发器动态完整性
数据库安全性
不合法使用造成的数据泄露 更改 破坏
合法操作系统用户 数据库合法用户
安全保护措施——户标识与鉴别(合法用户) 存取控制(权限) 视图(更灵活授权) 审计(重要的操作记录,以便追踪) 数据加密(变成不可识别的编码)
标识鉴别——身份认证(用户名) 口令认证(密码) 随机数运算认证(非固定口令 定时更改 记不住 泄露) 个人信息验证(视网膜 生物特征)
存取控制——权限——定义用户权限-数据字典——合法权限检查-查找数据字典——自主存取控制DAC 同一用户不同数据对象不同权限——定义存取权限
Grant revoke 数据对象 操作权限(操作 语句级)
授权grant on to
With 表示权限可以传递
所有用户public 只给一个属性修改授权update(sno)
收回权限语句 revoke on from
Cascade 级联收回
用户管理
创建用户 create user 用户名
对每个用户创建登录名,访问使用登录名登录系统,登录名可以映射到不同数据库,但同一个数据库只能映射一个用户
创建登录名 create login loginwang with password=‘ ’,default_database=SC;
创建用户:create user u1 for login loginwang
删除drop
身份验证模式:windows身份验证模式 sql server身份认证模式 混合模式
更新某行一般一定要select语句
角色管理——有相同数据库权限的用户 通过grant revoke 对角色进行授权收回(跟类差不多)
创建create role 角色名;
授权 grant on to
将用户加入角色:sp_addrolememeber
一处角色:sp_droprolemember
数据对象范围越小授权子系统越灵活 提供与数据值有关授权(借助视图)
强制存取控制MAC
适合对数据有严格固定密级分类的部门
主体敏感度标记——许可证级别 客体——密级
主体许可证级别大于或等于客体密级读才能读,仅当等于时,才能写
语法语义检查——dac——mac
视图机制
审计 日志 记录关键信息重要操作,谁啥时间做了啥事 浪费时间空间 可以不使用audit notaudit
数据加密:明文——原始数据 不可直接识别——密文 替换方法——密钥 置换法——明文字符按不同顺序重新排列 DES官方加密标准结合两种方法
事物
数据库恢复
-并发控制
交叉并发方式:多个事务并行操作轮流交叉进行——单处理机系统
同时并发方式:同时进行——多处理机系统
-事务调度
调度:系统为一个或多个事务的各操作按照时间顺序安排一个执行序列
合法调度:包含所有事务的指令;同一事务的指令执行顺序在调度中保持不变
合法不一定正确
-并行操作问题
不一致问题
丢失修改/更新:两个事务读入同一数据修改,一个事务提交的结果破坏了零一事务的结果导致其修改丢失 写-写冲突
读‘脏’数据:事务读取了数据库不存在的数据 一个事务读取了另一个事务的中间修改结果 读已提交数据 不读未提交数据 读-写冲突
不可重复读:一个事务两次读取同一数据不一致(两次读取之间 数据被其他事务改了)不一定非得控制 幻读(第一次读有 第二次读没有了 中间被修改) 读-写冲突
次序不是人为预知的,无法控制
同一数据读-读无所谓 写写 读写no
事务隔离级:隔离级越高 问题越少 影响并发访问——锁,等
-封锁
事务访问数据,先申请锁;获得锁后才能对数据更新
基本封锁类型 排他锁X锁 共享锁S锁
排他 写锁 不能读取不能修改,不能加锁 写的时候用一般
共享 读锁 可以读不能修改,其他事务可加共享锁,不能加X锁
封锁机制:申请 获得 释放
协议:什么时间申请 持续时间
一级封锁协议:改写 X锁 事务结束释放(rollback commit)——丢失修改
二级封锁协议:一级+读取数据获得S锁,读完释放 ——读脏(写的释放锁才能读);读完就释放(不能保证可重复读)
三级封锁协议:二级+读 S锁 事务结束释放——不可重复读(两次读之间 有S锁)
不加控制 按隔离级来控制锁
活锁 死锁
活锁某些事务长时间得不到控制权,永远等待——短事务优先——长事务永远等
避免活锁——先来先服务——响应时间长
死锁一个事务锁A 一个事务锁B 又互相申请相互的锁 互相等待
解决:预防死锁 定期检测,解除
预防
一次封锁:一次将所有使用数据全部加锁
顺序封锁:预先对数据对象规定一个封锁顺序,所有事物按这个顺序进行封锁
次序维护难 请求动态难确定顺序
都不太好使
检测
超时:事务等待时间超过规定时限,认为发生死锁——重启——误判死锁 时限太长,发生后不能及时发现
等待图法:事务等待图 T1等T2释放锁 T1->T2 若图中出现环——死锁 环中随便一个事务重启
并行调度的可串行性:
正确性——可串行性 当且仅当与某一次串行结果相同
两段锁协议:对任何数据读写前,申请并获得封锁;释放封锁后,事务不在申请获得任何其他封锁
两段锁是可串行调度的充分不必要——可串行化,不一定遵守两段锁协议
两段锁解决不了死锁
-封锁的粒度
封锁对象的大小 封锁粒度越小,并发操作越好 叶?
多粒度封锁:多粒度树 数据库 关系 元组
多粒度封锁协议:对于树中每个结点都可独立加锁,对其子节点加同样类型封锁
显式:直接加的 隐式:继承下来的 父节点
对一个数据对象加锁时:是否有显式/隐式与其冲突 新加的是否与子节点的有冲突
意向锁:对后代准备加锁 意向共享锁IS——准备后代加S锁,家那个不知道
IX意向排他锁——准备 不确定 ;SIX共享意向排他——都加S 准备X不确定
隔离级:未提交读——读脏可以 已提交读——解决读脏 可重复读 快照() 可串行读
乐观:有版本问题 修改后版本就改了 看都看不来了了——两次读 写失败了 再读一次
处理要求:人员+要做的事
员工 登记员工信息 考核
管理员 信息审核
薪酬管理员 薪酬管理