
这次分享的主题是SQL server2014 创建数据库的一些基础操作演示,望高手指点~
SQL 控制台字体调整
连接到默认实例,进行SQL server 命令行界面操作,调整字体,方便输入,如图所示:工具---选项---字体和颜色。

调整成需求的字号即可!

步入正题

SQL语句命令中GO的作用
SQL语句中的go作用很大,如果不用go,很多Sql语句是不能执行的!
go指的是先执行之前的!
官方定义:GO用来执行之前的所有语句。
如图所示:
如果sql语句之间不添加go的参数:
use master
create database fengxinDB #创建基本数据库。
use fengxinDB

报错的原因在于,现在的服务器系统都是多任务处理,这三条命令同时会被系统执行,创建数据库属于写入操作,会比use fengxin这个语法慢!当use fengxinDB这条命令先被执行后,发现没有这个数据库,因此所有的执行命令会被错误终止!因为在执行命令时,很多命令是有先后逻辑顺序

因此我们要在这命令之间添加go的参数,等先创建完fengxinDB,后再自行use fengxinDB,这样的逻辑顺序很清晰明了。
添加了go的参数之后,再执行这三行sql语句,如图所示:
use master
go
create database fengxinDB
go
use fengxinDB
go
如图所示:加上GO,这三条命令在一起执行时,不会出现报错!


数据库中的表
表是数据库操作最基本的单元,大部分的数据库操作(数据查询,视图,索引)都与表息息相关!
表最常见的操作是创建、维护和删除!其中表的创建最为难理解!
表是SQL server 数据库中最重要、最基本的数据库对象,数据库中的所有数据都存储在表中!

定义表的特征结构
在定义表的特征结构之前,需要了解下什么是表?表是用于存储数据的逻辑结构,是关系模型中实体的表是方式,也是用于组织和存储机油行列结构的数据对象!
因为sql server是典型的关系型数据库,在插入数据前一定是定义好表的结构!以下几行sql语句是定义表的结构!表的结构里面定义了名字,性别,年龄,手机号Email地址等....
在sql语法中是不区分大小写的,请注意。
create table chongwu
(
SNo Int Primary key, #int 整型 (占用4个字节)
SName Char(10) not Null, #char 字符
SEX Char(2),
SAGE tinyint, #tinyint 微整型 (占用一个字节)
StuMobileNO Char(11),
StuEmailAdd varchar(50) #varchar 字符型
)
primary:指的是PK,表的主键,用于实现表的实体完整性。
上述语句,在创建表时,所有的列名必须要用“,”逗号分隔开!

自定义数据类型篇
char和varchar的区别
两者都属于字符型
两者同时执行insert 'aabbcc' 后,进行两个方面进行对比:
①节省磁盘空间方面,varchar好于char。
②磁盘存储碎片化方面,char 好于varchar。
如图所示:在生产环境中,对于某些字符的长度可控,例如性别,年龄,手机号,可定义成char;但是有些字符长度是不可控的!例如:描述,邮箱地址,可定义成varchar。
更多的数据类型可参考微软的technet网站
https://docs.microsoft.com

更多的数据类型可参考微软的technet网站
https://docs.microsoft.com


简单的数据插入
在实际的应用中,有时候需要向数据表中插入行的数据以满足用户需求,这些数据可以来自其他应用程序,可并根据需求转存或插入到数据表中,也可以是新数据插入到新创建的表中或者已有的表中,这里演示的事将数据插入现有的表中:
插入的时候SQL语句一定要先写上表的名称,在写入字段的名称(其中字段的先后顺序可跟前面表的结构定义字段顺序不一样,但是要和这语句后半段括号里面的必须保持一致!)
这里表的名字我定义成chongwu ,表通常代表一个实体,表是将关系模型转换为实体的一种表示方式,该实体是唯一!
Insert into fengxinDB.dbo.chongwu(SNO,Sname,SEX,SAGE,StuMobileNO,StuEmailadd) Values
(10000,'daidai','公','2','18600000000','daidai@163.com')
sql语法中是没有双引号 “ ”

数据插入表中之后,查看数据内容:
select * from fengxinDB.dbo.chongwu
在红框处,能看到类似excel表格的数据,这就是表在关系模型中实体的表示方式,关于组织和存储具有行列结构的数据对象。
表由行和列组成!行是组织数据的单位,列是用于描述数据的属性,每一行表示完整的一条信息记录,列则表示记录中相同的元素属性值!


修改表的数据
当创建完数据表之后,在使用的过程中可以根据需要对数据表进行相应的修改,修改数据表主要包括修改表名称,修改字段等。
修改指定的表名
图形界面操作:

