首页 > 代码库 > 数据库有基础知识

数据库有基础知识

一、基本概念

   DBMS:Database Management System数据库管理系统,是一种操纵和管理数据库的大型软件,用于建立、使用和维护数据库。

  RDBMS:Relational Database Management System关系型数据库管理系统,就是在数据库管理系统的基础上增加关系,通过数据、关系和对数据的约束三者组成的数据模型来存放和管理数据。

  SQL:Structed Query Language结构化查询语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。

  IDE:Integrated Development Environment 集成开发环境。 

  数据库系统的核心目标就是:在实现功能需求的基础上,保证数据完整性和数据存取性能。

 

扩展数据库:

1 设置数据库为自增长方式;

2 增加数据库中数据文件和日志文件的大小,也就是修改MAXSIZE属性;

3 为数据库增加新的次要数据文件或日志文件。(最优)

收缩数据库:

1 设置数据库为自动收缩,设置AUTO_SHRINK数据库选项实现;

2 手动执行DBCC SHRINKDATABASE语句来收缩整个数据库的大小;

3 执行DBCC SHRINKFILE语句手动收缩数据库中文件的大小。

 

为什么使用数据库?

a.高效一致的结构化数据存取方法,进行复杂的任意条件组合嵌套的数据查询(关系数据库管理系统甚至为实现这一功能专门设计了一种语言:SQL)

b.保障数据操作的原子性、一致性、分离性、持久性。

c.确保在服务器断电、网络中断、服务器崩溃、客户端崩溃的情况下,故障恢复后数据仍然是完整的

d.在服务器被完全物理摧毁的情况下,快速在新的服务器上使用远程设备上的备份将数据恢复到灾难发生之前的状态

e.随时将数据恢复到任意时刻或任意一个操作之前。

 

原子性:事务的原子性指的是,事务中包含的程序作为数据库的逻辑工作单位,它所做的对数据修改操作要么全部执行,要么完全不执行。这种特性称为原子性。
一致性:事务的一致性指的是在一个事务执行之前和执行之后数据库都必须处于一致性状态。这种特性称为事务的一致性。假如数据库的状态满足所有的完整性约束,就说该数据库是一致的。

分离性:分离性指并发的事务是相互隔离的。即一个事务内部的操作及正在操作的数据必须封锁起来,不被其它企图进行修改的事务看到。    分离性是DBMS针对并发事务间的冲突提供的安全保证。

持久性:持久性意味着当系统或介质发生故障时,确保已提交事务的更新不能丢失。即一旦一个事务提交,DBMS保证它对数据库中数据的改变应该是永久性的,耐得住任何系统故障。持久性通过数据库备份和恢复来保证。 

 

二、备份数据库 

备份就是把数据库复制到转储设备的过程。其中,转储设备是指用于放置数据库拷贝的磁带或磁盘。

备份限制:

隐式或显式引用脱机数据的任何备份操作都会失败。

数据库正在使用时,sql server可以使用联机备份过程来备份数据库。在备份过程中可以进行insert into、update、delete操作,但如果在正在创建或删除数据库文件时尝试启动备份操作,则备份操作将等待。

所有的恢复模式都允许备份完整或部分的sql server数据库或数据库的单个文件或文件组。不能创建表级备份。

 

备份和还原原理: 

如前所述,数据文件mdf保存了数据的实时状态,事务日志文件ldf记录了数据库中数据变化的过程。此时,要对数据库进行备份,自然而然就有两个选择: 

因为mdf文件中保存了数据库中数据的实时状态,那么只要把mdf文件拷贝一份就实现了当前时刻的数据库备份。 

既然ldf文件中保存了数据库中数据变化的整个过程,那么就可以把这个ldf文件备份起来,然后用这些备份的事务日志记录从头重建整个数据库,而且比至第一种方法,通过事务日志记录恢复的方法可以将数据库恢复到任一时刻。 

实际上,Sql Server同时使用了这两种方法。

 

数据备份: 

数据备份很简单,就是拷贝mdf文件。 

