数据库基本原理(持续更新)

一.概述

1.什么是数据库

数据库是数据的集合;是对现实中一个企业的建模;

2.数据库管理系统

用来存储和管理数据库的一种系统软件

3.为什么要用数据库而不是文件

文件:文件是操作系统提供的最简单的,最基本的存储数据的机制,文件是没有结构的,就是单纯的字符流;

  • 数据库可以通过DBMS直接进行很多操作,而文件的话只提供了简单的操作,文件只能用文件系统提供的几个函数,比如read,write
  • 当多个用户并发访问数据库,文件要加锁,而DBMS会帮你做
  • 文件不具有故障处理的能力,但是DBMS可以自动恢复
  • 访问控制,文件只有可读可写可执行

4.一些基本术语

数据:是用来描述现实世界事物的符号
数据模型:用来描述数据的一种方法,可以理解为数据结构
数据模式:用给定的数据模型来对特定企业进行描述;
这里举个例子:给定一个树形结构,来对班级和学生进行描述;
在这里插入图片描述
这就是一种模式,它可以有很多实例:
在这里插入图片描述


关系 : 就是表
元组:表中的一行
属性:表中的一列
三级模式:
在这里插入图片描述

  • 第一级:Physical Schema[物理模式]描述数据在磁盘上是怎么存的,用的什么索引,是按照哪个属性的排序存储的…
  • 第二级:Conceptal Schema [概念模式] 也叫作逻辑模式,描述数据的逻辑结构,在mysql中就是对表的定义,比如用户表里面有姓名 varchar(10)这就是一种模式;
  • 第三极:外模式也是视图层,一个数据库可以有多个外模式,而这些外模式都是根据逻辑模式中的中的属性算出来的; 外模式是保证数据库安全性的一个有力措施。每个用户只能看见和访问所对应的外模式中的数据,数据库中的其余数据是不可见的。

两级映射

  • 外模式/逻辑模式映像:一个DB只有一个模式,但可以有多个外模式。
    所以,对于每一个外模式,数据库系统都有一个外模式/模式映像,它定义了这个外模式与模式的对应关系。外模式的描述中通常包含了这些映像的定义。
    当模式改变时(增加新的关系、新的属性、改变属性的数据类型等),由数据库管理员对各个外模式/模式映像作相应的改变,可以使得外模式保持不变。而又由于应用程序应该是依据外模式编写的,从而应用程序不必修改,这就保证了数据与程序的逻辑独立性。

  • 逻辑模式/内模式映像:由上可知:一个DB只有一个模式,也只有一个内模式,所有模式/内模式映像是唯一的,它定义了数据全局逻辑结构与存储结构之间的对应关系。
    当数据库的存储结构改变时(例如选用了另一个存储结构),由数据库管理员对模式/内模式映像作出相应的改变,可以使得模式保持不变,从而应用程序也不必改变。这就保证了数据和程序的物理独立性。

二.数据模型

1.层次模型

在现实中很多事情都是有层次的,就是数据结构中的树;
在数据库中,层次模型用一种双亲子女关系来表示现实世界中,两个不同记录之间的一对多关系;
记录:用来表达实体
:用来描述实体
在这里插入图片描述
但是现实中不是一个学生只选一门课的,往往会出现多对多映射;
层次结构引入一个虚记录这里我们假设上图中的学生1选择了课程1课程2;
在这里插入图片描述

2.层次模型

网状模型的基本数据结构为set【系】,一个set表达现实世界中两个数据类型的一对多关系。其中一为主记录,多为属记录。
在这里插入图片描述

在层次模型中怎么描述一对多关系呢?

这里是引入LINK记录在这里插入图片描述

3.关系模型

关系模型的基本数据结构是表,即关系。将现实生活中实体和实体之间的联系全部用表来表示。将表看出多个元组【记录】的集合,可以采用数学的研究方法进行研究。
特点:

  • 基于数学集合论,有更高的抽象级别
  • 屏蔽了所有的底层细节,易于理解
  • 可以建立新的代数系统----关系代数
  • 定义一个非过程化的查询语言----SQL
    在这里插入图片描述
1.主键(primary key)
  1. 一个关系中任意两个元祖的这组属性的值都不一样
  2. 这组属性的任何一个子集都没有这个特性

同时满足1和2的叫做候补键;
满足1不满足2的叫做超键;
如果有多个候补键可以选择一个成为主键;
如果主键是由这个关系的所有属性组成称为全键;

2.外键(foreign key)

一个关系中有一组属性用它来引用另一关系里的主键属性,那么这组属性被称为外键;

3.完整性约束

域完整性约束:插入属性的值是否符合值域
实体完整性约束:主键不能为空

三.关系代数

是关系模型的理论基础

  • 选择操作σ 从一个表中把满足条件的元组选出来
  • projection 投影操作π 将需要的属性列出来
  • 笛卡尔乘积× 两个关系的拼接
  • 集合差- 把属于关系A不属于关系B的元组找出来
  • 把两个模式相同的元组并起来

