1.基础概念
首先要强调一点,就是我们的数据库是由数据库系统来管理的,我们登入数据库并在其上进行操作时最终均要通过数据库系统来完成。可以理解成在数据库上进行操作的是客户端,数据库系统是服务端。一个数据库由具体的数据和数据库对象组成,可将数据库看成一个大容器,里面除了存储数据还有描述这些数据信息的对象,比如表、视图、索引等都是这个数据库里面的对象。我们知道数据库中有4个系统数据库,它们是数据库系统在运行过程中存储数据和记录相关信息的重要组成部分。它们的作用如下所示。
(1)master数据库,如其名字一样是SQL里最重要的数据库,SQL Server能够正常运行的前提正是这个数据库未被破坏。它包含系统用户的配置信息、用户权限信息等系统配置信息。由于master数据库非常重要,因此很有必要对master数据库进行备份。
(2)model数据库,就像在C#中创建的类会自动继承自object一样,我们在数据库中创建的数据库也是有一个创建模板的,这个模板就是model数据库。例如我在model数据库中新增一个表test,当我随意创建一个新的数据库时会发现这个数据库中已经存在test表了。
(3)msdb数据库,它主要用来存储运行已创建的计划作业时有关的描述信息。它也是非常重要的数据库,一般建议对这个数据库进行备份。另外对于这个数据库有很多限制,再加上有很多进程都使用这个数据库,所以最好不要去对msdb数据库进行修改。
(4)tempdb数据库,这个数据库作为一个过渡数据库来存放一些临时的数据。当SQL Server关闭时这个数据库也就消失了,当SQL Server重启时tempdb会被重建。关于tempdb还要注意不能太随意的创建临时表,否则当表太多时会导致当前任务无法执行,并且整个服务器可能无法工作。
一个数据库中数据文件和日志文件,对应的后缀名为.mdf和.ldf,以mdf结尾的数据文件为主数据文件。我们还可以为数据库指定辅助数据文件,它以.ndf结尾,一个数据库中只能有一个主数据文件,但可有多个辅助数据文件。为了便于管理和数据的分配,可为文件指定文件组,一个文件不能同时属于多个文件组且不能为日志文件指定文件组。当创建包含多个文件的文件组时,若将表存入文件组,这样查询的时候系统可以并行的去同时查询文件组里的多个文件,这样可以提供查找效率缩短时间。在SQL2008中可管理的最小物理单位是页,一页为8kb也就是8192字节。8张连续的页为一个区,也就是64kb的大小。对于一张表,每一行的数据不可超过一页,每一页中除了存放数据还会存放一些文件基本信息,这样一行数据可占用的最大空间为8060个字节。这个规则有一个特殊情况,那就是列中有nvarchar、varchar的某些文本数据类型可以超过这一限制。下面是关于数据库的sql操作。
create database dbtest on primary ( name=test_maindata, filename='d:\test_maindata.mdf', size=5, filegrowth=10% ), filegroup group1 ( name=test_data1, filename='d:\test_data1.ndf', size=2, filegrowth=10% ), ( name=test_data2, filename='d:\test_data2.ndf', size=2, filegrowth=10% ) log on --注意日志文件不能放入文件组 ( name=test_log1, filename='d:\test_log1.ldf', size=2, filegrowth=1MB ), ( name=test_log2, filename='d:\test_log2.ldf', size=2, filegrowth=2MB ) --查看数据库的基本信息 select * from sys.databases --查看有关数据库文件的信息 select * from sys.database_files --查看有关数据库组的信息,这里显示了两行数据,第一行为mdf文件,第二行为group1 select * from sys.filegroups --查看数据库文件的基本信息和状态信息 select * from sys.master_files --查看数据库的状态, select DATABASEPROPERTYEX('dbtest','Status') --查看空间使用情况 exec sp_spaceused --查看数据库基本信息,没有sys.databases信息多 exec sp_helpdb --修改数据库的名字,显然这要慎重 alter database dbtest modify name=hahaha exec sp_renamedb 'hahaha','dbtest' --分离数据库 exec sp_detach_db dbtest create database dbtest on ( name='test_maindata', filename='D:\test_maindata.mdf' ) for attach
2.数据库状态
数据库一共包括7种状态,可以使用查询sys.databases或执行databasepropertyex函数来获得数据库的状态信息。
--这两种方式都可以获得数据库的状态信息 select state_desc,* from sys.databases select databasepropertyex('testDb','Status')
online:在线状态或联机状态,此时可执行对数据库的访问。
offline:离线状态或脱机状态,数据库不能正常使用。此时可以对处于这种状态的数据库进行移动和复制操作。
restoring:还原状态,数据库不可用,比如正在还原主文件组的文件,或正在脱机还原一个或多个辅助文件。
recovering:恢复状态,数据库不可用,恢复成功后数据库会自动处于在线状态,如果恢复失败那数据库将被标记为可疑状态。
suspect:主文件组可疑或已经损坏,SQL Server启动过程中无法恢复数据库,此时数据库不可用。
recovery pending: 恢复未完成状态,数据库不可用,这说明SQL Server在恢复过程中发生了某些与资源相关的错误,数据库未损坏可能需要某些条件让恢复进程开 始执行。
emergency:主要用来故障排除,当用户设置数据库状态为emergency时此数据库将只读且为单用户模式,禁用日志记录,此时只有sysadmin固定服务器的 角色才能访问,并且也只有sysadmin固定服务器的角色才能设置数据库的状态为emergency。
3.数据类型
基本数据类型包括数值类型、文本类型、二进制数据类型、日期类型、货币类型等。数值类型分为整型和近似数据类型,整型数据类型有4个,分别是bigint(8字节)、int(4字节)、smallint(2字节)、tinyint(1字节),其中除tinyint外,bigint、int、smallint都可以存储负数,它们使用最高位作为符号位,tinyint不能存储负数,它只能存储0~255的整数。近似数据类型包括decimal、numeric、real、float,decimal和numeric数据类型是完全等价的只是名字不一样而已,decimal用法为decimal(p,s),p表示整数部分的长度s表示小数部分的长度,p的取值范围是0~38,默认是18,s为0~p之间的数值。由于decimal精度跨度大,因此为了更好的利用资源decimal数据类型长度不是固定的,当p小于或等于9时占5个字节,当p为38时所占的字节数将高达17个字节。浮点类型float和real最大的优点是能够存储范围非常大的数字,缺点则是浮点类型容易发生舍入误差,如果需要进行数据很大的科学计算,但对数据的精度要求不是很严格,那么选择float或real是比较不错的选择。float(n)中的n范围是1~53,当n为1~24时,需要4字节存储,n为25~53时需8字节存储。real其实就是float(24),real的数据范围是-3.40E+38~-1.18E-38,0,1.18E-38~3.40E+38,float的数据范围是-1.79E+308~-2.23E-308,0,2.23E-308~1.79E+308。
文本数据类型有char、varchar、text和nchar、nvarchar、ntext六种数据类型,其中前三个为非Unicode类型,后三个为Unicode类型。char数据类型存储数据时一个字符占用一个字节的存储空间,它最大可存储8000个字符,当真实数据长度小于8000时其余字符为空字符,当真实数据长度大于8000时多余部分将被截断。char是固定类型的,为了更有效率的利用空间,我们可以使用varchar,它与char基本相同唯一的不同就是varchar是可变的。text则是为了解决长度超过8000个字节的文本,它用来存储长度超过8000个字符的可变文本,最大长度可达2的31次方减1。Unicode为每种语言的每一个字符规定了唯一的二进制编码,标准情况下每个字符占2个字节,当然还有其他实现,这就是Unicode Translation Format(Unicode转换格式,UTF)。这样nchar的范围就为0~4000,但要注意nvarchar的长度除了是0~4000外,还可以指定nvarchar(max),它的范围是2的30次方减1,微软建议设计者尽量用nvarchar来代替ntext,因为显然可变的nvarchar比ntext更加节约空间。同样ntext的范围也为2的30次方减1。
二进制数据类型binary、varbinary、image和文本数据类型一样的模式,也是建议使用varbinary(max)来代替image。货币数据类型由money和smallmoney组成,money由8字节组成,其中4字节存储整数部分,4字节存储小数部分。smallmoney则是2字节+字节一共4字节。money和smallmoney小数部分都只有4位,超出部分将进行四舍五入。另外货币类型是可以在数字前面带¥符号的。对于日期类型,我们使用很多的就是datetime数据类型了,除此之外还有一个smalldatetime数据类型,smalldatetime表示的时间范围比datetime要少且精度低。使用datetime有一个不方便的地方就是它既包括日期数据又包括时间数据,而有时候只需要其中一类。强大的SQL Server里有专门针对日期数据的类型date和专门针对时间数据的类型time。如果需求是datetime类型且希望秒这个单位的小数部分更加精确的话,还可以使用datetime2数据类型,小数部分可达7位。