但是如果数据库特别大,比如几十个G,将整个mdf文件拷贝一遍会占用大量的IO资源和磁盘空间。考虑到mdf文件内容是分页保存的,而且数据库中的数据在一定时间内不会全部发生变化,那么不必每次备份都把整个mdf文件都拷贝。只需要在每个页的页头中设一个bit位记录一下自从上次备份以来,这一页是否有被修改过,那么,有了上次的备份,只需要把那些发生了变化的页备份一下就可以。这就是Sql Server中的完整备份和差异备份。出于简化设计和简化备份恢复过程的考虑,虽然Sql Server在每个完整备份后面可以进行任意次的差异备份,但是所有的差异备份都是相对于最近一次完整备份的,而不是可能存在的上一次差异备份。很自然的,任何差异备份之前必须有一次完整备份。

 

三、数据库快照 

  数据库快照是数据库的只读静态视图。数据库快照提供源数据库在创建快照时的只读、静态视图,不包含未提交的事务。 

  自创建快照那刻起,数据库快照在事务上与源数据库一致。 数据库快照始终与其源数据库位于同一服务器实例上。 当源数据库更新时,数据库快照也将更新。 因此,数据库快照存在的时间越长,就越有可能用完其可用磁盘空间。给定源数据库中可以存在多个快照。 在数据库所有者显式删除每个数据库快照之前,该快照将一直保留。数据库快照在数据页级运行。数据库快照使用一个或者多个“稀疏文件”来存储数据。

 数据库快照与快照备份、事务的快照隔离或快照复制无关。

  

在MSDN中数据库快照的典型应用是 

1) 维护历史数据以生成报表。 

2) 使用为了实现可用性目标而维护的镜像数据库来卸载报表。 

3) 使数据免受管理失误所带来的影响。 

4) 使数据免受用户失误所带来的影响。

 

四、sqlserver和Transact-sql

 

Sql:结构化查询语言,structured Query Language。

Sql是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。Sql同时也是数据库脚本文件的扩展名。

Sql是高级的非过程化编程语言,允许用户在高层数据结构上工作。它不要求用户指定对数据的存放方法,也不需要用户了解具体的数据存放方式,所以具有完全不同底层结构的不同数据库系统可以使用相同的SQL语言作为数据输入与管理的接口。它以记录集合作为操作对象,所有SQL语句接受集合作为输入,返回集作为输出,这种集合特性允许一条sql语句的输出作为另外一条sql语句的输入,所以sql语句可以嵌套。

Transact-sql是:除了增加变量、运算符、函数、流程控制和注释等外,其本质仍然是sql语言。

 

DDL:data definition language。是对于数据库对象的控制语法,对数据库对象(数据表、预存程序、函授火自定义类型等)的新增、修改、删除操作使用的语法。CREATE、ALTER、DROP。

DML:data Manipulation Language。数据操作语言。一般开发人员俗称CRUD(create、retrieve、uadate、delete)功能,意指数据的新增、截取、修改、删除。(insert、select、uadate、delete)。

DCL:DATA CONTROL LANGUAGE,管理特定数据库上的用户与角色的安全权限的。GRANT:用于授予用户或角色权限集合。DENY:用于显式地限制权限集合。REVOKE:用于撤销对象上的权限集合。

 

五、数据库数据类型

字符数据类型有6种:

字符串:char、varchar、text;

Unicode字符串:nchar、nvarchar、ntext。

 

1,char,nchar,nvarchar,varchar有什么区别?  
2,text和ntext有什么区别以及和上面各种字符类有什么区别? 
3,关于带big和带small的类型,比如:smallint,int和bigint;以及smalldatetime,datetime和bigdatetime有什么区别?   

char和nchar是定长字符串类型,varchar和nvarchar是变长字符串类型。也就是说如果字段类型为char(10),那么即使你输入的字符为‘abc‘,在数据库中也会保存成‘ abc‘,字段前面会被自动补上7个空格。而使用varchar(10)则前面不会补空格。  char 和nchar 当填入数据为空时,数据库自动使用全空格来代替,从而使not null形同虚设。所以如果字段不能为空,一定要在程序中提前判断。  char 和nchar因为长度固定,读写的速度要比 varchar和nvarchar快  。