并兼容:属性的个数一样,对应属性的类型一样;
满足并兼容的关系才可以做并,交,差操作;

这5种操作是关系代数的基本操作,剩下的操作都可以用这5种操作表示;

连接操作:笛卡尔积与选择操作的组合;

  • 条件连接操作:

    • 由笛卡尔乘积和选择操作的结合
    • 结果模式和迪卡尔乘积的模式相同
    • 连接操作的结果的元组数比笛卡尔乘积的结果元组要少
    • 也称为theta-join
  • 等值连接操作

    • 一种特殊的条件连接,连接条件只有等值的条件
    • 结果模式和笛卡尔乘积的模式类似,把等值的属性去掉一列
  • 自然连接:

    • 两张表在所有的公共属性上做等值连接【应用开发最常用的】

除法操作:
先举例
在这里插入图片描述
这种操作适合回答一种问题:
比如找到选择了所有课程的学生;

计算思路:比如对于A/B来说,我们要找在关系A中跟关系B中所有c值都有联系的s值

  • 先在A中找不满足除法条件的s
    • 先把A做一个投影,投影到s属性
    • 将投影结果和关系B做一个笛卡尔乘积
    • 用笛卡尔乘积结果-A
    • 对上一步结果做一个投影,投影到s
    • 把关系A所有的s值减去所有不满足条件的s值
    • 把关系A投影到s
  • 投影结果减去上一操作找到的所有不满足条件的s值

外连接
解决情况:在自然连接中不满足连接操作的元组想要保留下来。
分类
左外连接
把连接运算符的左边的所有元组都要保留,找不到匹配的补空值
右外连接
把连接运算符的右边的所有元组都保留下来,找不到匹配的补空值
全外连接
把连接运算符的左右两边的所有元组都保留下来,找不到匹配的补空值
在这里插入图片描述
外并操作:
有一些不满足并兼容的关系要做并交差;(类比迪卡尔积,没有的补空值)

四.SQL

  • 数据定义语言【DDL】数据库定义 : 定义数据库中Table的名称、标题(内含的属性名称及对该属性的值的要求)等
    • DBMS提供一套数据定义语言(DDL:Data Definition Language)给用户
    • 用户使用DDL描述其所要建立表的格式
    • DBMS依照用户的定义,创建数据库及其中的Table

在这里插入图片描述

  • 数据操纵语言【DML】数据库操纵 : 向数据库的Table中增加/删除/更新数据及对数据进行查询、检索、统计等
    • DBMS提供一套数据操纵语言(DML:Data Manipulation Language)给用户
    • 用户使用DML描述其所要进行的增、删、改、查等操作
    • DBMS依照用户的操作描述,实际执行这些操作
      在这里插入图片描述
  • 数据控制语言【DCL】数据库控制 : 控制数据库中数据的使用—哪些用户可以使用,哪些不可以
    • DBMS提供一套数据控制语言(DCL:Data Control Language)给用户
    • 用户使用DCL描述其对数据库所要实施的控制
    • DBMS依照用户的描述,实际进行控制在这里插入图片描述
  • 查询语言【QL】:select语句

SELECT [DISTINCT] target-list
FROM relation-list
WHERE qualification

  • 关系列表 relation-list 【查询设计的表】
  • 目标列表 target-list 【要查询的东西】
  • 条件 qualification 【布尔表达式】
  • DISTINCT 可选字符,加了的话表明要求系统对查询结果的重复元组要消除。

查询语句执行的基本策略

  • 把FROM子句里出现的表做笛卡尔乘积
  • 把笛卡尔乘积的觉果用qualification做筛选
  • 根据target-list 内的对上一步结果做投影
  • 如果有DISTINCT,将重复元组筛选

复杂的查询:
在这里插入图片描述
找到A表中既在Class a里又在Class b里的id
select id from A where class = ‘a’ and class = ‘b’;
这种是错的

正确的:
要对表A做自连接(笛卡尔积)
select A1.id from A A1, A A2 where A1.id = A2.id and A1.class = 'a' and A2.class = 'b'
但是这种效率不高;
可以用集合的交来做,就不会产生多余的数据:
select id from A where class = 'a' intersect select id from A where class = 'b';
mysql中要这样写
select id from A where class = 'a' and id in(select id from A where class = 'b');
这种叫做非关联嵌套子查询;

在这里插入图片描述

找到b班上人的姓名
select B.name From B where EXISTS (select *from A where A.class = 'b' and A.id = B.id);
这种叫做关联嵌套子查询
exists是存在的意思,也就是前面的id后面那个不令后面的查询为空,
可以看成一个二层循环;

发布了35 篇原创文章 · 获赞 82 · 访问量 7443

猜你喜欢

转载自blog.csdn.net/qq_44049351/article/details/105249847