数据库复习3——关系模型

数据库复习笔记汇总

数据库复习1——基本概念
数据库复习2——数据模型
数据库复习3——关系模型
数据库复习4——数据库设计
数据库复习5——数据库基本原理
数据库复习6——事务处理


关系模型

关系模型由:关系数据结构、关系操作集合和关系完整性约束三部分组成。

关系模式

对关系的描述,R(D,U,Dom,F),R 为关系名,U为属性集合,D为属性组U中属性的域,Dom为属性向域的映像集合,F为属性间数据的依赖关系的集合。相当于关系数据库的型。

关系

关系模式在某一时刻的状态或内容,相当于关系数据库的值。

关系数据库

有值和型之分,型也称关系数据库模式,是对关系数据库的描述,包括若干域的定义和这些域上定义的若干关系模式。值为这些关系模式在某一时刻对应的关系的集合,通常成为关系。

关系模式关系
对关系的描述关系模式在某一时刻的状态或内容
静态的、稳定的动态的、随时间不断变化的

关系代数

传统关系代数:并、差、交、笛卡尔积
专门的关系运算符:选择、投影、连接、除
其中 并、差、笛卡尔积、选择、投影为五种基本关系代数运算,其他三种:交、连接、除可以由基本运算来表达,不增加语言能力,但能简化表达。

并(union)

关系R并关系S得关系T,T中的元组属于R或S

差(except)

关系R与关系S的差,结果为关系T,T中的元组属于R并且不属于S

交(intersection)

关系R与关系S的交集,结果为关系T,T中的元组同时属于R和S

笛卡尔积(cartesian product)

此处指广义笛卡尔积,因为此处元素是元组。
设R有n列k1个元组,S有m列k2个元组,RxS=T。则T中有(n+m)列,(k1*k2)个元组,且元组的前n列为R的元组,后m列为S的元组。

选择(selection)

又称为限制(restriction),选择行,关系R在选择条件B下进行选择操作得到关系T,则T中的元组均满足条件B,R个属性个数不变。

投影(projection)

选择列,关系R中选取若干属性组成新的关系,元组个数不变。

连接(join)

关系R和关系S,在基于条件B的情况下进行连接操作得到关系T。等价于关系(RxS)在条件B下进行选择操作。

  • 连接条件的比较运算符为=称为等值连接,它是从(RxS)中选择出指定属性值相同的元组。
  • 自然连接是一种特殊的等值连接,其比较分量必须是同名属性组,并且结果将重复的属性列去掉。
  • 自然连接过程中,因为比较分量不一致的元组被舍弃,该元组称为悬浮元组(dangling tuple)

除运算(division)

设关系R除以关系S的结果为关系T,则T包含所有在R中且不在S中的属性和值,且T的元组与S的元组的所有组合属于R

象集(images set)

设关系R(X,Y),s是X中的一个值,则s在R中的象集定义为:R中属性组X上,值为s的所有元组在Y分量上的集合。

用象集定义除运算

设关系 R(X,Y)和 S(Y,Z),其中R的Y属性和S的Y属性可以有不同属性名,但是必须出自相同域集。
R除以S得到关系P,P是R中满足以下条件的元组在X属性上的投影:元组在X上的分量值x的象集Yx包含S在Y上投影的集合

  • 例1:是查询至少选择1号和3号课程的学生号码Sno。

首先建立一个临时关系K,K中一个属性(Cno),两个元组(1,3)
则问题的答案为:从关系SC中对Sno和Cno投影,然后除以关系K
原理:SC在Sno和Cno的投影,然后逐一求出各个Sno的象集,并依次检查这些象集是否包含K。

  • 例2
    R
ABC
a1b1c2
a2b3c7
a3b4c6
a1b2c3
a4b6c6
a2b2c3
a1b2c1

S

BCD
b1c2d1
b2c1d1
b2c3d2

R除以S

A
a1
  • A表中a1的象集为{(b1,c2),(b2,c3),(b2,c1)}
  • S表在B、C分量投影的集合为{(b1,c2),(b2,c3),(b2,c1)}
  • a1的象集包含了S表在B、C分量投影的集合,因此a1满足条件。a2、a3、a4象集不满足条件,因此结果只有a1

关系演算

关系演算参考博客

查询语言

SQL(DDL、DML)

SQL特点:

  1. 综合统一