至于前面那个n有什么不同,有n代表支持unicode字符,而没有n的则不支持,text和ntext的区别也是一样。  一般情况下在仅仅处理中文及英文,不涉及特殊符号时不需要使用Unicode。另一种需要用Unicode的情况是需要将字符串数据添加到SQL语句中执行,又不想里面的东西如单引号使SQL产生误解,可以将其用Unicode编码,这时每个字符都将占用两个字节,单引号也不会被SQL识别了。 

text和char及varchar的区别在于,char和varchar字段的数据是保存在表中,而text字段可以保存大容量的文本,数据是保存在另外的空间里,当然在表面上看来并没有什么区别。  

关于带big和small的类型。small代表是简化的数据类型,支持的范围比较小,但占用的空间也小。big是超大的数据类型,占用的空间大,但支持的范围也大。比如smallint只占用一个字节,但是只能支持0-255的数字。datetime也是一样。  sql中没有bigdatetime类型。 

 

(1)二进制数据类型  

二进制数据包括 Binary、Varbinary 和 Image  

Binary 数据类型既可以是固定长度的(Binary),也可以是变长度的。  Binary[(n)] 是 n 位固定的二进制数据。其中,n 的取值范围是从 1 到 8000。其存储窨的大小是 n + 4 个字节。  

Varbinary[(n)] 是 n 位变长度的二进制数据。其中,n 的取值范围是从 1 到 8000。其存储窨的大小是 n + 4个字节,不是n 个字节。  

在 Image 数据类型中存储的数据是以位字符串存储的,不是由 SQL Server 解释的,必须由应用程序来解释。 例如,应用程序可以使用BMP、TIEF、GIF 和 JPEG 格式把数据存储在 Image 数据类型中。  

 

(2)字符数据类型  

字符数据的类型包括 Char,Varchar 和 Text  。字符数据是由任何字母、符号和数字任意组合而成的数据。  

Varchar 是变长字符数据,其长度不超过 8KB。 

Char 是定长字符数据,其长度最多为 8KB。 

超过 8KB 的ASCII 数据可以使用Text数据类型存储。例如,因为 Html 文档全部都是 ASCII 字符, 并且在一般情况下长度超过 8KB,所以这些文档可以 Text 数据类型存储在SQL Server 中。

 

(3)Unicode 数据类型  

Unicode 数据类型包括 Nchar,Nvarchar 和Ntext  

在 Microsoft SQL Server 中,传统的非 Unicode 数据类型允许使用由特定字符集定义的字符。 在 SQL Server安装过程,允许选择一种字符集。使用 Unicode 数据类型,列中可以存储任何由Unicode 标准定义的字符。 在 Unicode 标准中,包括了以各种字符集定义的全部字符。使用Unicode数据类型, 所战胜的窨是使用非 Unicode 数据类型所占用的窨大小的两倍。  

在 SQL Server 中,Unicode 数据以 Nchar、Nvarchar 和 Ntext 数据类型存储。 使用这种字符类型存储的列可以存储多个字符集中的字符。当列的长度变化时,应该使用Nvarchar 字符类型, 这时最多可以存储 4000 个字符。当列的长度固定不变时,应该使用 Nchar 字符类型,同样, 这时最多可以存储4000 个字符。当使用 Ntext 数据类型时,该列可以存储多于 4000 个字符。  

 

(4)日期和时间数据类型  

日期和时间数据类型包括 Datetime 和 Smalldatetime两种类型  

日期和时间数据类型由有效的日期和时间组成。 例如,有效的日期和时间数据包括“4/01/98 12:15:00:00:00 PM”和“1:28:29:15:01AM 8/17/98”。 前一个数据类型是日期在前,时间在后。第二个个数据类型是时间在前,日期在后。 

在 Microsoft SQL Server中,日期和时间数据类型包括Datetime 和 Smalldatetime 两种类型时, 所存储的日期范围是从 1753 年 1 月 1 日开始,到9999 年12 月 31 日结束(每一个值要求 8 个存储字节)。 使用 Smalldatetime 数据类型时, 所存储的日期范围是 1900年 1 月 1日 开始,到 2079 年 12 月 31 日结束(每一个值要求 4 个存储字节)。  

