数据库系统概论
数据库、数据库管理系统、数据库系统
- 数据库(Database,DB)是长期存储在计算机内、有组织、可共享的大量数据的集合。
- 数据库管理系统(Database Management System,DBMS)位于用户和操作系统之间,是一种操纵和管理数据库的大型软件,用于建立、使用和维护数据库。DBMS可以对数据库进行统一的管理和控制,以保证数据的安全性和完整性,是数据库系统的核心。
- 数据库系统(Database System,DBS)通常由硬件、软件、数据库和用户组成,管理的对象是数据。其中软件主要包括操作系统、各种宿主语言、实用程序及数据库管理系统。数据库系统包括用户、数据、软件和硬件四大组件。
什么是数据库,数据库在计算机中起到的作用
①:看上一题
②:
链接
链接
数据库在计算机应用中的作用是:
- 实现数据共享
- 减少数据的冗余度
- 数据的独立性
- 数据实现集中控制
- 数据一致性和可维护性,以确保数据的安全性和可靠性
- 故障恢复。
数据库系统的作用
链接
数据库系统的出现使信息系统从以加工数据的程序为中心转向围绕共享的数据库为中心,既便于数据的集中管理,又有利于应用程序的研制和维护,提高了数据的利用率和相容率,提高了决策的可靠性。
百度百科
数据库系统(Database System),是由数据库及其管理软件组成的系统。
数据库系统是为适应数据处理的需要而发展起来的一种较为理想的数据处理系统,也是一个为实际可运行的存储、维护和应用系统提供数据的软件系统,是存储介质 、处理对象和管理系统的集合体。
常见的数据库系统:SQL Server、MySQl、Oracle
数据库设计的范式——三大范式
- 第一范式(1NF):
① 数据表不能存在重复的记录,即存在一个关键字。且主关键字应满足唯一性、非空性等的条件。
② 每个字段都不可再分,即已经分到最小。 - 第二范式(2NF):在1NF的基础上,且所有的非主关键字段都完全地依赖于主关键字;即每张表只描述一件事情,有主键。(第二范式需要确保数据库表中的每一列都和主键相关,而不能只与主键的某一部分相关(主要针对联合主键而言))
- 第三范式(3NF):在2NF的基础上, 且每个非主关键字不传递依赖于主键。(第三范式需要确保 数据表中的每一列数据都和主键直接相关,而不能间接相关)
数据模型
数据模型的三要素
- 数据结构
- 数据操作
- 完整性约束条件
常用数据模型
- 层次模型(Hierarchical Model)
- 网状模型(Network Model)
- 关系模型(Relational Model)
- 面向对象模型(Object Oriented Model)
E-R图
实体-联系模型(Entity-Relationship Model, E-R模型)。
在E-R概念模型中,信息由实体型、实体属性和实体间的联系三种概念单元来表示。
数据库三级模式
百度百科
人们为数据库设计了一个严谨的体系结构,数据库领域公认的标准结构是三级模式结构,它包括外模式、概念模式、内模式,有效地组织、管理数据,提高了数据库的逻辑独立性和物理独立性。用户级对应外模式,概念级对应概念模式,物理级对应内模式,使不同级别的用户对数据库形成不同的视图。所谓视图,就是指观察、认识和理解数据的范围、角度和方法,是数据库在用户“眼中"的反映,很显然,不同层次(级别)用户所“看到”的数据库是不相同的。
- 外模式又称子模式或用户模式,对应于用户级。 它是某个或某几个用户所看到的数据库的数据视图,是与某一应用有关的数据的逻辑表示。外模式是从模式导出的一个子集,包含模式中允许特定用户使用的那部分数据。用户可以通过外模式描述语言来描述、定义对应于用户的数据记录(外模式),也可以利用数据操纵语言(Data Manipulation Language,DML)对这些数据记录进行操作。外模式反映了数据库系统的用户观。
- 概念模式又称模式或逻辑模式,对应于概念级。 它是由数据库设计者综合所有用户的数据,按照统一的观点构造的全局逻辑结构,是对数据库中全部数据的逻辑结构和特征的总体描述,是所有用户的公共数据视图(全局视图)。它是由数据库管理系统提供的数据模式描述语言(Data Description Language,DDL)来描述、定义的。概念模式反映了数据库系统的整体观。
- 内模式又称存储模式,对应于物理级。 它是数据库中全体数据的内部表示或底层描述,是数据库最低一级的逻辑描述,它描述了数据在存储介质上的存储方式和物理结构,对应着实际存储在外存储介质上的数据库。内模式由内模式描述语言来描述、定义的。内模式反映了数据库系统的存储观。
数据库的安全性控制方法
链接
(1)环境级:对计算机系统的机房和设备加以保护,防止物理破坏。
(2)职员级:对数据库系统工作人员,加强劳动纪律和职业道德教育,并正确的授予其访问数据库的权限。
(3)操作系统级:防止未经授权的用户从操作系统层着手访问数据库。
(4)网络级:由于数据库系统允许用户通过网络访问,因此,网络软件内部的安全性对数据库的安全是很重要的。
(5)数据库系统级:检验用户的身份是否合法,检验用户数据库操作权限是否正确。
本节主要讨论数据库系统级的安全性问题。
数据库系统中一般采用用户标识和鉴别、存取控制、视图以及密码存储等技术进行安全控制。
数据库基本操作
增删改查语句
插入
INSERT INTO TABLE_NAME(COLUMN1_NAME, COLUMN2_NAME, ...)
VALUES(VALUE1, VALUE2, ...)
INSERT INTO TABLE_NAME
VALUES(VALUE1, VALUE2, ...)
第一种方式列出了表的列名,顺序与表结构可以不一致,添加值也按指定列对应的顺序添加。
第二种方式没有列出表的列名,值顺序必须与表结构一致。
修改
UPDATE TABLE_NAME
SET COLUMN1_NAME = VALUE1
[WHERE COLUMN2_NAME = VALUE2 [AND COLUMN3_NAME = VALUE3] ]
删除
DELETE FROM TABLE_NAME
[WHERE COLUMN_NAME = VALUE]
TRUNCATE TABLE TABLE_NAME
这种方式从一个表中删除所有行的速度要快于DELETE,TRUNCATE TABLE 语句是一种快速、无日志记录的方法。 TRUNCATE TABLE 语句只记录整个数据页的释放。
查询
SELECT *
FROM TABLE_NAME
[WHERE COLUMN_NAME = VALUE AND COLUMN2 > VALUE2, ...]
SELECT COLUMN1_NAME, COLUMN2_NAME, ...
FROM TABLE_NAME
[WHERE COLUMN_NAME = VALUE OR COLUMN4 > VALUE4, ...]
- AND, OR, NOT
- IS NULL, IS NOT NULL
- =, >=, <=, >, <
- LIKE
- BETWEEN
- IN
数据完整性的约束
P92
- 域(Domain)完整性
- 实体(Entity)完整性
- 引用完整性
- 用户定义完整性
约束
- NOT NULL
- PRIMARY KEY
- FOREIGN KEY
- UNIQUE
- CHECK
聚合函数
- AVG
- COUNT
- MAX
- MIN
- SUM
分组 GROUP BY
GROUP BY 语句用于结合聚合函数,根据一个或多个列对结果集进行分组。
SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_namei
SELECT studentno, SUM(usually * 0.3 + final * 0.7) AS '总分'
FROM score
WHERE final >= 75
GROUP BY studentno
[HAVING COUNT(*) >= 3]
[ORDER BY SUM(usually * 0.3 +final * 0.7) DESC]
排序 ORDER BY
SELECT COLUMN1_NAME, COLUMN2_NAME, ...
FROM TABLE_NAME
WHERE xxx
ORDER BY COLUMN1_NAME, COLUMN3_NAME, ... [ASC | DESC]
升序:ASC
降序:DESC
连接
- INNER JOIN:如果表中有至少一个匹配,则返回行
- LEFT JOIN:即使右表中没有匹配,也从左表返回所有的行
- RIGHT JOIN:即使左表中没有匹配,也从右表返回所有的行
- FULL JOIN:只要其中一个表中存在匹配,则返回行
INNER JOIN
SELECT column_name(s)
FROM table1
[INNER] JOIN table2
ON table1.column_name = table2.column_name;
游标 CURSOR
概念
游标实际上是一种能从包括多条数据记录的结果集中每次提取一条记录的机制。游标充当指针的作用。 尽管游标能遍历结果中的所有行,但它一次只指向一行。
概括来讲,SQL的游标是一种临时的数据库对象,既可以用来存放在数据库表中的数据行副本,也可以指向存储在数据库中的数据行的指针。游标提供了在逐行的基础上操作表中数据的方法。
索引 INDEX
概念
博客园链接
索引提供指针以指向存储在表中指定的数据,就好比一本字典中的目录,无需翻阅整本字典,利用目录就可以快速的定位查找到所需信息。使用索引可以大大提高数据库查询的速度。
索引是一个逻辑文件,包含从表或视图中一个或多个列生成的键,以及映射到指定数据行的存储位置指针。 ※
优点
- 加快数据检索。索引能够以一列或多列值为基础实现快速查找数据行。
- 优化查询。查询优化器是依赖于索引起作用高度,索引能够加速连接、排序和分组等操作。
- 强制实施行的唯一性。通过给列创建唯一索引,可以保证表中的数据不重复。
缺点
- 创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。
- 索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。
- 当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。
索引的分类
SqlServer中有多种索引类型:
- 按存储结构区分:“聚集索引”,“非聚集索引”。
- 按数据唯一性区分:“唯一索引”,“非唯一索引”。
- 按键列个数区分:“单一索引”,“复合索引”。
统计信息 STATISTICS
视图 VIEW
概念
P192
视图是从一个或多个表及其他视图中通过 SELECT 语句导出的虚拟表, 视图所对应数据的行和列数据来自定义视图查询所引用的表(视图中的数据来自定义视图所引用的表),并且在引用视图时动态生成。通过视图可以实现对基表数据的查询与修改。
视图为数据库用户提供了很多的便利,主要包括:
- 简化数据查询和处理。视图可以为用户集中多个表中的数据,简化用户对数据的查询和处理。
- 屏蔽数据库的复杂性。数据库表的更改不影响用户对数据库的使用,用户也不必了解复杂的数据库中的表结构。
- 安全性。如果想要使用户只能查询或修改用户有权限访问的数据,也可以只授予用户访问视图的权限,而不授予访问表的权限,这样就提高了数据库的安全性。
创建视图
CREATE VIEW V_score
AS
SELECT studentno, courseno, final
FROM score
WHERE final >= 80
修改视图
ALTER VIEW V_score
AS
SELECT *
FROM score
WHERE final <= 90
重命名视图
EXEC sp_rename 'V_old', 'V_new'
注意: 更改对象名的任一部分都可能会破坏脚本和存储过程。(这是在执行上述SQL语句时 SSMS 给出的提示),虽然可以重命名成功,但是不建议使用此语句来重命名 存储过程、触发器、用户定义函数或视图 等数据库对象,而是将其删除,然后使用新名称重新创建。
删除视图
DROP VIEW V_score
存储过程 PROCEDURE
简介
"CREATE PROCEDURE"必须是批处理中仅有的语句。
存储过程(Stored Procedure)是一组完成特定功能的 Transact-SQL 语句的集合,即将一些固定的操作集中起来由 SQL Server 服务器来完成,应用程序只需调用它就可以实现某个特定的任务。存储过程可以通过用户、其他存储过程或触发器来调用执行。
优点
利用存储过程可以让系统达到如下目的:
- 提高了处理复杂任务的能力。
- 增强了代码的复用率和共享性。
- 减少了网络中数据的流量。
- 存储过程在服务器注册,加快了过程的运行速度。
- 存储过程只在创建时进行编译,以后每次执行存储过程都不需要再重新编译,而一般SQL语句每执行一次就编译一次,所以使用存储过程课提高数据库执行速度。
- 加强了系统的安全性。
缺点
- SQL本身是一种结构化查询语言,但不是面向对象的的,本质上还是过程化的语言,面对复杂的业务逻辑,过程化的处理会很吃力。同时SQL擅长的是数据查询而非业务逻辑的处理,如果如果把业务逻辑全放在存储过程里面,违背了这一原则。
- 如果需要对输入存储过程的参数进行更改,或者要更改由其返回的数据,则您仍需要更新程序集中的代码以添加参数、更新调用,等等,这时候估计会比较繁琐了。
- 开发调试复杂,由于IDE的问题,存储过程的开发调试要比一般程序困难。
- 没办法应用缓存。虽然有全局临时表之类的方法可以做缓存,但同样加重了数据库的负担。如果缓存并发严重,经常要加锁,那效率实在堪忧。
- 不支持群集,数据库服务器无法水平扩展,或者数据库的切割(水平或垂直切割)。数据库切割之后,存储过程并不清楚数据存储在哪个数据库中。
创建存储过程
1. 不带参数
CREATE PROC Proc1
AS
SELECT *
FROM score
WHERE usually >= 80
CREATE PROC
CREATE PROCEDURE
2. 带一个参数
CREATE PROC Proc2
@target int
AS
SELECT *
FROM score
WHERE usually >= @target
3. 参数有默认值、带输出参数
CREATE PROC Proc3
@target int = 80, @avg numeric(6, 2) OUTPUT
AS
SELECT @avg = AVG(usually)
FROM score
WHERE usually >= @target
修改存储过程
ALTER PROC Proc1
WITH ENCRYPTION
AS
SELECT *
FROM score
WHERE usually >= 80
[WITH { RECOMPILE | ENCRYPTION }]
- RECOMPILE:表明 SQL Server 不会缓存该过程的计划,该过程在运行时重新编译
- ENCRYPTION:表示在 syscomments 表中加密 CREATE PROCEDURE 语句文本
此时,若使用系统存储过程 sp_helpertext 显示存储过程的定义,则结果显示为“对象 ‘Proc1’ 的文本已加密。”
EXECUTE sp_helptext Proc1
执行存储过程
1. 不带参数
EXEC Proc1
2. 带一个参数
EXEC Proc2 @target = 70
3. 参数有默认值、带输出参数
DECLARE @average numeric(6, 2)
EXEC Proc3 @target = 70, @avg = @average OUTPUT
SELECT @average
触发器 TRIGGER
概念
触发器(Trigger)是一种响应数据操作语言(DML)事件或数据定义语言(DDL)事件而执行的特殊类型的存储过程,是在用户对某一表中的数据进行 UPDATE、INSERT 和 DELETE 操作时被触发执行的一段程序。触发器助于强制引用完整性,以便在添加、更新或删除表中的行时保留表之间已定义的关系。
分类
- DML 触发器(INSERT UPDATE DELETE)
- AFTER 触发器
- INSTEAD OF 触发器
- CLR 触发器
- DDL 触发器(CREATE ALTER DROP)
事务 TRANSACTION
概念
事物是由一系列的数据操作命令组成,是数据库应用程序的基本逻辑单元。在 SQL Server 中,以事务为基本操作单位,使用锁来实现并发控制。
特点(ACID)
在 SQL Server 中事务作为单个逻辑工作单元来执行一系列操作,具有如下4个特点:(ACID)
- 原子性(Atomicity)
事务包含的一系列数据库是一个整体,执行过程中要么全部执行,要么全部不执行。执行部分操作,则数据会回滚到原来的状态。 - 一致性(Consistency)
事务执行完成后,将数据库从一个一致状态转变到另一个一致状态,事务不能违背定义在数据库中的任何完整性检查(事务操作前后,数据一直保存合法的状态)。一致性在逻辑上不是独立的,它是由事务的隔离性来表示。 - 隔离性(Isolation)
一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。该机制是通过对事务的数据访问对象加适当的 锁,排除其他事务对同一数据库对象的并发操作来实现的。 - 持久性(Durability)
要求一旦事务提交,那么对数据库所做的修改将是持久的,无论发生何种机器和系统故障,都不应该对其有任何影响。
事务的四大特性(ACID)的实现原理
事务的隔离级别
如果不考虑事务的隔离性,会发生的几种问题:
-
脏读
脏读是指在一个事务处理过程里读取了另一个未提交的事务中的数据。
当一个事务正在多次修改某个数据,而在这个事务中这多次的修改都还未提交,这时一个并发的事务来访问该数据,就会造成两个事务得到的数据不一致 -
不可重复读
不可重复读是指在对于数据库中的某个数据,一个事务范围内多次查询却返回了不同的数据值,这是由于在查询间隔,被另一个事务修改并提交了。
例如事务T1在读取某一数据,而事务T2立马修改了这个数据并且提交事务给数据库,事务T1再次读取该数据就得到了不同的结果,发送了不可重复读。
不可重复读和脏读的区别是,脏读是某一事务读取了另一个事务未提交的脏数据,而不可重复读则是读取了前一事务提交的数据。
在某些情况下,不可重复读并不是问题,比如我们多次查询某个数据当然以最后查询得到的结果为主。但在另一些情况下就有可能发生问题,例如对于同一个数据A和B依次查询就可能不同,A和B就可能打起来了…… -
虚读(幻读)
幻读是事务非独立执行时发生的一种现象。例如事务T1对一个表中所有的行的某个数据项做了从“1”修改为“2”的操作,这时事务T2又对这个表中插入了一行数据项,而这个数据项的数值还是为“1”并且提交给数据库。而操作事务T1的用户如果再查看刚刚修改的数据,会发现还有一行没有修改,其实这行是从事务T2中添加的,就好像产生幻觉一样,这就是发生了幻读。
幻读和不可重复读都是读取了另一条已经提交的事务(这点就脏读不同),所不同的是不可重复读查询的都是同一个数据项,而幻读针对的是一批数据整体(比如数据的个数)。
现在来看看MySQL数据库为我们提供的四种隔离级别:
① Serializable (串行化):可避免脏读、不可重复读、幻读的发生。
② Repeatable read (可重复读):可避免脏读、不可重复读的发生。
③ Read committed (读已提交):可避免脏读的发生。
④ Read uncommitted (读未提交):最低级别,任何情况都无法保证。
分类
任何对数据的修改都是在事务环境中进行的
- 系统定义事务
- 自动提交事务
SQL SERVER 将一切操作作为事务处理,它不会在事务以外更改数据。如果没有用户定义事务,SQL SERVER 会自己定义事务,称为自动提交事务。每条单独的语句都是一个事务。 - 分布式事务
- 自动提交事务
- 用户定义事务
- 显式事务
启动:BEGIN TRANSACTION
结束:COMMIT TRANSACTION || ROLLBACK TRANSACTION - 隐式事务
SET IMPLICIT_TRANSACTIONS ON / OFF
- 显式事务
启动事务
显式事务
BEGIN {TRAN | TRANSACTION} [{transaction_name | @tran_name_variable}]
[WITH MARK{ 'description' }]
DECLARE @TranName VARCHAR(20);
SELECT @TranName = 'UPDATE_USUALLY';
BEGIN TRAN @TranName;
UPDATE score SET usually = 66
WHERE studentno = 11111
COMMIT TRAN @TranName;
保存事务
BEGIN TRAN
INSERT INTO score
VALUES(222,222,'222','222')
SAVE TRAN SAVEPOINT;
DELETE FROM score
WHERE studentno = 222;
ROLLBACK TRAN SAVEPOINT;
COMMIT TRAN;
管理锁
解决数据库的并发操作导致的数据错误
P235
使用排他锁,就是当一个事务在进行操作的时候,其他事务不能进行操作,只有一个操作结束之后才能进行其他关于这个资源的操作。锁的范围是行。
锁的范围:行锁: 对某行记录加上锁 ; 表锁: 对整个表加上锁
共享锁(S):保护资源,以便只能对其进行读取访问。当资源上存在共性锁时,其他事务均不能修改数据。
排他锁(X):指示数据修改,例如插入、更新或删除。确保不能同时对同一资源进行多个更新。