《SQL 必知必会》是一本通俗易懂的数据库入门书籍,本篇文章归纳总结了书中没有提及的,但在笔试面试中经常出现的知识点。
MySQL 日志
错误日志:log-err,记录启动,运行,停止 MySQL 时出现的信息。二进制日志:log-bin,记录所有更改数据的语句,还用于复制,恢复数据库用。查询日志:log,记录建立的客户端连接和执行的语句。慢查询日志:log-slow-queries,记录所有执行超过long-query-time秒的所有查询。更新日志:log-update,二进制日志在 MySQL 5.1 中代替了老的更新日志。
MySQL 主(master)从(slave)复制
master将数据改变记录到二进制日志(binary log)中,也即是配置文件(log-bin)指定的文件;slave将master的二进制日志拷贝到它自身的中继日志(relay log)中;slave重做中继日志中的事件,将改变反映它自己的数据(数据重演)
MySQL 中的通信协议
TCP/IP 协议:是一套被用于连接互联网上各主机的通信协议。TCP/IP一开始是用于 UNIX 操作系统建立互联网通信的。现在它已经成为了一种网络数据传输的事实标准。即便那些拥有自己通信协议的网络操作系统,如 Netware 也支持 TCP/IP 协议。Unix Socket 协议:一个socket是一种内部进程通信形式,它被用于在相同主机上形成进程间的双向通信连接点(在本地系统上的一个物理文件)。通常登入 MySQL 服务器中使用这个协议。Share Memory 协议:一个在程序间传送数据的有效方法。一个程序会建立一个内存区以提供其它受允许的进程进行访问。仅可工作于 Windows 系统主机中。Named Pipes 协议:这个协议也是只有 windows 才可以用,同 Share memory 一样,使用此协议,一个 host 上依然只能有一个 server ,即使是使用不同的端口也不行。Named Pipes 是为局域网而开发的协议。内存的一部分被某个进程用来向另一个进程传递信息,因此一个进程的输出就是另一个进程的输入。第二个进程可以是本地的(与第一个进程位于同一台计算机上),也可以是远程的(位于联网的计算机上)。正因为如此,假如你的环境中没有或者禁用 TCP/IP 环境,而且是windows 服务器,那么好歹你的数据库还能工作。
数据字典
数据字典(Data dictionary)是对于数据模型中的数据对象或者项目的描述的集合,在需求分析阶段建立,在数据库设计过程中不断修改、充实和完善的。
事务的四个特性(ACID)
原子性(Atomicity):事务是一个不可分割的整体,为了保证事务的总体目标,事务必须具有原子性,即当数据修改时,要么全执行,要么全不执行,即不允许事务部分的完成,避免了只执行这些操作的一部分而带来的错误。一致性(Consistency):一个事务执行之前和之后,数据库数据必须要保持一致性状态。数据库的一致性状态应该满足模式锁指定的约束,那么在完整执行该事务后数据仍然处于一致性的状态。为了维护所有数据的完整性,在关系型数据库中,所有规则应用到事务的修改中。数据库的一致性状态由用户来负责,由并发控制机制实现。例如银行转账,转账前后两个账户金额之和保持不变。由此并发操作带来的数据不一致性包括丢失数据修改、脏读数据、不可重复读、产生幽灵数据。隔离性(Isolation):隔离性也被称为独立性,当两个或多个事务并发执行时,为了保证数据的安全性,将一个事务内部的操作与事务的操作隔离起来,不被其它正在执行的事务看到。持久性(Durability):持久性也被称为永久性,事务完成之后,DBMS 保证它对数据库中的数据的修改是永久性的,当系统或介质发生故障时,该修改也永久保持。持久性一般通过数据库备份与恢复来保证。
范式
设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,各种范式呈递次规范,越高的范式数据库冗余越小。
目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)。满足最低要求的范式是第一范式(1NF)。在第一范式的基础上进一步满足更多规范要求的称为第二范式(2NF),其余范式以次类推。一般说来,数据库只需满足第三范式(3NF)就行了。
第一范式:指在关系模型中,对域添加的一个规范要求,所有的域都应该是原子性的,即数据库表的每一列都是不可分割的原子数据项,而不能是集合,数组,记录等非原子数据项。即实体中的某个属性有多个值时,必须拆分为不同的属性。在符合第一范式(1NF)表中的每个域值只能是实体的一个属性或一个属性的一部分。简而言之,第一范式就是无重复的域。考虑这样一个表,【联系人】(姓名,性别,电话),如果在实际场景中,一个联系人有家庭电话和公司电话,那么这种表结构设计就没有达到 1NF。要符合 1NF,需把列(电话)拆分,即:【联系人】(姓名,性别,家庭电话,公司电话)。第二范式:在 1NF 的基础上,还需包含两部分内容,一是表必须有一个主键;二是没有包含在主键中的列必须完全依赖于主键,而不能只依赖于主键的一部分。考虑一个订单明细表:【OrderDetail】(OrderID,ProductID,UnitPrice,Discount,Quantity,ProductName)。因为我们知道在一个订单中可以订购多种产品,所以单单一个 OrderID 是不足以成为主键的,主键应该是(OrderID,ProductID)。显而易见 Discount(折扣),Quantity(数量)完全依赖(取决)于主键(OderID,ProductID),而 UnitPrice,ProductName 只依赖于 ProductID。所以 OrderDetail 表不符合 2NF。不符合 2NF 的设计容易产生冗余数据。可以把【OrderDetail】表拆分为【OrderDetail】(OrderID,ProductID,Discount,Quantity)和【Product】(ProductID,UnitPrice,ProductName)来消除原订单表中 UnitPrice,ProductName 多次重复的情况。第三范式:在 2NF 的基础上,非主键列必须直接依赖于主键,不能存在传递依赖。即不能存在:非主键列 A 依赖于非主键列 B,非主键列 B 依赖于主键的情况。考虑一个订单表【Order】(OrderID,OrderDate,CustomerID,CustomerName,CustomerAddr,CustomerCity)主键是(OrderID)。其中 OrderDate,CustomerID,CustomerName,CustomerAddr,CustomerCity 等非主键列都完全依赖于主键(OrderID),所以符合 2NF。不过问题是 CustomerName,CustomerAddr,CustomerCity 直接依赖的是 CustomerID(非主键列),而不是直接依赖于主键,它是通过传递才依赖于主键,所以不符合 3NF。通过拆分【Order】为【Order】(OrderID,OrderDate,CustomerID)和【Customer】(CustomerID,CustomerName,CustomerAddr,CustomerCity)从而达到 3NF。
第二范式(2NF)和第三范式(3NF)的概念很容易混淆,区分它们的关键点在于,2NF:非主键列是否完全依赖于主键,还是依赖于主键的一部分;3NF:非主键列是直接依赖于主键,还是直接依赖于非主键列。
数据库设计的六个阶段
需求分析:分析用户的需求,包括数据、功能和性能需求。概念结构设计:主要采用 E-R 模型进行设计,包括画 E-R 图。逻辑结构设计:通过将 E-R 图转换成表,实现从 E-R 模型到关系模型的转换,进行关系规范化。物理设计:主要是为所设计的数据库选择合适的存储结构和存储路径。数据库的实施:包括编程、测试和试运行。数据库运行和维护:系统的运行与数据库的日常维护。
关系数据模型的三个组成部分
数据结构,操作集合(数据操纵),完整性约束。
数据库并发操作带来的问题
丢失更新:当两个或多个事物读入同一数据并修改,会发生丢失更新问题,即后一个事物更新的结果被前一事务所做更新覆盖。即当事务 A 和 B 同时进行时,事务 A 对数据已经改变但并未提交时 B 又对同一数据进行了修改(注意此时数据是 A 还未提交改变的数据),到时 A 做的数据改动丢失了。不可重复读:当两个数据读取某个数据后,另一事务执行了对该数据的更新,当前一事务再次读取该数据(希望与第一次读取的是相同的值)时,得到的数据与前一次的不一样,这是由于第一次读取数据后,事务 B 对其做了修改,导致再次读取数据时与第一次读取的数据不相同。脏读:当一个事务修改某个数据后,另一事务对该数据进行了读取,由于某种原因前一事务撤销了对改数据的修改,即将修改过的数据恢复原值,那么后一事务读到的数据与数据可得不一致,称之为脏数据。
注意:还有一个叫幽灵数据,与脏数据类似,不过幽灵数据是指事务提交之后读到的数据,但是在读取之后又进行了对前一事务的恢复,而脏数据是指提交前读取的数据。
聚集索引和非聚集索引
聚集索引:该索引中键值的逻辑顺序决定了表中相应行的物理顺序。聚集索引类似于电话簿,后者按姓氏排列数据。由于聚集索引规定数据在表中的物理存储顺序,因此一个表只能包含一个聚集索引。但该索引可以包含多个列,就像电话簿按姓氏和名字进行组织一样。非聚集索引:数据存储在一个地方,索引存储在另一个地方,索引带有指针指向数据的存储位置。非聚集索引中的项目按索引键值的顺序存储,而表中的信息按另一种顺序存储(这可以由聚集索引规定)。对于非聚集索引,可以为在表非聚集索引中查找数据时常用的每个列创建一个非聚集索引。有些书籍包含多个索引。例如,一本介绍园艺的书可能会包含一个植物通俗名称索引,和一个植物学名索引,因为这是读者查找信息的两种最常用的方法。
数据库的三级模式
模式:模式又称概念模式或逻辑模式,对应于概念级。它是由数据库设计者综合所有用户的数据,按照统一的观点构造的全局逻辑结构,是对数据库中全部数据的逻辑结构和特征的总体描述,是所有用户的公共数据视图(全局视图,数据库的表,字段的类型等等)。它是由数据库管理系统提供的数据模式描述语言(Data Description Language,DDL)来描述、定义的,体现、反映了数据库系统的整体观。外模式:外模式又称子模式,对应于用户级。它是某个或某几个用户所看到的数据库的数据视图,是与某一应用有关的数据的逻辑表示。外模式是从模式导出的一个子集,包含模式中允许特定用户使用的那部分数据。用户可以通过外模式描述语言来描述、定义对应于用户的数据记录(外模式),也可以利用数据操纵语言(Data Manipulation Language,DML)对这些数据记录进行处理。外模式反映了数据库的用户观(视图、查出数据的表)。内模式:内模式又称存储模式,对应于物理级,它是数据库中全体数据的内部表示或底层描述,它描述了数据在存储介质上的存储方式及物理结构(顺序存储、按照B树结构存储还是按hash方法存储),对应着实际存储在外存储介质上的数据库。内模式由内模式描述语言来描述、定义,它是数据库的存储观。
数据库中数据不一致的原因:
数据冗余:如果数据库中存在冗余数据,比如两张表中都存储了用户的地址,在用户的地址发生改变时,如果只更新了一张表中的数据,那么这两张表中就有了不一致的数据。并发控制不当:比如某个订票系统中,两个用户在同一时间订同一张票,如果并发控制不当,可能会导致一张票被两个用户预订的情况。当然这也与元数据的设计有关。故障和错误:如果软硬件发生故障造成数据丢失等情况,也可能引起数据不一致的情况。因此我们需要提供数据库维护和数据恢复的一些措施。
Access 数据库的七种对象
表(Table):表是数据库的基本对象,是创建其它几种对象的基础。表由记录组成,记录由字段组成,表用来存贮数据库的数据,故又称数据表。查询(Query):查询可以按索引快速查找到需要的记录,按要求筛选记录并能连接若干个表的字段组成新表。窗体(Form):窗体提供了一种方便的浏览、输入及更改数据的窗口。还可以创建子窗体显示相关联的表的内容。窗体也称表单。报表(Report):报表的功能是将数据库中的数据分类汇总,然后打印出来,以便分析。宏(Macro):宏相当于 DOS 中的批处理,用来自动执行一系列操作。Access 列出了一些常用的操作供用户选择,使用起来十分方便。模块(Module):模块的功能与宏类似,但它定义的操作比宏更精细和复杂,用户可以根据自己的需要编写程序。模块使用 Visual Basic 编程。页:是一种特殊的直接连接到数据库中数据的一种 WEB 页。通过数据访问页将数据发布到 Internet 或 Intranet 上,并可以适用浏览器进行数据的维护和操作。
数据库处理一个查询的步骤
- 客户端发送一条查询给服务器;
- 服务器先会检查查询缓存
query cache,如果命中了缓存,则立即返回存储在缓存中的结果,否则进入下一个阶段; - 服务器端进行 SQL 解析
parsing,预处理transition,再由优化器optimization生成对应的执行计划; - 根据优化器生成的执行计划,调用存储引擎的 API 来执行分布
distribution查询; - 将结果返回给客户端。
E-R 模型的基本元素
实体(Entities):实体是首要的数据对象,常用于表示一个人、地方、某样事物或某个事件。一个特定的实体被称为实体实例(entity instance 或 entity occurrence)。实体用长方形框表示,实体的名称标识在框内。一般名称单词的首字母大写。关系(Relationships):关系表示一个或多个实体之间的联系。关系依赖于实体,一般没有物理概念上的存在。关系最常用来表示实体之间,一对一,一对多,多对多的对应。关系的构图是一个菱形,关系的名称一般为动词。关系的端点联系着角色(role)。一般情况下角色名可以省略,因为实体名和关系名已经能清楚的反应角色的概念,但有些情况下我们需标出角色名来避免歧义。属性(Attributes):属性为实体提供详细的描述信息。一个特定实体的某个属性被称为属性值。Employee 实体的属性可能有:emp-id, emp-name, emp-address, phone-no……。属性一般以椭圆形表示,并与描述的实体连接。属性可被分为两类:标识符(identifiers),描述符(descriptors)。Identifiers 可以唯一标识实体的一个实例(key),可以由多个属性组成。E-R 图中通过在属性名下加上下划线来标识。多值属性(multivalued attributes)用两条线与实体连接,eg:hobbies属性(一个人可能有多个hobby,如reading,movies…)。复合属性(Complex attributes)本身还有其它属性。
辨别强实体与弱实体:强实体内部有唯一的标识符。弱实体(weak entities)的标识符来自于一个或多个其它强实体。弱实体用双线长方形框表示,依赖于强实体而存在。
数据独立性
数据独立性是数据库系统的一个最重要的目标之一。它能使数据独立于应用程序。数据独立性包括数据的物理独立性和逻辑独立性。
物理独立性:物理独立性是指用户的应用程序与存储在磁盘上的数据库中数据是相互独立的。即,数据在磁盘上怎样存储由 DBMS 管理,用户程序不需要了解,应用程序要处理的只是数据的逻辑结构,这样当数据的物理存储改变了,应用程序不用改变。逻辑独立性:逻辑独立性是指用户的应用程序与数据库的逻辑结构是相互独立的,即,当数据的逻辑结构改变时,用户程序也可以不变。
关系代数基本操作符
选择操作符:选择表中符合条件的元组(行),\(\sigma_{p}(R)\),\(p\)表示选择条件,\(R\)表示表格。投影操作符:选择表中符合条件的(属性)列,\(\Pi_{A,B,…}(R)\),右下角表示表的域(每一列的表头)。并操作符:\(\cap\)。差操作符:\(-\)。笛卡儿积:\(\times\)。自然连接:\(\infty\)。