目录 数据库理论关系数据库
数据库理论
-
数据库常用数据模型
- 层次模型(树)
- 有且只有一个结点没有双亲结点,这个结点为根节点
- 根节点以外的结点有且只有一个根节点
- 网状模型
- 允许一个以上的结点无双亲
- 一个结点可以有多于一个的双亲
- 关系模型
- 关系:一个关系对应通常所说的一张表。
- 元组:表中的一行即为一个元组
- 属性:表中的一列为一个属性,属性名为列名
- 码(key):也称作码键,表中的某个属性组,他可以确定一个元组,即表中主键Id,每一个Id都可以唯一确定一个元组,Id即为key
- 域(domain):属性的取值范围
- 关系模式:对关系的描述,一般写法为 关系名(属性名1,属性名2…),即 表名(列名…)
- 面向对象模型
- 对象关系模型
- 层次模型(树)
-
数据库系统的三级模式结构
- 模式:也称逻辑模式,是数据库中所有数据的逻辑结构和特征的描述,是所有用户的公共数据视图,它是数据库系统模式结构的中间层,既不涉及数据的物理储存细节和硬件环境,也与具体的应用程序,所使用的应用开发工具及高级程序设计语言无关。
也就是说,模式仅仅是针对此数据库中所有数据的关系、逻辑、特征的描述。 - 外模式:也称子模式或用户模式,是数据库用户能看到和使用的局部数据的逻辑结构和特征的描述,是数据库用户的数据视图,是有关某个应用的数据的逻辑显示。
也就是说,外模式只是针对某个用户而言,某个用户只能看到所属于他的那部分的数据,对其余数据不可见,是保证数据库安全性的一个有力措施。 - 内模式:也称存储模式,一个数据库只有一个内模式,他是数据物理结构和存储方式的描述,是数据再数据库内部的表达方式。
也就是说,内模式是指数据再这个数据库的储存方式,是一种储存的物理结构。
- 模式:也称逻辑模式,是数据库中所有数据的逻辑结构和特征的描述,是所有用户的公共数据视图,它是数据库系统模式结构的中间层,既不涉及数据的物理储存细节和硬件环境,也与具体的应用程序,所使用的应用开发工具及高级程序设计语言无关。
-
对于数据库系统三级模式中的两层映像
- 外模式 / 模式映像:对于外模式和模式的定义而言,一个模式可以有多个外模式,对于每一个外模式,数据库系统都有一个外模式 / 模式映像,它定义了该外模式与模式之间的对应关系,这些映像定义通常包含在外模式的描述中。
当模式改变时(例如增加新的关系,新的属性,改变属性的数据类型等),由数据库管理员对各个外模式 / 模式的映像做相应改变,可以使外模式保持不变,由于应用程序时依据数据的外模式编写的,从而应用程序不必修改,保证了数据与程序的逻辑独立性,简称数据的逻辑独立性,即需要修改数据库的关系时,可以不用改变外模式,只改变映像关系,就可以避免修改应用程序,即逻辑独立性 - 模式 / 内模式 映像:数据库只有一个模式,也只有一个内模式,所以模式 / 内模式映像是唯一的,它定义了数据全局逻辑结构与储存结构之间的对应关系。具有物理独立性
- 外模式 / 模式映像:对于外模式和模式的定义而言,一个模式可以有多个外模式,对于每一个外模式,数据库系统都有一个外模式 / 模式映像,它定义了该外模式与模式之间的对应关系,这些映像定义通常包含在外模式的描述中。
-
SQL的特点
- 综合统一
- 高度非过程化
- 面向集合的操作方式
- 以同一种语法结构提供多种使用方式
- 语言简洁,易学易用
-
SQL基本概念
- 外模式对应视图(View)和部分基本表(Base Table),模式对应于基本表,内模式对应于储存文件。
- 基本表是本身独立存在的表,在SQL中一个关系就对应一个基本表,一个(或多个)基本表对应一个储存文件,一个表可以带若干索引,索引也存放在存储文件中。
- 储存文件的逻辑结构组成了关系数据库的内模式,储存文件的物理结构是任意的,对用户是透明的。
- 视图是从一个或几个基本表导出的表,它本身不独立存储在数据库中,即数据库中只存放视图的定义而不存放视图对应的数据,视图在概念上与基本表等同,用户可以在视图的定义上再定义视图。
-
数据定义
- 模式的定义
create schema <模式名> authorization <用户名>
如果没有指定 <模式名>,那么<模式名>隐含为 <用户名>
要创建模式,调用该命令的用户必须拥有DBA权限,或者获得了DBA授予的 CREATE SCHEMA 得权限 - 删除模式
drop schema <模式名> <cascade|restrict>
其中cascade和restrict必须二选一
cascade:级联,表示在删除模式的同时把该模式所有的数据库对象一起删除。
restrict:限制,表示如果该模式中已经定义了下属的数据库对象,则拒绝该删除语句的执行,只有当该模式下没有任何下属的对象数据时才能执行删除操作。
- 模式的定义
-
基本表的定义、删除、修改
-
定义基本表
create table <表名> (<列名> <数据类型> [约束条件]);
/例/
create table student
(sno char(9) primary key,
sname char(20) unique
) -
定义模式
方法一:在表名中明显给出模式名
create table “s-t”.student(…);/*student所属的模式是 s-t */
方法二:在创建模式语句中同时创建表
create schema test authorization zhang
create table tab1(…);
/在为zhang用户创建一个test的模式并在该模式下创建了表table/ -
修改基本表
用 alter table 修改基本表
alter table <表名>
[add <新列名><数据类型>[完整性约束]]
[drop <完整性约束>]
[alter column <列名><数据类型>]
其中,表名是要修改的基本表,add 用于增加新列和新的完整性约束条件,drop 用来删除指定的完整性约束条件,alter column 用来修改原有的列定义,包括修改列名和数据类型。 -
删除基本表
drop table <表名> [restrict|cascade]
restrict :要删除的基本表内不能被其他表的约束所引用(cheak,foreign key等),不能有视图,不能有触发器不能有储存过程和函数等,如果存在则不能被删除。(默认选中 resticr)
cascade:直接删除,包括相关的依赖全部被删除 -
索引的建立
create [unique][cluster]index <索引名>
on <表名>(<列名>[<次序>][,<列名>[<次序>]]… )
<表名>是要建立索引的基本表的名字,索引可以建立在该表的一列或多列上,各列之间用逗号分隔。每个<列名>还可以用次序指定索引值得排列是升序(ASC)或降序(ASC),默认ASC
UNIQUE 表明此索引的每一个索引值只对应唯一的数据记录
CLUSTER 表示要建立的索引是聚簇索引,即索引项的顺序与记录的物理顺序一致的索引组织 -
索引的删除
使用drop index
drop index <索引名>
删除索引时,系统会同时从数据字典中删去有关该索引的描述
-
-
数据查询
select <列名>,<列名> from 表名;/*查询某列下的数据*/ select * from 表名 /*查询该表下的所有数据*/ select 算术表达式 from 表名; /*列名可以用算术表达式的结果*/ select distinct 列名 from 表名 /*查询某列下的数据并删除列名下重复的数据*/ select 列名 from 表名 where 条件表达式
条件表达式
- 比较大小 :=、>、<、>=、<=、!=、!>、!<
- 确定范围:(not) between 范围下限 and 范围上限
- 确定集合:in 可以用来查找属性值属于指定集合的元组
select 列名 from 表名 where 列名 (not) in (列名集合)
字符匹配: - like:%匹配任意长度的字符(可以为0)的字符串,_ 匹配任意单个字符
select 列名 from 表名 where 列名 like ‘%00_%’
order by :按照升序(ASC)或降序排列(DESC)
select 列名 from 表名 order by 列名 desc(ASC)/表示按照列的数据降序或者升序排列/
注意:where子句在order by子句前
聚集函数:
count(*) /统计元组个数/
count(列名) /统计一列中值得个数/
sum(列名) /计算一列值的总和(必须是数值型)/
avg(列名) /计算一列值的平均值(必须是数值型)/
max(列名) /计算一列值的最大值(必须是数值型)/
min(列名) /计算一列值的最小值(必须是数值型)/
group by:将查询的结果按照某一列或多列的值分组,值相等的为一组
select * from 表名 group by 列名 /在该列下相同的数据分为一组/连接查询
即多表联查
select 表1.列名,表2.列名 from 表1,表2 where 表1.列名 = 表2.列名嵌套查询:即把一个查询语句块当做另一个查询语句块的条件,但是子查询中的select语句不能使用order by语句,order by语句只能给最终的结果排序
集合查询
并(UNION),交(INTERSECT)、差(EXCEPT)select * from 表名 union (all)select * from 表名/*将结果合并起来,自动去除重复元组,若要保留重复元组,使用UNION ALL操作符*/ select * from 表名 intersect select * from 表名 /*求两个结果的交集*/
-
数据更新
- 插入数据
insert into 表名 (列名) values (对应的数据)
insert into 表名 values(根据列名所对应的数据,插入空值写为 null ) - 修改数据
update 表名 set 列名 = 数据 …where 条件 - 删除数据
delete from 表名 where 条件
- 插入数据
-
视图
视图是从一个或几个基本表(或视图)导出的表,它是一个虚表,并不存在,数据库中只存放视图的定义,而没有视图的所对应的数据,它的数据来源于其他表或者视图。- 定义视图
create view 视图名 (列名) as (子查询)
其中,子查询可以是任意复杂的select语句,但通常不允许有order by语句和 distinct短语,即把子查询结果当做一个视图,并定义视图名,如果不加列名,则此视图的列名为原列名 - 查询视图
select 列名 from 视图名 where 条件
视图的查询和普通表查询方法一致 - 更新视图
insert into 视图 (列名) values (对应的数据)
insert into 视图 values(根据列名所对应的数据,插入空值写为 null )
update 视图 set 列名 = 数据 …where 条件
delete from 视图 where 条件 - 视图的作用:
- 简化用户操作,将注意力集中在自己所需要的数据上
- 多种角度看待统一数据
- 提供一定的逻辑独立性
- 对机密数据提供安全保护
- 更清晰的表达查询
- 定义视图
关系数据库
- 关系
- 域:一组具有相同数据类型的值的集合,例如,大于0小于100的整数
- 笛卡尔积:笛卡尔积是域上面的一种集合运算
- 笛卡尔积定义:给定一组域D1,D2,D3…Dn,它们的笛卡尔积为D1 x D2…x Dn = {d1,d2…d.}
d1…dn为所有元素叫做元组,每一个元素叫做分量
例:D1={A,B,C}
D2={1,2,3}
所以D1 x D2 x D3 的笛卡尔乘积为{
(A,1),(A,2),(A,3)
(B,1), (B,2), (B,3),
(C,1), (C,2), (C,3),
}
一共有12个元组,A,B,C 1,2,3叫做分量
- 笛卡尔积定义:给定一组域D1,D2,D3…Dn,它们的笛卡尔积为D1 x D2…x Dn = {d1,d2…d.}
- 关系
D1 x D2…x Dn 的子集叫做在域D1,D2…Dn上的关系,表示为R(D1,D2…Dn)
这里R表示关系的名字,n表示关系的目或者度
当 n = 1 时,该关系为一元关系或单元关系
当 n = 2 时,该关系为二元关系
关系时笛卡尔积的有限子集 - 若关系中的某一属性组的值能够唯一地标识一个元组,则称该属性组为候选码。
- 若一个关系有多个候选码,则选定其中一个为主码
- 候选码的诸属性称为主属性,不包含在任何候选码中的属性称为非主码属性或非码属性
- 若关系模式下所有属性是这个关系模式的候选码,则为全码
- 关系有三种类型:
- 基本表示实际存在 的表,它是实际储存数据的逻辑表示
- 查询表是查询结果对应的表
- 视图表是有基本表或其他视图导出的表,是虚表,不对应实际存储的数据。