SQL语句操作:这里演示修改表中sang字段的数值
指定修改表中的年龄的值--set sange
指定改的是那些记录--where(where后面跟随条件)
Update fengxinDB.dbo.chongwu
Set SAGE=3
Where SNO=10000

再次查询,表中年龄字段的内容发生变化

sql语句删除
不加 where后面的条件,表示所有表都清空,而加入了where代表了只有满足了这个条件的数据清空!


SQL语句的注释
注顾名思义解释的意思,在SQL中,注释的方法有两种:
① -- 表示单行注释

②/* */ 表示多行注释:


SQL语句的保存
观察控制台的标签框头部的颜色为黄色!代表了SQL语句并没有保存!

右键保存后,颜色发生变化:由黄变绿!

而当你再次输入语句时,颜色发生变化,黄色代表了没有保存!

创建数据库
首先,一切数据存储,从创建数据库开始!因为一个关系型数据库,所有的数据都存放在表中,表不可能直接在实例中直接创建,需要先创建一个数据库!数据库本身可以理解成一个容器。数据库是SQL server2014系统数据库管理和为何的核心对象,包括系统所需的全部数据!
补充:
如何一次插入多条数据:SQL语句如下
insert into chongwu(SNO,Sname)
select 10001,'Aimi'
union select 10002,'naonao'

null(空值):不等价于0,空白或长度为零的字符串(‘ ’),NULL意思就是没有输入,出现Null就意味着该列的值未知或未定义,也不存在两个Null值是相等的!
Create Database使用场景
①创建数据库
②附加数据库
③创建数据库快照
创建数据库不用多说,我们从附加数据库开始。
附加数据库
微软官方定义:
附加数据库是指将分离的数据库重新定位到相同的服务器或者不同的服务器的数据库中,附加数据库时,所有数据库文件(mdf和ldf)都必须可用。
不仅仅是SQL Server数据库,包括其他关系型数据库其可移植性特别好(所谓的可移植性就是A服务器的数据库可给B数据库)。
先找到一个数据库,属性---文件:找到文件的存储路径:将这两个文件拷贝到存储介质中去。

注意:拷贝之前虽然可以将服务停止,但不是最好的方案,这样会造成业务中断!最好的建议方案是在任务中分离数据库,分离后进行 拷贝数据。

将拷贝好的两个数据文件,导入到新的数据库,这就是所谓的附加操作!

数据库物理存储--文件
站在应用程序的逻辑角度中,我们可以认为数据库中存放了很多表,存了很多数据!而站在物理角度上,无论任何程序,它的存储位置都是文件!

数据文件详解

①每个SQL server 数据库至少具有两个操作系统文件:一个数据文件和一个日志文件。数据库文件包含数据和对象,例如表、索引、存储过程和视图,日志文件包含恢复数据库中的所有事务所需的信息。
如图演示:
数据库中的两个操作系统文件分为两个维度来来展现两者的作用及关系。


数据库所谓的坏了,数据丢失,一般都是数据文件损坏或者服务器故障造成的,而日志文件只负责往程序中写入,不涉及任何操作且日志文件损坏的可能性非常小(日志文件可以定期备份)

因为日志记录的操作数据库的过程,因此可以利用恢复到最近的数据备份节点,然后执行日志文件恢复最新的数据内容。日志的好处在于一直往程序中写入,利用写过程可以播放数据的延展性!

②在SQL Server中,有三种数据类型,主数据文件MDF ,辅数据文件NDF. 事务日志文件 LDF.
创建好数据库之后,会有很多数据库文件支撑着此数据库正常运行,例如master就支撑着整个实例的运行等。

在数据库属性中,这些支撑数据库运行的系统文件就存放在MDF文件中,甚至个人的数据可以存放MDF文件,也可以存放NDF文件中!日志文件存放LDF。
缺省情况下,数据文件存储架构就两个:LDF/MDF

③一个数据库最多可以创建32767个文件。

创建数据库命令
create database fengxinDB
在Model模板中,默认属性有些是非常小的,需要DBA创建数据库时手动改变一些相关参数。如图所示:model的默认属性

创建一个数据库存储路径文件:

