数据库基本知识补充
2016-09-07 10:59
316 查看
数据库
1. 基本概念
1.1 数据库与数据库管理系统
(1)数据库管理技术三个阶段:
ü 人工管理阶段:数据与应用程序一一对应,数据和应用程序不具有独立性;数据会大量重复。
ü 文件管理阶段:数据以文件的形式保存在计算机中,操作系统中的文件系统来管理文件中的数据。冗余度大;面向应用,程序与数据相互独立;无法实现统一控制;
ü 数据库管理阶段:3个特点
数据是结构化的,面向系统的,数据冗余度小,从而节约了存储空间,减少了对数据的存取时间,提高了数据的访问效率,避免了数据的不一致性。同时提高了数据的可扩充性和数据应用的灵活性。
数据具有独立性。物理独立型和逻辑独立性。
保证了数据的完整性、安全性和并发性;
数据库技术的根本目标是实现数据的共享;
1.2 数据库系统(DBS)包括:数据库(DB)、硬件、软件(数据库管理系统(DBMS)、应用程序、操作系统)、人员(DBA/系统分析员、数据库设计人员/应用程序员/用户)
1.3 数据库管理系统:
(1)功能:
ü 数据库定义:DDL(数据库描述语言)
ü 数据库操作:DML(数据库操作语言)
ü 数据库运行管理
ü 数据库的组织、存储和管理
ü 数据的建立和维护
ü 其他
(2)特征:
ü 数据结构化且统一管理
ü 有较高的独立性
ü 数据控制功能:安全性、完整性(正确性与相容性)、并发控制、故障恢复
1.4 数据库系统的体系结构
RDBMS 是SQL 的基础,同样也是所有现代数据库系统的基础,比如MS SQL Server, IBM DB2, Oracle, MySQL 以及Microsoft Access。hadoop是分布式数据库
集中式:DBMS和应用程序都存放在同一台计算机上,并存有所有用户的数据,其余各节点作为终端通过通信线向计算机发出应用请求。
主从式/(客户端/服务器):DBMS存放在服务器上,而应用程序存放在客户端上;
分布式数据库:数据库在物理上分布在不同的场地,而在逻辑上是一个整体。数据存放在计算机网络的不同场地的计算机中,每一场地都有自治处理功能并完成局部作用;而每一个场地也参加(至少一种)全局应用程序的执行,全局应用程序可通过网络通信访问系统的多个场地的数据。
1.5 数据库的三级模式结构:
(物理层)(逻辑层) (视图层)
内模式——>概念模式——>外模式(三级模式)
| |
模式/内模式 外模式/模式(二层映像)
保证了物理独立性和逻辑独立性;
2. 数据模型
2.1 基本概念
(1)概念数据模式:E-R模型(实体—联系模型)。
(2)基本数据模型:层次模型、网状模型、关系模型、面向对象模型(用于DBMS的实现)。
2.2 数据模型的三要素:数据结构、数据操作、数据的约束条件
2.3 E-R模型
(1)现实概念
ü 属性:事物的某一特性。属性所取的具体值成称为属性值。属性变量的取值范围称为域。
ü 实体:若干属性的属性值的集合。实体(李明、20、女、教授)、实体型(姓名、年龄、性别、职称)、实体集(教师)。
ü 联系:3种类型:1:1(一对一)、1:n(一对多)、m:n多对多
(2)数据概念
ü 字段—>属性
ü 记录—>实体
ü 记录型—>实体型
ü 文件—>实体集
ü 关键字:能够唯一标识一个记录的字段集;
3. 关系代数
3.1关系数据库的基本概念
(1)属性和域
(2)笛卡尔积
(3)关系的相关名词
ü 目或度:n元
ü 候选码:若关系中的某一属性或属性组的值能唯一地标识一个元组;
ü 主码:从多个候选码中选一个作为主码;
ü 主属性:包含在任何候选码中的诸属性称为诸属性;
ü 外码
ü 全码
(4)关系的三种类型:基本表、查询表、视图表
(5)关系数据库模式
(6)完整性约束:实体完整性、参照完整性、用户自定义完整性
(1)并:R∪S
(2)差:R-S
(3)交:R∩S
(4)笛卡儿积:R*S
(5)选择:R[g]/ σg(R):g是逻辑运算符∧与∨或乛非组成的逻辑运算符:选择行
(6)投影:πSN,C/R[SN,C]:选择列
(7)等值连接运算(jion):从哪个笛卡儿积中选择出符合条件的行;RΙΧΙS(下面有1=3)
(8)自然连接运算(natural jion)RΙΧΙS:找相同属性的
(9)除R÷S:
(10)外连接(左、右、全)
4.SQL语言
4.2 SQL的数据类型
Char、numeric[精度,[标度]]、decimal[精度,[标度]]、int、smallint、float、real、doubleprecision
聚集索引是一种索引,该索引中键值的逻辑顺序决定了表中相应行的物理顺序。
聚集索引确定表中数据的物理顺序。聚集索引类似于电话簿,按姓氏排列数据。由于聚集索引规定数据在表中的物理存储顺序,因此一个表只能包含一个聚集索引。但该索引可以包含多个列(组合索引),就像电话簿按姓氏和名字进行组织一样。
聚集索引对于那些经常要搜索范围值的列特别有效。使用聚集索引找到包含第一个值的行后,便可以确保包含后续索引值的行在物理相邻。例如,如果应用程序执行的一个查询经常检索某一日期范围内的记录,则使用聚集索引可以迅速找到包含开始日期的行,然后检索表中所有相邻的行,直到到达结束日期。这样有助于提高此类查询的性能。同样,如果对从表中检索的数据进行排序时经常要用到某一列,则可以将该表在该列上聚集(物理排序),避免每次查询该列时都进行排序,从而节省成本。
当索引值唯一时,使用聚集索引查找特定的行也很有效率。例如,使用唯一雇员 ID 列 emp_id 查找特定雇员的最快速的方法,是在 emp_id 列上创建聚集索引或 PRIMARY KEY 约束。
在RDBMS中索引一般采用B+树、HASH索引来实现
索引:
1) 字段的离散度越高,越适合做索引;(外键主键)
2) 占用存储空间少的,存储空间固定,越适合作索引;
3) Where、Group by、Order by更适合做索引
4) 更新字段频繁的不适合做,不会出现在 where 子句中的字段不应该创建索引。
应尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,如:
select id from t where num=10 or num=20
可以这样查询:
select id from t where num=10
union all
select id from t where num=20
union和union all的区别是,union会自动压缩多个结果集合中的重复结果,而union all则将所有的结果全部显示出来,不管是不是重复。
视图包含下列结构是不可以更新的
1:集合运算符 union,union all,intersect,minus
2:distinct关键字
3:group by,orderby,connect by,或者start with
4:子查询
5:分组函数
6:需要更新的列不是视图定义的
7:具有连接查询(可以更新键值保存表的数据)
8:违反基表的约束条件;连接视图是指基于多表连接查询创建的视图(一般不容易修改,但通用instead of触发器可以实现修改的功能)
试图与表的数据定义、操作、控制功能的比较
视图可以定义在多张表上,因此定义功能比表强。
视图中数据更新受到诸多限制,例如不能有聚集函数,不能是定义在多张表上等,因此操作功能弱于表。
视图的数据控制功能和表的数据控制功能相当,都有GRANT、REVOKE。
视图和表的区别和联系
区别:1、视图是已经编译好的sql语句。而表不是
2、视图没有实际的物理记录。而表有。
3、表是内容,视图是窗口
4、表只用物理空间而视图不占用物理空间,视图只是逻辑概念的存在,表可以及时对它进行修改,但视图只能有创建的语句来修改
5、表是内模式,视图是外模式
6、视图是查看数据表的一种方法,可以查询数据表中某些字段构成的数据,只是一些SQL语句的集合。从安全的角度说,视图可以不给用户接触数据表,从而不知道表结构。
7、表属于全局模式中的表,是实表;视图属于局部模式的表,是虚表。
8、视图的建立和删除只影响视图本身,不影响对应的基本表。
联系:视图(view)是在基本表之上建立的表,它的结构(即所定义的列)和内容(即所有数据行)都来自基本表,它依据基本表存在而存在。一个视图可以对应一个基本表,也可以对应多个基本表。视图是基本表的抽象和在逻辑意义上建立的新关系。
Oracle
tablespace是逻辑上的概念,datafile是物理上的概念。
一个tablespace可以由多个datafile组成,一个datafile不能跨越多个tablespace。table中的数据,通过hash算法分布在tablespace中的各个datafile中,tablespace是逻辑上的概念,datafile则在物理上储存了数据库的种种对象。
数据库Oracle 9i :
最大保护(Maximum protection )
这种模式能够保证在primary Database发生故障保证数据不丢失。在这种模式下,事务提交前,要保证Redo数据已经写入到Primary Database的Online Redologs,同时写入Standby Database的Standby Redologs,并确保至少在一个Standby Database中可用。如果Standby Database不可用,Primary Database将会shutdown。
最高可用性(Maximum availability)
这种模式在不影响Primary Database可用的前提下,提供最高级别的数据保护策略,这种模式也能够确保数据不丢失。事务提交之前,要保证Redo数据已经写入到Primary Database的Online Redologs,同时写入Standby Database的Standby Redologs,确保至少在一个Standby Database中可用。与最大保护模式不同的是,如果Standby Database出现故障导致不可用,Primary Database并不会被shutdown,而是自动转换为最高性能模式,等Standby
Database恢复正常后,Primary Database又会自动切换到最高可用性模式。
最大性能(Maximum performance)
这是一种默认的保护模式。事务可以随时提交,当前Primary Database的Redo数据至少需要写入一个Standby Database,不过这种方式不会等待Standby Database是否写入的确认因此这种写入属于异步写入。
Oracle进程
A,数据写进程(dbwr):负责将更改的数据从数据库缓冲区高速缓存写入数据文件
B,监控进程(pmon) :负责在一个 Oracle进程失败时清理资源
C,归档进程(arcn) :在每次日志切换时把已满的日志组进行备份或归档
D,系统监控(smon) :检查数据库的一致性如有必要还会在数据库打开时启动数据库的恢复
除此之外Oracle数据库还有其他一些进程,作用如下:
检查点进程(chpt):负责在每当缓冲区高速缓存中的更改永久地记录在数据库中时,更新控制文件和数据文件中的数据库状态信息。
恢复进程(reco):保证分布式事务的一致性,在分布式事务中,要么同时commit,要么同时rollback;
作业调度器(cjq):负责将调度与执行系统中已定义好的job,完成一些预定义的工作.
日志写进程(lgwr):将重做日志缓冲区中的更改写入在线重做日志文件
在Ibatis中我们使用SqlMap进行Sql查询时需要引用参数,在参数引用中遇到的符号#和$之间的区分为,#可以进行与编译,进行类型匹配,而$不进行数据类型匹配,例如: select * from table where id = #id# ,其中如果字段id为字符型,那么#id#表示的就是’id’类型,如果id为整型,那么#id#就是id类型。 select *from table where id = $id$ ,如果字段id为整型,Sql语句就不会出错,但是如果字段id为字符型,那么Sql语句应该写成
select * from table where id = ‘$id$‘
1.#是把传入的数据当作字符串,如#user_id_list#传入的是1,2,则sql语句生成是这样,in ('1,2') ,
2.$传入的数据直接生成在sql里,如$user_id_list$传入的是1,2,则sql语句生成是这样,in(1,2).
3.#方式能够很大程度防止sql注入,$方式无法防止sql注入.
5.$方式一般用于传入数据库对象.例如传入表名.
6.一般能用#的就别用$.
Mysql
查看Mysql表结构的命令,如下:
desc 表名;
show columns from 表名;
describe 表名;
show create table 表名;
use information_schema
select * from columns where table_name='表名';
mysqldump:备份,还原,按条件导出,导入,导出表
mysqladmin:用于执行管理性操作
MySQL数据库中,变量分为 系统变量(以"@@"开头)和用户自定义变量。系统变量分为全局系统变量(global)和会话系统变量(session)。
@@global 仅用于访问全局系统变量的值;
@@session 仅用于访问会话系统变量的值;
@@ 先访问会话系统变量的值,若不存在则去访问全局系统变量的值;
sql_mode 为系统变量,既是全局系统变量,又是会话系统变量。
触发程序与表相关,当对表执行INSERT、DELETE或UPDATE语句时,将激活触发程序。可以将触发程序设置为在执行语句之前或之后激活。例如,可以在从表中删除每一行之前,或在更新了要想创建触发程序或舍弃触发程序,可使用CREATE TRIGGER或DROP TRIGGER语句。
触发程序不能调用将数据返回客户端的存储程序,也不能使用采用CALL语句的动态SQL
(允许存储程序通过参数将数据返回触发程序)。
使用OLD和NEW关键字,能够访问受触发程序影响的行中的列(OLD和NEW不区分大小写)。在INSERT触发程序中,仅能使用NEW.col_name,没有旧行。在DELETE触发程序中,仅能使用OLD.col_name,没有新行。在UPDATE触发程序中,可以使用OLD.col_name来引用更新前的某一行的列,也能使用NEW.col_name来引用更新后的行中的列。
触发程序不能使用以显式或隐式方式开始或结束事务的语句,如START TRANSACTION、
COMMIT或ROLLBACK。
6.数据库的控制:
6.1事务管理
事务是应用程序中一系列严密的操作,所有的操作必须成功完成,否则在每个操作所作的更改都会被撤销。事务是数据库维护数据一致性的单位,在每个事务结束时,都能保持数据一致性;事务是DBMS的基本单位,是构成单一逻辑工作单元的操作集合。
在SQL语言中,事务定义的语句:
1) begin transaction:事务开始;
2) commit:事务提交;
3) RollBack:事务回滚;
BEGIN或START TRANSACTION;显示地开启一个事务;
COMMIT;也可以使用COMMIT WORK,不过二者是等价的。COMMIT会提交事务,并使已对数据库进行的所有修改称为永久性的;
ROLLBACK;有可以使用ROLLBACK WORK,不过二者是等价的。回滚会结束用户的事务,并撤销正在进行的所有未提交的修改;
SAVEPOINT identifier;SAVEPOINT允许在事务中创建一个保存点,一个事务中可以有多个SAVEPOINT;
RELEASE SAVEPOINT identifier;删除一个事务的保存点,当没有指定的保存点时,执行该语句会抛出一个异常;
ROLLBACK TO identifier;把事务回滚到标记点;
SET TRANSACTION;用来设置事务的隔离级别。InnoDB存储引擎提供事务的隔离级别有READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ和SERIALIZABLE
事务的ACID性质:
原子性( Atomicity ):事务是原子的,要么都做,要么都不做;
一致性( Consistency ):事务的执行状态是从一个一致状态到另一个一致状态;
隔离性( Isolation ):事务相互隔离;
持续性( Durability ):一旦事务成功提交,即使数据库崩溃,数据库的更新操作也会永久有效;
未提交读(Read Uncommitted):允许脏读,也就是可能读取到其他会话中未提交事务修改的数据
提交读(Read Committed):只能读取到已经提交的数据
可重复读(Repeated Read):在同一个事务内的查询都是事务开始时刻一致的
串行读(Serializable):完全串行化的读,每次读都需要获得表级共享锁,读写相互都会阻塞
PROPAGATION_REQUIRED
如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择。
PROPAGATION_SUPPORTS
支持当前事务,如果当前没有事务,就以非事务方式执行。
PROPAGATION_MANDATORY
使用当前的事务,如果当前没有事务,就抛出异常。
PROPAGATION_REQUIRES_NEW
新建事务,如果当前存在事务,把当前事务挂起。
PROPAGATION_NOT_SUPPORTED
以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
PROPAGATION_NEVER
以非事务方式执行,如果当前存在事务,则抛出异常。
PROPAGATION_NESTED
如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作
6.2 数据的备份和恢复
6.3 并发控制
并发控制是指在多用户共享的系统中许多用户可能同时对同数据进行操作;
并发控制所带来的问题是数据的不一致性,主要有三类:丢失更新、可不重复读和读脏数据。主要原因是破坏了事务的隔离性;
并发控制技术
(1)概念:
数据库是一个多用户使用的共享资源。当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况。若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性。
加锁是实现数据库并发控制的一个非常重要的技术。当事务在对某个数据对象进行操作前,先向系统发出请求,对其加锁。加锁后事务就对该数据对象有了一定的控制,在该事务释放锁之前,其他的事务不能对此数据对象进行更新操作。
(2)锁的分类:
共享(S)锁:多个事务可封锁一个共享页;任何事务都不能修改该页;通常是该页被读取完毕,S锁立即被释放。
排它(X)锁:仅允许一个事务封锁此页;其他任何事务必须等到X锁被释放才能对该页进行访问;X锁一直到事务结束才能被释放。
更新(U)锁:更新锁在修改操作的初始化阶段用来锁定可能要被修改的资源,这样可以避免使用共享锁造成的死锁现象。因为使用共享锁时,修改数据的操作分为两步,首先获得一个共享锁,读取数据,然后将共享锁升级为排它锁,然后再执行修改操作。这样如果同时有两个或多个事务同时对一个事务申请了共享锁,在修改数据的时候,这些事务都要将共享锁升级为排它锁。这时,这些事务都不会释放共享锁而是一直等待对方释放,这样就造成了死锁。如果一个数据在修改前直接申请更新锁,在数据修改的时候再升级为排它锁,就可以避免死锁。
(3)锁的粒度:
在sql server2000中锁是具有粒度的,即可以对不同的资源加锁。锁定在较小的粒度的资源(例如行)上可以增加系统的并发量但需要较大的系统开销,从而也会影响系统的性能,因为锁定的粒度较小则操作可能产生的锁的数量会增加;锁定在较大的粒度(例如表)就并发而言是相当昂贵的,因为锁定整个表限制了其它事务对表中任意部分进行访问,但要求的开销较低,因为需要维护的锁较少,所以在这里是一种互相制约的关系。
Sqlserver2000中锁定的粒度包括行、页、扩展盘区、表、库等资源。
产生死锁的原因主要是:
(1)因为系统资源不足。
(2)进程运行推进的顺序不合适。
(3)资源分配不当等。
产生死锁的四个必要条件:
(1)互斥条件:一个资源每次只能被一个进程使用。
(2)请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
(3)不可剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。
(4)循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
SQL Server支持的备份类型有四种:
1、完全数据库备份
2、差异备份或称增量备份
3、事务日志备份: 事务日志用以保存数据库数据的变动,包括增删改等操作。
4、数据库文件和文件组备份
数据库中有可能会存在不一致的数据。
造成数据不一致的原因主要有:
ü 数据冗余
如果数据库中存在冗余数据,比如两张表中都存储了用户的地址,在用户的地址发生改变时,如果只更新了一张表中的数据,那么这两张表中就有了不一致的数据。
ü 并发控制不当
比如某个订票系统中,两个用户在同一时间订同一张票,如果并发控制不当,可能会导致一张票被两个用户预订的情况。当然这也与元数据的设计有关。
ü 故障和错误
如果软硬件发生故障造成数据丢失等情况,也可能引起数据不一致的情况。因此我们需要提供数据库维护和数据恢复的一些措施。
数据完整性可以分为四类。
1、实体完整性,实体完整性的目的是确保数据库中所有实体的唯一性,也就是不应出现完全相同的数据记录。
2、区域完整性,匹配完整性要求数据表中的数据位于某一个特定的允许范围内。
3、参考完整性,也称引用完整性,是用来维护相关数据表之间数据一致性的手段,通过实现参考完整性,可以避免因一个数据表的记录改变而造成另一个数据表内的数据变成无效值。
4、用户自定义完整性,用户自定义由用户根据实际应用中的需要自行定义。
数据库的压力测试:可扩展性、响应时间、并发性、吞吐量
存储过程是由流控制和SQL语句书写的过程,这个过程经编译和优化后存储在数据库服务器中,使用时只要调用即可。
使用存储过程有以下的优点:
1.存储过程的能力大大增强了SQL语言的功能和灵活性。存储过程可以用流控制语句编写,有很强的灵活性,可以完成复杂的判断和较复杂的运算。
2.可保证数据的安全性和完整性。通过存储过程可以使没有权限的用户在控制之下间接地存取数据库,从而保证数据的安全。通过存储过程可以使相关的动作在一起发生,从而可以维护数据库的完整性。
3.再运行存储过程前,数据库已对其进行了语法和句法分析,并给出了优化执行方案。这种已经编译好的过程可极大地改善SQL语句的性能。由于执行SQL语句的大部分工作已经完成,所以存储过程能以极快的速度执行。
4.可以降低网络的通信量。
5.使体现企业规则的运算程序放入数据库服务器中,以便集中控制。 当企业规则发生变化时在服务器中改变存储过程即可,无须修改任何应用程序。企业规则的特点是要经常变化,如果把体现企业规则的运算程序放入应用程序中,则当企业规则发生变化时,就需要修改应用程序工作量非常之大(修改、发行和安装应用程序)。如果把体现企业规则的运算放入存储过程中,则当企业规则发生变化时,只要修改存储过程就可以了,应用程序无须任何变化。
外键可以为空
1. 基本概念
1.1 数据库与数据库管理系统
(1)数据库管理技术三个阶段:
ü 人工管理阶段:数据与应用程序一一对应,数据和应用程序不具有独立性;数据会大量重复。
ü 文件管理阶段:数据以文件的形式保存在计算机中,操作系统中的文件系统来管理文件中的数据。冗余度大;面向应用,程序与数据相互独立;无法实现统一控制;
ü 数据库管理阶段:3个特点
数据是结构化的,面向系统的,数据冗余度小,从而节约了存储空间,减少了对数据的存取时间,提高了数据的访问效率,避免了数据的不一致性。同时提高了数据的可扩充性和数据应用的灵活性。
数据具有独立性。物理独立型和逻辑独立性。
保证了数据的完整性、安全性和并发性;
数据库技术的根本目标是实现数据的共享;
1.2 数据库系统(DBS)包括:数据库(DB)、硬件、软件(数据库管理系统(DBMS)、应用程序、操作系统)、人员(DBA/系统分析员、数据库设计人员/应用程序员/用户)
1.3 数据库管理系统:
(1)功能:
ü 数据库定义:DDL(数据库描述语言)
ü 数据库操作:DML(数据库操作语言)
ü 数据库运行管理
ü 数据库的组织、存储和管理
ü 数据的建立和维护
ü 其他
(2)特征:
ü 数据结构化且统一管理
ü 有较高的独立性
ü 数据控制功能:安全性、完整性(正确性与相容性)、并发控制、故障恢复
1.4 数据库系统的体系结构
RDBMS 是SQL 的基础,同样也是所有现代数据库系统的基础,比如MS SQL Server, IBM DB2, Oracle, MySQL 以及Microsoft Access。hadoop是分布式数据库
集中式:DBMS和应用程序都存放在同一台计算机上,并存有所有用户的数据,其余各节点作为终端通过通信线向计算机发出应用请求。
主从式/(客户端/服务器):DBMS存放在服务器上,而应用程序存放在客户端上;
分布式数据库:数据库在物理上分布在不同的场地,而在逻辑上是一个整体。数据存放在计算机网络的不同场地的计算机中,每一场地都有自治处理功能并完成局部作用;而每一个场地也参加(至少一种)全局应用程序的执行,全局应用程序可通过网络通信访问系统的多个场地的数据。
1.5 数据库的三级模式结构:
(物理层)(逻辑层) (视图层)
内模式——>概念模式——>外模式(三级模式)
| |
模式/内模式 外模式/模式(二层映像)
保证了物理独立性和逻辑独立性;
2. 数据模型
2.1 基本概念
(1)概念数据模式:E-R模型(实体—联系模型)。
(2)基本数据模型:层次模型、网状模型、关系模型、面向对象模型(用于DBMS的实现)。
2.2 数据模型的三要素:数据结构、数据操作、数据的约束条件
2.3 E-R模型
(1)现实概念
ü 属性:事物的某一特性。属性所取的具体值成称为属性值。属性变量的取值范围称为域。
ü 实体:若干属性的属性值的集合。实体(李明、20、女、教授)、实体型(姓名、年龄、性别、职称)、实体集(教师)。
ü 联系:3种类型:1:1(一对一)、1:n(一对多)、m:n多对多
(2)数据概念
ü 字段—>属性
ü 记录—>实体
ü 记录型—>实体型
ü 文件—>实体集
ü 关键字:能够唯一标识一个记录的字段集;
3. 关系代数
3.1关系数据库的基本概念
(1)属性和域
(2)笛卡尔积
(3)关系的相关名词
ü 目或度:n元
ü 候选码:若关系中的某一属性或属性组的值能唯一地标识一个元组;
ü 主码:从多个候选码中选一个作为主码;
ü 主属性:包含在任何候选码中的诸属性称为诸属性;
ü 外码
ü 全码
(4)关系的三种类型:基本表、查询表、视图表
(5)关系数据库模式
(6)完整性约束:实体完整性、参照完整性、用户自定义完整性
(1)并:R∪S
(2)差:R-S
(3)交:R∩S
(4)笛卡儿积:R*S
(5)选择:R[g]/ σg(R):g是逻辑运算符∧与∨或乛非组成的逻辑运算符:选择行
(6)投影:πSN,C/R[SN,C]:选择列
(7)等值连接运算(jion):从哪个笛卡儿积中选择出符合条件的行;RΙΧΙS(下面有1=3)
(8)自然连接运算(natural jion)RΙΧΙS:找相同属性的
(9)除R÷S:
(10)外连接(左、右、全)
4.SQL语言
SQL功能 | 动词 |
数据库查询(DML) | Select |
数据库定义(DDL) | Create、Drop、Alter |
数据库操纵(DML) | Insert、Update、Delete |
数据库控制(DCL) | Grant、Revoke |
Char、numeric[精度,[标度]]、decimal[精度,[标度]]、int、smallint、float、real、doubleprecision
聚集索引是一种索引,该索引中键值的逻辑顺序决定了表中相应行的物理顺序。
聚集索引确定表中数据的物理顺序。聚集索引类似于电话簿,按姓氏排列数据。由于聚集索引规定数据在表中的物理存储顺序,因此一个表只能包含一个聚集索引。但该索引可以包含多个列(组合索引),就像电话簿按姓氏和名字进行组织一样。
聚集索引对于那些经常要搜索范围值的列特别有效。使用聚集索引找到包含第一个值的行后,便可以确保包含后续索引值的行在物理相邻。例如,如果应用程序执行的一个查询经常检索某一日期范围内的记录,则使用聚集索引可以迅速找到包含开始日期的行,然后检索表中所有相邻的行,直到到达结束日期。这样有助于提高此类查询的性能。同样,如果对从表中检索的数据进行排序时经常要用到某一列,则可以将该表在该列上聚集(物理排序),避免每次查询该列时都进行排序,从而节省成本。
当索引值唯一时,使用聚集索引查找特定的行也很有效率。例如,使用唯一雇员 ID 列 emp_id 查找特定雇员的最快速的方法,是在 emp_id 列上创建聚集索引或 PRIMARY KEY 约束。
在RDBMS中索引一般采用B+树、HASH索引来实现
索引:
1) 字段的离散度越高,越适合做索引;(外键主键)
2) 占用存储空间少的,存储空间固定,越适合作索引;
3) Where、Group by、Order by更适合做索引
4) 更新字段频繁的不适合做,不会出现在 where 子句中的字段不应该创建索引。
应尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,如:
select id from t where num=10 or num=20
可以这样查询:
select id from t where num=10
union all
select id from t where num=20
union和union all的区别是,union会自动压缩多个结果集合中的重复结果,而union all则将所有的结果全部显示出来,不管是不是重复。
视图包含下列结构是不可以更新的
1:集合运算符 union,union all,intersect,minus
2:distinct关键字
3:group by,orderby,connect by,或者start with
4:子查询
5:分组函数
6:需要更新的列不是视图定义的
7:具有连接查询(可以更新键值保存表的数据)
8:违反基表的约束条件;连接视图是指基于多表连接查询创建的视图(一般不容易修改,但通用instead of触发器可以实现修改的功能)
试图与表的数据定义、操作、控制功能的比较
视图可以定义在多张表上,因此定义功能比表强。
视图中数据更新受到诸多限制,例如不能有聚集函数,不能是定义在多张表上等,因此操作功能弱于表。
视图的数据控制功能和表的数据控制功能相当,都有GRANT、REVOKE。
视图和表的区别和联系
区别:1、视图是已经编译好的sql语句。而表不是
2、视图没有实际的物理记录。而表有。
3、表是内容,视图是窗口
4、表只用物理空间而视图不占用物理空间,视图只是逻辑概念的存在,表可以及时对它进行修改,但视图只能有创建的语句来修改
5、表是内模式,视图是外模式
6、视图是查看数据表的一种方法,可以查询数据表中某些字段构成的数据,只是一些SQL语句的集合。从安全的角度说,视图可以不给用户接触数据表,从而不知道表结构。
7、表属于全局模式中的表,是实表;视图属于局部模式的表,是虚表。
8、视图的建立和删除只影响视图本身,不影响对应的基本表。
联系:视图(view)是在基本表之上建立的表,它的结构(即所定义的列)和内容(即所有数据行)都来自基本表,它依据基本表存在而存在。一个视图可以对应一个基本表,也可以对应多个基本表。视图是基本表的抽象和在逻辑意义上建立的新关系。
Oracle
tablespace是逻辑上的概念,datafile是物理上的概念。
一个tablespace可以由多个datafile组成,一个datafile不能跨越多个tablespace。table中的数据,通过hash算法分布在tablespace中的各个datafile中,tablespace是逻辑上的概念,datafile则在物理上储存了数据库的种种对象。
数据库Oracle 9i :
最大保护(Maximum protection )
这种模式能够保证在primary Database发生故障保证数据不丢失。在这种模式下,事务提交前,要保证Redo数据已经写入到Primary Database的Online Redologs,同时写入Standby Database的Standby Redologs,并确保至少在一个Standby Database中可用。如果Standby Database不可用,Primary Database将会shutdown。
最高可用性(Maximum availability)
这种模式在不影响Primary Database可用的前提下,提供最高级别的数据保护策略,这种模式也能够确保数据不丢失。事务提交之前,要保证Redo数据已经写入到Primary Database的Online Redologs,同时写入Standby Database的Standby Redologs,确保至少在一个Standby Database中可用。与最大保护模式不同的是,如果Standby Database出现故障导致不可用,Primary Database并不会被shutdown,而是自动转换为最高性能模式,等Standby
Database恢复正常后,Primary Database又会自动切换到最高可用性模式。
最大性能(Maximum performance)
这是一种默认的保护模式。事务可以随时提交,当前Primary Database的Redo数据至少需要写入一个Standby Database,不过这种方式不会等待Standby Database是否写入的确认因此这种写入属于异步写入。
Oracle进程
A,数据写进程(dbwr):负责将更改的数据从数据库缓冲区高速缓存写入数据文件
B,监控进程(pmon) :负责在一个 Oracle进程失败时清理资源
C,归档进程(arcn) :在每次日志切换时把已满的日志组进行备份或归档
D,系统监控(smon) :检查数据库的一致性如有必要还会在数据库打开时启动数据库的恢复
除此之外Oracle数据库还有其他一些进程,作用如下:
检查点进程(chpt):负责在每当缓冲区高速缓存中的更改永久地记录在数据库中时,更新控制文件和数据文件中的数据库状态信息。
恢复进程(reco):保证分布式事务的一致性,在分布式事务中,要么同时commit,要么同时rollback;
作业调度器(cjq):负责将调度与执行系统中已定义好的job,完成一些预定义的工作.
日志写进程(lgwr):将重做日志缓冲区中的更改写入在线重做日志文件
在Ibatis中我们使用SqlMap进行Sql查询时需要引用参数,在参数引用中遇到的符号#和$之间的区分为,#可以进行与编译,进行类型匹配,而$不进行数据类型匹配,例如: select * from table where id = #id# ,其中如果字段id为字符型,那么#id#表示的就是’id’类型,如果id为整型,那么#id#就是id类型。 select *from table where id = $id$ ,如果字段id为整型,Sql语句就不会出错,但是如果字段id为字符型,那么Sql语句应该写成
select * from table where id = ‘$id$‘
1.#是把传入的数据当作字符串,如#user_id_list#传入的是1,2,则sql语句生成是这样,in ('1,2') ,
2.$传入的数据直接生成在sql里,如$user_id_list$传入的是1,2,则sql语句生成是这样,in(1,2).
3.#方式能够很大程度防止sql注入,$方式无法防止sql注入.
5.$方式一般用于传入数据库对象.例如传入表名.
6.一般能用#的就别用$.
Mysql
查看Mysql表结构的命令,如下:
desc 表名;
show columns from 表名;
describe 表名;
show create table 表名;
use information_schema
select * from columns where table_name='表名';
mysqldump:备份,还原,按条件导出,导入,导出表
mysqladmin:用于执行管理性操作
MySQL数据库中,变量分为 系统变量(以"@@"开头)和用户自定义变量。系统变量分为全局系统变量(global)和会话系统变量(session)。
@@global 仅用于访问全局系统变量的值;
@@session 仅用于访问会话系统变量的值;
@@ 先访问会话系统变量的值,若不存在则去访问全局系统变量的值;
sql_mode 为系统变量,既是全局系统变量,又是会话系统变量。
触发程序与表相关,当对表执行INSERT、DELETE或UPDATE语句时,将激活触发程序。可以将触发程序设置为在执行语句之前或之后激活。例如,可以在从表中删除每一行之前,或在更新了要想创建触发程序或舍弃触发程序,可使用CREATE TRIGGER或DROP TRIGGER语句。
触发程序不能调用将数据返回客户端的存储程序,也不能使用采用CALL语句的动态SQL
(允许存储程序通过参数将数据返回触发程序)。
使用OLD和NEW关键字,能够访问受触发程序影响的行中的列(OLD和NEW不区分大小写)。在INSERT触发程序中,仅能使用NEW.col_name,没有旧行。在DELETE触发程序中,仅能使用OLD.col_name,没有新行。在UPDATE触发程序中,可以使用OLD.col_name来引用更新前的某一行的列,也能使用NEW.col_name来引用更新后的行中的列。
触发程序不能使用以显式或隐式方式开始或结束事务的语句,如START TRANSACTION、
COMMIT或ROLLBACK。
6.数据库的控制:
6.1事务管理
事务是应用程序中一系列严密的操作,所有的操作必须成功完成,否则在每个操作所作的更改都会被撤销。事务是数据库维护数据一致性的单位,在每个事务结束时,都能保持数据一致性;事务是DBMS的基本单位,是构成单一逻辑工作单元的操作集合。
在SQL语言中,事务定义的语句:
1) begin transaction:事务开始;
2) commit:事务提交;
3) RollBack:事务回滚;
BEGIN或START TRANSACTION;显示地开启一个事务;
COMMIT;也可以使用COMMIT WORK,不过二者是等价的。COMMIT会提交事务,并使已对数据库进行的所有修改称为永久性的;
ROLLBACK;有可以使用ROLLBACK WORK,不过二者是等价的。回滚会结束用户的事务,并撤销正在进行的所有未提交的修改;
SAVEPOINT identifier;SAVEPOINT允许在事务中创建一个保存点,一个事务中可以有多个SAVEPOINT;
RELEASE SAVEPOINT identifier;删除一个事务的保存点,当没有指定的保存点时,执行该语句会抛出一个异常;
ROLLBACK TO identifier;把事务回滚到标记点;
SET TRANSACTION;用来设置事务的隔离级别。InnoDB存储引擎提供事务的隔离级别有READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ和SERIALIZABLE
事务的ACID性质:
原子性( Atomicity ):事务是原子的,要么都做,要么都不做;
一致性( Consistency ):事务的执行状态是从一个一致状态到另一个一致状态;
隔离性( Isolation ):事务相互隔离;
持续性( Durability ):一旦事务成功提交,即使数据库崩溃,数据库的更新操作也会永久有效;
未提交读(Read Uncommitted):允许脏读,也就是可能读取到其他会话中未提交事务修改的数据
提交读(Read Committed):只能读取到已经提交的数据
可重复读(Repeated Read):在同一个事务内的查询都是事务开始时刻一致的
串行读(Serializable):完全串行化的读,每次读都需要获得表级共享锁,读写相互都会阻塞
PROPAGATION_REQUIRED
如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择。
PROPAGATION_SUPPORTS
支持当前事务,如果当前没有事务,就以非事务方式执行。
PROPAGATION_MANDATORY
使用当前的事务,如果当前没有事务,就抛出异常。
PROPAGATION_REQUIRES_NEW
新建事务,如果当前存在事务,把当前事务挂起。
PROPAGATION_NOT_SUPPORTED
以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
PROPAGATION_NEVER
以非事务方式执行,如果当前存在事务,则抛出异常。
PROPAGATION_NESTED
如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作
6.2 数据的备份和恢复
6.3 并发控制
并发控制是指在多用户共享的系统中许多用户可能同时对同数据进行操作;
并发控制所带来的问题是数据的不一致性,主要有三类:丢失更新、可不重复读和读脏数据。主要原因是破坏了事务的隔离性;
并发控制技术
(1)概念:
数据库是一个多用户使用的共享资源。当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况。若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性。
加锁是实现数据库并发控制的一个非常重要的技术。当事务在对某个数据对象进行操作前,先向系统发出请求,对其加锁。加锁后事务就对该数据对象有了一定的控制,在该事务释放锁之前,其他的事务不能对此数据对象进行更新操作。
(2)锁的分类:
共享(S)锁:多个事务可封锁一个共享页;任何事务都不能修改该页;通常是该页被读取完毕,S锁立即被释放。
排它(X)锁:仅允许一个事务封锁此页;其他任何事务必须等到X锁被释放才能对该页进行访问;X锁一直到事务结束才能被释放。
更新(U)锁:更新锁在修改操作的初始化阶段用来锁定可能要被修改的资源,这样可以避免使用共享锁造成的死锁现象。因为使用共享锁时,修改数据的操作分为两步,首先获得一个共享锁,读取数据,然后将共享锁升级为排它锁,然后再执行修改操作。这样如果同时有两个或多个事务同时对一个事务申请了共享锁,在修改数据的时候,这些事务都要将共享锁升级为排它锁。这时,这些事务都不会释放共享锁而是一直等待对方释放,这样就造成了死锁。如果一个数据在修改前直接申请更新锁,在数据修改的时候再升级为排它锁,就可以避免死锁。
(3)锁的粒度:
在sql server2000中锁是具有粒度的,即可以对不同的资源加锁。锁定在较小的粒度的资源(例如行)上可以增加系统的并发量但需要较大的系统开销,从而也会影响系统的性能,因为锁定的粒度较小则操作可能产生的锁的数量会增加;锁定在较大的粒度(例如表)就并发而言是相当昂贵的,因为锁定整个表限制了其它事务对表中任意部分进行访问,但要求的开销较低,因为需要维护的锁较少,所以在这里是一种互相制约的关系。
Sqlserver2000中锁定的粒度包括行、页、扩展盘区、表、库等资源。
产生死锁的原因主要是:
(1)因为系统资源不足。
(2)进程运行推进的顺序不合适。
(3)资源分配不当等。
产生死锁的四个必要条件:
(1)互斥条件:一个资源每次只能被一个进程使用。
(2)请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
(3)不可剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。
(4)循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
SQL Server支持的备份类型有四种:
1、完全数据库备份
2、差异备份或称增量备份
3、事务日志备份: 事务日志用以保存数据库数据的变动,包括增删改等操作。
4、数据库文件和文件组备份
数据库中有可能会存在不一致的数据。
造成数据不一致的原因主要有:
ü 数据冗余
如果数据库中存在冗余数据,比如两张表中都存储了用户的地址,在用户的地址发生改变时,如果只更新了一张表中的数据,那么这两张表中就有了不一致的数据。
ü 并发控制不当
比如某个订票系统中,两个用户在同一时间订同一张票,如果并发控制不当,可能会导致一张票被两个用户预订的情况。当然这也与元数据的设计有关。
ü 故障和错误
如果软硬件发生故障造成数据丢失等情况,也可能引起数据不一致的情况。因此我们需要提供数据库维护和数据恢复的一些措施。
数据完整性可以分为四类。
1、实体完整性,实体完整性的目的是确保数据库中所有实体的唯一性,也就是不应出现完全相同的数据记录。
2、区域完整性,匹配完整性要求数据表中的数据位于某一个特定的允许范围内。
3、参考完整性,也称引用完整性,是用来维护相关数据表之间数据一致性的手段,通过实现参考完整性,可以避免因一个数据表的记录改变而造成另一个数据表内的数据变成无效值。
4、用户自定义完整性,用户自定义由用户根据实际应用中的需要自行定义。
数据库的压力测试:可扩展性、响应时间、并发性、吞吐量
存储过程是由流控制和SQL语句书写的过程,这个过程经编译和优化后存储在数据库服务器中,使用时只要调用即可。
使用存储过程有以下的优点:
1.存储过程的能力大大增强了SQL语言的功能和灵活性。存储过程可以用流控制语句编写,有很强的灵活性,可以完成复杂的判断和较复杂的运算。
2.可保证数据的安全性和完整性。通过存储过程可以使没有权限的用户在控制之下间接地存取数据库,从而保证数据的安全。通过存储过程可以使相关的动作在一起发生,从而可以维护数据库的完整性。
3.再运行存储过程前,数据库已对其进行了语法和句法分析,并给出了优化执行方案。这种已经编译好的过程可极大地改善SQL语句的性能。由于执行SQL语句的大部分工作已经完成,所以存储过程能以极快的速度执行。
4.可以降低网络的通信量。
5.使体现企业规则的运算程序放入数据库服务器中,以便集中控制。 当企业规则发生变化时在服务器中改变存储过程即可,无须修改任何应用程序。企业规则的特点是要经常变化,如果把体现企业规则的运算程序放入应用程序中,则当企业规则发生变化时,就需要修改应用程序工作量非常之大(修改、发行和安装应用程序)。如果把体现企业规则的运算放入存储过程中,则当企业规则发生变化时,只要修改存储过程就可以了,应用程序无须任何变化。
外键可以为空
相关文章推荐
- [转载]关于数据库的一些基本知识
- Visual C# 2008+SQL Server 2005 数据库与网络开发--4.1.1 数据库基本知识
- vc小程序---右键菜单栏的建立以及简单的数据库连接的基本知识(PopMenu)
- PHP学习笔记(2)--PHP数据库操作基本知识
- PHP学习笔记(2)--PHP数据库操作基本知识
- 数据库基本知识(包括视图、触发器、存储过程、DTS等等)【转载】
- Java程序员从笨鸟到菜鸟之(九)――数据库有关知识补充(事务、视图、索引、存储过程)
- mysql 数据库基本知识
- 数据库的基本知识
- 该补充数据库知识了
- SQL Server 索引基础知识(8)--- 数据基本格式补充
- Domino数据库存取控制列表(ACL)基本知识
- 为初学者补充USB基本知识
- IE9做了冤大头,jquery基本知识补充
- 数据库基本知识
- SQL Server 索引基础知识(8)--- 数据基本格式补充
- SQL Server 索引基础知识(8)--- 数据基本格式补充
- c#中的一些基本知识 - 待补充
- SQL Server 索引基础知识(8)--- 数据基本格式补充
- Java程序员从笨鸟到菜鸟之(九)——数据库有关知识补充(事务、视图、索引、存储过程)