SQL集数据定义语言、数据操纵语言、数据控制语言的功能于一体,语言风格统一,可以独立完成数据库生命周期中的全部活动。

  1. 高度非过程化

只要提出”做什么”,无需指定”怎么做”,存储路径的选择和SQL的操作过程由系统自动完成,提高数据独立性,减轻用户负担。

  1. 面向集合的操作方式

操作对象、查找结果、插入、删除、更新的对象都可以是元组的集合。

  1. 以同一种语法结构提供多种使用方式

支持嵌入其他高级语言

  1. 语言简洁、易学易用

接近英语口语,语言简洁。

DDL((Data Definition Language)

数据定义语言是用来定义数据库外模式、模式、内模式的语言

模式

  • 创建
    create schema <模式名> authorization <用户名>[<表定义字句>|<视图定义字句>|<授权定义字句>]
  • 删除
    drop schema <模式名> <cascade|restrict>
    cascade: 级联,删除模式的同时将该模式中的所有数据库对象全部删除
    restrict:限制,没有任何下属的对象时才能执行

  • 创建
    create table <表名>
    (<列名> <数据类型> [<列级完整性约束条件>],
    <列名> <数据类型> [<列级完整性约束条件>],

    [<表级完整性约束条件>]
    )
数据类型
数据类型含义
char(n)定长字符串
varchar(n)变长字符串
int整数(4B)
smallint短整数(2B)
bigint大整数(8B)
clob字符串大对象
blob二进制大对象
numeric(p,d)定点数,p位数,小数点后又d位数
real取决用户机器精度的单精度浮点数
double recision取决于机器精度的双精度浮点数
float(n)可选精度浮点数
date日期,YYYY-MM-DD
time某一日的时间 HH:MM:SS
timestamp时间戳
interval时间间隔
  • 创建模式后创建表
    create table “模式A”.student (…)

  • 创建模式时创建表
    create schema “模式A” authorization user1 crate table student(…)

  • 设置所属模式,创建表自动分配
    show search_path;// 查看搜索路径
    set search_path to “模式A”,public;

  • 修改表
    alter table <表名>
    [add [column] <新列名> <数据类型> [完整性约束]]
    [add [表级完整性约束]]
    [drop [column] <列名> [cascade|restrict]]
    [drop constraint <完整性约束名> [cascade|restrict]]
    [alter column <列名> <数据类型>] // 修改数据类型

  • 删除表
    drop table table <表名> [cascade|restrict]

索引

  • 创建索引
    create [unique] [cluster] index <索引名> on <表名>(<列名>[<次序>][,<列名>[<次序>]]…)
    一个索引可以建立在一个表的一个列或多个列上,排列次序:默认asc升序,desc降序
    unique:表明此索引的每一个索引值只对应唯一的数据记录
    cluster:聚簇索引,

  • 建立SC表以学号升序,课程号降序的唯一索引
    create unique index scno on sc(sno asc,cno desc)

  • 修改索引
    alter index <旧索引名> rename to <新索引名>

  • 删除索引
    drop index <索引名>

数据字典

关系数据库的系统表,记录了所有定义信息:
关系模式、视图、索引、完整性约束、用户权限、统计信息等。
在执行DDL时,本质是在操作数据字典。
进行查询优化和处理时,数据字典的内容是重要依据。

DML(Data Manipulation Language)

数据操纵语言是用来对数据库进行查询插入删除和修改的语言。

查找

select [all/distinct] <目标列表达式>,<目标列表达式>…
from <表名>,[select 子句] [as 别名]…
where <条件表达式>
group by <列名> [having <条件表达式>]
order by <列名> [asc/desc]

where 条件表达式常用的查询条件

查询条件谓词
比较=,>,<,>=,<=,!=,<>,!>,!<;Not + 其他比较运算符
确定范围between and,not between end
确定集合in,not int
字符匹配like,not like
空值IS NULL,IS NOT NULL
多重条件and,or,not

集合查询

  • union(并)
  • intersect(交)
  • except(差)
经典案例
  • 查询选了所有课程的学生姓名
-- 不存在这样的课程,course中有,x没选
select sname from student x
where not exists(
    select * from course y
    where not exists(select * from sc z
                    where x.sno = z.sno and z.cno = y.cno)
)

  • 查询至少选修了学生201215122选修的全部课程的学生号码
-- 最外层循环遍历学生x
-- 不存在这样的课,y中存在,x没修
select distinct sno from sc scx
where not exists(
    -- 中间循环遍历201215122所选的课程y
    -- 找出所有y中学生x没选的课程
    select * from sc scy  
    where scy.sno = '201215122' 
    and not exists(select * from sc scz     
                    where scx.sno = scz.sno 
                    and scy.cno = scz.cno)
);

完整栗子

use study;
drop table if EXISTS  sc ;
drop table if EXISTS  student ;
drop table if EXISTS  course ;

create table  if not EXISTS student(
sno int PRIMARY key,
sname VARCHAR(20)
);

create table if not EXISTS course (
cno int PRIMARY key,
cname VARCHAR(20)

);

create table if not EXISTS sc(
sno int,
cno int,
score int,
PRIMARY key (sno,cno),
FOREIGN KEY(sno) REFERENCES student(sno),
FOREIGN KEY(cno) REFERENCES course(cno)
);

INSERT INTO `course`(`cno`, `cname`) VALUES (1, 'java');
INSERT INTO `course`(`cno`, `cname`) VALUES (2, 'c++');
INSERT INTO `course`(`cno`, `cname`) VALUES (3, 'go');
INSERT INTO `course`(`cno`, `cname`) VALUES (4, 'php');
INSERT INTO `sc`(`sno`, `cno`, `score`) VALUES (1, 1, 100);
INSERT INTO `sc`(`sno`, `cno`, `score`) VALUES (1, 2, 88);
INSERT INTO `sc`(`sno`, `cno`, `score`) VALUES (2, 1, 90);
INSERT INTO `sc`(`sno`, `cno`, `score`) VALUES (2, 3, 88);
INSERT INTO `sc`(`sno`, `cno`, `score`) VALUES (3, 1, 22);
INSERT INTO `sc`(`sno`, `cno`, `score`) VALUES (3, 2, 89);
INSERT INTO `sc`(`sno`, `cno`, `score`) VALUES (3, 3, 56);
INSERT INTO `sc`(`sno`, `cno`, `score`) VALUES (3, 4, 55);
INSERT INTO `sc`(`sno`, `cno`, `score`) VALUES (4, 1, 99);
INSERT INTO `sc`(`sno`, `cno`, `score`) VALUES (4, 2, 99);
INSERT INTO `sc`(`sno`, `cno`, `score`) VALUES (4, 3, 66);
INSERT INTO `sc`(`sno`, `cno`, `score`) VALUES (4, 4, 99);
INSERT INTO `student`(`sno`, `sname`) VALUES (1, '张三');
INSERT INTO `student`(`sno`, `sname`) VALUES (2, '李四');
INSERT INTO `student`(`sno`, `sname`) VALUES (3, '王五');
INSERT INTO `student`(`sno`, `sname`) VALUES (4, '周六');

select distinct sno from sc scx
where not exists(
    select * from sc scy
    where scy.sno = '1' 
    and not exists(select * from sc scz
                    where scx.sno = scz.sno 
                    and scy.cno = scz.cno)
);
-- 上述例子的子查询
select * from sc scy
    where scy.sno = '1' 
    and not exists(select * from sc scz
                    where '4' = scz.sno 
                    and scy.cno = scz.cno)


select sname from student x
where not exists(
    select * from course y
    where not exists(select * from sc z
                    where x.sno = z.sno and z.cno = y.cno)
)

数据更新

1.插入元组
insert 
[into] <表名>[(属性1,属性2...)]
values(<常量1>,<常量2>...)

into子句中属性的顺序可以自定义,也可以不写,默认为表定义的顺序,values提供的值必须与into中一致

2.修改数据
update <表名>
set <列名1>=<表达式1>,<列名2>=<表达式2>...
where <条件>
3.删除数据
delete
from <表名>
where <条件>

视图

create view is_student as (select ...) [with check option]

with check option: 表示进行删除、插入、修改操作时候,会检查新的元组是否满足视图的where条件

  • 视图消解:用户对视图的查询,数据库系统基于查询语句和视图的定义语句合并,形成新的完整的查询语句
  • 一般行列子集视图可更新
  • 若设视图设涉及多表、distinct、group、聚集函数等不允许更新
视图的作用
  • 简化用户操作
  • 可以从不同角度看同一数据
  • 对重构数据库提供一定程度的逻辑独立性
  • 视图可以对机密数据提供安全保护
  • 适当利用视图可以更清晰地表达
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值