非默认情况下,创建自定义数据库
SQL语句如下:
create database daidaiDB
--引出主数据文件
ON Primary
(
Name=daidaiDB,
--文件存储路径
filename='E:\DaiDaiDB\daidai.mdf',
--初始化大小为50MB
Size=50MB,
--最大大小,如果不写,受磁盘影响
Maxsize=2GB,
--磁盘每次增长100MB
filegrowth=100MB
)
--日志文件设定
LOG ON
(
Name=daidai_LOG,
filename='E:\DaiDaiDB\daidai.ldf',
--初始化大小为50MB
Size=10MB,
--最大大小,如果不写,受磁盘影响
Maxsize=1GB,
--磁盘每次增长20%
FileGrowth=20%
)

执行完该语句后,在磁盘相应的文件路径下可以看到,创建的数据文件和日志文件的大小。

在sql控制台中刷新数据库:在daidaiDB属性-文件中查看:

自定义创建数据库需求演示

事先规划好数据库名字的文件路径:
SQL语句如下:
--use master代表了创建数据库在master底下,以下所有的命令都在master数据库底下执行
use master
go
create database aimiDB
--引出主数据
ON Primary
(
Name=aimiDB,
--主数据文件存储路径
filename='E:\AiMiDB\aimi.mdf',
--初始化大小为60MB
Size=60MB,
--最大大小,如果不写,受磁盘影响
Maxsize=2GB,
--磁盘每次增长100MB
filegrowth=100MB
),
(
Name=aimiDB_feifei,
--辅数据文件存储路径
filename='E:\AiMiDB\aimi_feifei.ndf',
--初始化大小为55MB
Size=55MB,
--最大大小,如果不写,受磁盘影响
Maxsize=2GB,
--磁盘每次增长100MB
filegrowth=100MB
),
(
Name=aimiDB_xin,
--辅数据文件存储路径
filename='E:\AiMiDB\aimi_xin.ndf',
--初始化大小为45MB
Size=45MB,
--最大大小,如果不写,受磁盘影响
Maxsize=2GB,
--磁盘每次增长100MB
filegrowth=100MB
),
(
Name=aimiDB_jiu,
--辅数据文件存储路径
filename='E:\AiMiDB\aimi_jiu.ndf',
--初始化大小为30MB
Size=30MB,
--最大大小,如果不写,受磁盘影响
Maxsize=2GB,
--磁盘每次增长100MB
filegrowth=100MB
)
/*数据文件和日志文件的衔接部分不能用逗号分隔
*/
--日志文件设定
LOG ON
(
--日志文件名的定义
Name=aimiDB_LOG,
--日志文件存储路径的定义
filename='E:\AiMiDB\aimi.ldf',
--初始化大小为50MB
Size=10MB,
--最大大小,如果不写,受磁盘影响
Maxsize=1GB,
--磁盘每次增长20%
FileGrowth=20%
)

创建完成后,查看AimiDB数据库下面的数据文件结构:里面有五个文件
里面创建的一些参数,文件初始大小,自动增长的容量等。

利用SQL语句查看相应数据库的数据文件
一个数据库包含多个文件时,这些文件存储的大小是多少?
在系统文件中,通过典型的连接查询,但是这能看到数据文件。大小,增长情况。
SQL语句如下:
use aimiDB
go
SELECT df.[name],df.physical_name,df.[size],df.growth,f.[name][filegroup],f.is_default
FROM sys.database_files df join sys.filegroups f
ON df.data_space_id = f.data_space_id


SQL server文件和文件组的关系
文件组是用于分配和管理数据文件的集合,是根据数据文件而创建的,通过创建文件组,可以将不同的数据文件存储在不同的文件组中,不仅可以优化数据存储,而且还可以提高数据I/O读写性能。
如图所示:
站在逻辑角度上来说,我们在数据库控台中看到的就是文件组,文件组内又包含了多个文件(文件属于物理的概念)
在创建表中,是不能把表(表也是一个逻辑的概念)存在一个文件之中,这就是产生了文件组,文件组会让表和文件做一个关联,桥梁的作用!

SQL Server中的文件组定义
文件组是一个容器,文件组中可以包含多个文件,当一个文件中包含多个文件的时候,数据库在存储的时候实现负载均衡,提高了数据库的读写效率。
每个数据库至少有一个主要文件组,默认文件组名称为Primary.
文件组中只能包含数据文件,不能包含日志文件。
一个数据库最多可以创建32767个文件组。
针对4条文件组的定义,下面进行详细介绍
默认文件组
如图所示:在aimiDB属性--文件组中,看到只有一个默认的文件组名为Primary
你也可以添加另外一个文件组,如图所示:这里我添加的一个名为fengxinGroup的文件组。

文件和文件组的关系
注意的是,一个文件属于哪个文件组提前在创建数据库时规划好,否则后期两者关系无法更改。如图所示:
我后期为aimiDB数据库更改了文件组,但是在属性--文件中,我对其文件组的操作是无效的!