日期的格式可以设定。设置日期格式的命令如下:  

Set DateFormat {format | @format _var| 

其中,format | @format_var 是日期的顺序。有效的参数包括 MDY、DMY、YMD、YDM、MYD 和 DYM。在默认情况下,日期格式为MDY。  

例如,当执行 Set DateFormat YMD 之后,日期的格式为年 月 日 形式; 

当执行 Set DateFormat DMY 之后,日期的格式为日 月有年 形式  

 

(5)数字数据类型  

数字数据只包含数字。数字数据类型包括正数和负数、小数(浮点数)和整数。整数由正整数和负整数组成,例如 39、25、0-2 和 33967。 

在 Micrsoft SQL Server 中,整数存储的数据类型是Int,Smallint和 Tinyint。 Int 数据类型存储数据的范围大于 Smallint 数据类型存储数据的范围, 而 Smallint 据类型存储数据的范围大于Tinyint 数据类型存储数据的范围。 

使用 Int 数据存储数据的范围是从 -2 147 483 648 到 2 147 483 647(每一个值要求4个字节存储空间)。 

使用 Smallint 数据类型时,存储数据的范围从 -32 768 到 32 767(每一个值要求2个字节存储空间)。 

使用Tinyint 数据类型时,存储数据的范围是从0 到255(每一个值要求1个字节存储空间)。  

精确小 数数据在 SQL Server 中的数据类型是 Decimal 和 Numeric。这种数据所占的存储空间根据该数据的位数后的位数来确定。  

在SQL Server 中,近似小数数据的数据类型是 Float 和 Real。例如,三分之一这个分数记作。 

3333333,当使用近似数据类型时能准确表示。因此,从系统中检索到的数据可能与存储在该列中数据不完全一样。  

 

(6)货币数据表示正的或者负的货币数量

在 Microsoft SQL Server 中,货币数据的数据类型是Money 和 Smallmoney 。而Money数据类型要求 8 个存储字节,Smallmoney 数据类型要求 4 个存储字节。  

(7)特殊数据类型  

特殊数据类型包括前面没有提过的数据类型。特殊的数据类型有3种,即Timestamp、Bit 和 Uniqueidentifier。  

Timestamp 用于表示SQL Server 活动的先后顺序,以二进投影的格式表示。Timestamp 数据与插入数据或者日期和时间没有关系。  

Bit 由 1 或者 0 组成。当表示真或假、ON 或 OFF 时,使用 Bit 数据类型。 例如,询问是否是每一次访问的客户机请求可以存储在这种数据类型的列中。  

Uniqueidentifier 由 16 字节的十六进制数字组成,表示一个全局唯一的。 当表的记录行要求唯一时,GUID是非常有用。例如,在客户标识号列使用这种数据类型可以区别不同的客户。  

 

(8)用户定义的数据类型  

用户定义的数据类型基于在 Microsoft SQL Server 中提供的数据类型。当几个表中必须存储同一种数据类型时,并且为保证这些列有相同的数据类型、长度和可空性时,可以使用用户定义的数据类型。 例如,可定义一种称为 postal_code 的数据类型,它基于 Char 数据类型。  

当创建用户定义的数据类型时,必须提供三个数:数据类型的名称、所基于的系统数据类型和数据类型的可空性。  

1)创建用户定义的数据类型  

创建用户定义的数据类型可以使用 Transact-SQL 语句。系统存储过程 sp_addtype 可以来创建用户定义的数据类型。其语法形式如下:  

sp_addtype {type},[,system_data_bype][,‘null_type‘] 

其中,type 是用户定义的数据类型的名称。system_data_type 是系统提供的数据类型,例如 Decimal、Int、Char 等等。  null_type 表示该数据类型是如何处理空值的,必须使用单引号引起来,例如‘NULL‘、‘NOT NULL‘或者‘NONULL‘。  

数据库有基础知识