只能在最初创建数据库的时候,规划好就可以选择文件组。

而一旦创建好后文件组和文件的关系将无法进行更改:

文件组如何提高效率和负载均衡
在虚拟机中添加一块10GB的硬盘

创建niuniuDB的文件路径:
两个磁盘都要创建


SQL语句如下:
做此次实验时,建议初始化大小指定为5MB(5MB为model属性最小值后期方便观察变化)
--文件组多块磁盘冗余
create database niuniuDB
ON primary
(
Name=niuniuDB01,
filename='E:\niuniuDB\niuniuDB_mdf',
Size=5MB,
Maxsize=1GB,
FileGrowth=20%
),
--创建新的文件组
fileGroup niuniuGroup
--附加文件,括号中文件都隶属于niuniuGroup文件组。
(
Name=niuniuDB_niuniu01,
FileName='E:\niuniuDB\niuniu01_ndf',
Size=5MB,
Maxsize=1GB,
FileGrowth=20%
),
(
Name=niuniuDB_niuniu02,
FileName='F:\niuniuDB\niuniu02_ndf',
Size=5MB,
Maxsize=1GB,
FileGrowth=20%
)
LOG ON
(
Name=niuniuDB,
FileName='F:\niuniuDB\niuniu02_ldf',
Size=5MB,
Maxsize=1GB,
FileGrowth=20%
)

在niuniuDB属性--文件:看到niuniu01和niuniu02这两个文件的文件组是niuniugroup

niuniuDB数据库属性--文件组:看到niuniuGroup包含了两个文件。

针对niuiniuDB数据库,在系统磁盘中E和F中,niuniu01和niuniu02默认大小都是5MB。


同时往两个数据库文件创建表:
--往niuniuGroup组中的数据文件(niuniu01和niuniu02)创建chongwu表格
create table chongwu
(
SNo Int Primary key,
SName Char(10) not Null,
SEX Char(2),
SAGE tinyint,
StuMobileNO Char(11),
StuEmailAdd varchar(50)
)on niuniuGroup

模拟往niuniu01和niuniu02的数据文件中,插入大量数据!
利用循在学号中插入循环变量+1,至少循环小于50万次,执行这条命令是考验实验机器的性能,一次性插入至少40W行的表格,需要时间等待!
--利用变量+1,模拟插入40W行的数据
Declare @i int
Set @i=100000
While(@i<500000)
begin
insert into niuniuDB.dbo.chongwu(SNO,Sname,SEX,SAGE,StuMobileNO,StuEmailadd) Values
(@i,'niuniu','公','1','18600000001','niuniu@163.com')
set @i=@i+1
end

如图所示:在执行这样的操作,控制台底部会提示正在执行查询,控制台的执行按钮在没有完成此操作会一直呈现灰色!时间大概2分26秒左右!


SQL语句:统计命令查询是否插入了40W行的数据:
--统计是否插入40W数据
select count(*)from chongwu

也可以查看所有数据:
--查看所有数据
select * from chongwu
如图所示:能看到序号发生了递增+1的变化。

系统磁盘中观察E和F中niuniu01和niuniu02的数据文件大小,如图所示:
虽然不是同样大小,跟之前介绍的文件组理论有点不太符合,但是查询相关的资料得知,虽然是同时写入,但是是系统内部处理的方法导致了大小不统一的结果!(如果你删掉其中一个数据文件,所有的数据文件都会打不开!)


虽然数据库读写是往这两个数据文件中写入,但是所谓的提高效率,也不建议使用这样的方案,因为如果有一个磁盘发生故障,那么数据库也会发生故障!

总结
只有数据文件具有文件组,日志文件不存在文件组。
主数据文件一定存放在主文件组中。
与系统相关的数据信息一定存放在主文件组中。
一个数据文件只能存放一个文件组中,不能同时存放多个文件组中。

收缩数据库
在微软很多的产品存储的主要特征:你即使删除了一些数据,但是数据文件所在的文件空间大小不发生变化!
举例niuniuDB01和niuniuDB02的数据文件:平均每个文件大小为11MB

我现在执行删除niuniuDB下chongwu的表。从执行的速度上来看,删除比写入的速度快很多!
delete from chongwu

再次查看chongwu表的数据,确认是删除干净了:
select * from chongwu

最后查看niuniuDB01和niuniuDB02数据文件的大小:删除之后空间大小竟然没有发生变化!
原因在于数据库引擎虽然能够有效的重新使用空间,但是数据文件不会按照最初分配的大小来执行,因此需要通过收缩文件来回收这些空间。


如何释放这些数据文件的空间呢?需要执行收缩数据库的操作!在sql2014中,数据和事务日志文件都可以减小(收缩)


执行完之后,查看相应的数据文件:发现两个数据文件恢复到了初始化大小。


在实际的生产环境中,可以开启数据库的自动收缩功能:相应的数据库属性---选项

SQL语句如下:
USE [master]
GO
ALTER DATABASE [niuniuDB] SET AUTO_SHRINK OFF WITH NO_WAIT
GO

数据库快照
微软官方定义:
数据库快照记录了某个时间点的只读视图。
快照与备份数据库复制整个数据库不同,快照并不复制整个数据库的页,而是仅仅复制在快照建立时间点之后改变的页,因此当利用快照进行数据库恢复时,也仅仅将那些做出改变的页恢复到源数据库,这个速度会大于备份和恢复方式。

在vmvare下快照的快
一个虚拟机在装好系统之后,默认是60GB,创建好相应的快照之后,一分钟之内就可以创建完毕!其实,快照根本没有在做备份操作!

快照工作原理
将数据库做快照时,快照并没有对数据进行任何的拷贝,而是从逻辑角落上创建了一个跟数据库一样大小的空间(这个空间大小,不是绝对空间,而是相对空间),当原始数据库在相应的页面做了更改,快照的工作原理如图所示:
快照在还原的时候,将变化的部分删除即可(将变化的部分做一个反操作)!(注意的是,做快照本身就是做变化的部分!如果你将数据库删除,不能利用快照进行恢复,因为源头没有了)因此,再做大范围调整时,建议做快照。

快照执行演示
首先规划好快照的存储路径:E:\Snapshot

在fengxinDB的数据库查看chongwu的表,内容如图所示:将fengxinDB数据库下做一个快照。

执行数据库快照
注意,执行恢复操作要去对源数据库具有restore database的权限。
执行数据库快照:SQL语句如下:
--创建数据库快照
--定义快照名称
create database snap_fengxinDB_20190620
ON
(
Name=fengxinDB,filename='E:\Snapshot\fengxinDB20190620.snap'
)
as snapshot of fengxinDB
go

其中name file 文件中的文件指的,如图所示:里面有多少数据文件就要写入多少数据文件,但是要排除日志文件。

在执行完成后,在数据库-数据库快照,这个数据点就是可读的,也就是最原始的数据文件!(注意的是,这个数据库快照的名字就是以后恢复数据库所调用的名字!)

快照以后的原始数据如下:

模拟在chongwu表中插入一条数据:
--向chongwu表插入一条数据
Insert into fengxinDB.dbo.chongwu Values
(10010,'eyu','公','9','12345678987','eyu@qq.com')

查看现有的数据:
select * from chongwu

假设序号为10010的数据为错误数据(显示场景中可能是大量的)可以利用数据库快照还原回来,如图所示:
注意的是一定要在master下执行或者use master
--利用数据库快照还原
Restore database fengxinDB from database_snapshot='snap_fengxinDB_20190620'

再次查看fengxinDB下的chongwu表,如图所示:数据库已恢复到原始!
在实际的生产环境中,大多数企业偏向于给数据库做完整备份,而不是这样具有局限性的快照!这个主要针对数据结构调整,对架构调整较大的操作!

总结数据库快照
由于数据快照最终是作用在数据库上,所以对于创建了快照的数据库来说,在使用时存在一些限制:
不允许删除,还原或分离源数据库。
不允许从源数据库或亏按照中删除任何数据文件。
源数据库的性能势必会降低。
源数据库必须处于在线状态!

删除数据库
在删除数据库这个危险的命令,会有四个规定:
无法删除系统数据库。
无法删除正在使用的数据库,如要从数据库中删除用户,请使用ALTER Database 将数据库设置为 single_user状态。
在删除数据库之前,必须将该数据库上的所有数据库快照都删除。
只有通过还原备份才能重新创建已删除的数据库,数据库快照无法备份,因此也无法还原。
举例删除vmware中的虚拟机,如果这样删除,不代表真正的删除:写着是移除!你可以通过之前定义的虚拟机路径可以导入进来!

--删除数据库
drop database fengxinDB

而删除数据库却不同,一旦执行成功删除命令,相应的数据库文件也会删除掉,只有通过备份还原的方式,才能还原回来(快照无能为力!)注意:使用drop database 是不会出现确认信息,请谨慎操作!





