SQL Server 2016 从入门到实战(视频教学版)
上QQ阅读APP看书,第一时间看更新

4.1 数据表概述

数据表是数据库中最基本的操作对象,通常说的把数据存放在数据库中其实就是存放在数据库中的一张张数据表中。数据表中的数据按照行和列的规则来进行数据存储,每一行为一条数据记录,一条数据记录是由多个字段的描述信息组成的。每一列称为一个字段,列的标题称为字段名,它们都具有相同的描述信息,如数据类型、字段大小等。一系列行和列的合集称为域。

在具体的学习过程中,读者可以把数据库理解为一个记录本,数据表就是其中的每一页纸。一个数据库数据内容的多少其实并不是指这本记录本有多大多厚,而是指每一页纸张记录的内容有多少。

数据表的主要作用是存储各类数据信息,由行和列组成。例如,有一张记录了员工信息的employee表,每一个字段就是用来描述员工的一个特定类型信息,比如姓名,每一行则包含用于描述某一员工的所有信息:工号、姓名、性别、学历,这些信息的集合称为一条记录,如表4.1所示。

表4.1 employee表的结构

4.1.1 SQL Server 2016基本数据类型

数据虽然是用户存储数据的基本依据,用于设置保存数据的基本类型。SQL Server 2016中支持多种数据类型的设置,包括字符型、数值型、日期型等。数据类型的作用在于规划每个字段所存储的数据内容类别和数据存储量的大小,合理地分配数据类型可以达到优化数据表和节省空间资源的效果。

SQL Server 2016数据库管理系统中的数据类型分为两类:一类是系统提供给用户使用的默认数据类型,称为基本数据类型;另一类是用户自定义的数据类型。下面先介绍基本数据类型的内容。

1.整数类型

整数类型是SQL Server 2016中常用的数据类型之一,主要用于存储整数值,如存放“年龄”“工龄”等信息,数值型的数据可以直接进行运算处理。具体来说,SQL Server 2016的整数类型包含如下4种:

(1)INT(INTEGER)

INT(或INTEGER)的存储容量为4个字节,其中一个二进制位表示正负符号,一个字节8位。根据字节大小,用户可以算出它所能存储的数据容量为31位,用于存储-231~231-1内所有的整数。

(2)SMALLINT

SMALLINT的存储量为2个字节,其中一个二进制位表示正负符号,剩余的15位用来存储数据内容,用于存储-215~215-1内所有的整数。

(3)TINYINT

TINYINT只占用一个字节存储空间,用于存储0~255的所有整数。

(4)BIGINT

BIGINT是所有整数类型中存储量最大的,存储容量达到8个字节,用于存储-263~263-1中所有的整数。

2.浮点数据类型

浮点数据类型用于存储十进制的小数。浮点类型的数值在SQL Server 2016中使用了上舍入(或称只入不舍)的方法进行存储,当且仅当要舍入的是一个非零整数时,对其保留数字部分的最低有效位上的数值加1,并进行必要的进位。SQL Server 2016的浮点数据类型包含如下3种:

(1)REAL

REAL类型的存储空间为4个字节,可精确到第7位小数,其范围为-3.4E+38~3.40E+38。

(2)FLOAT

FLOAT数据类型是一种近似数值类型,供浮点数使用。浮点数是近似的,是因为在其范围内不是所有的数都能精确表示。浮点数可以是从-1.79E+308~1.79E+308的任意数。

(3)DECIMAL

DECIMAL数据类型提供浮点数所需要的实际存储空间,能用来存储从-1038-1~1038-1的固定精度和范围的数值型数据。使用这种数据类型时,必须指定范围和精度。范围是小数点左右所能存储的数字的总位数,精度是小数点右边存储的数字的位数。例如,DECIMAL(13 3)表示共有13位,其中整数10位、小数3位。

3.字符类型

字符类型同样是SQL Server 2016中常用的数据类型,可用于存储汉字、符号、英文、标点符号等,数字同样可以作为字符类型来存储。SQL Server 2016的字符类型包含如下4种:

(1)CHAR

CHAR数据类型用来存储指定长度的定长非统一编码型的数据。当定义一列此类型的数据时,用户必须指定列长。当用户知道要存储的数据的长度时,此数据类型就较为适用。例如,当一个字段要用于存储手机号码时,需用到11个字符,CHAR类型默认为存储一个字符,最多可存储8000个字符。

(2)VARCHAR

VARCHAR数据类型与CHAR类型一样,用来存储非统一编码型字符数据。与CHAR型不一样的是,此数据类型为变长。当定义一列该数据类型的数据时,用户要指定该列的最大长度。它与CHAR数据类型最大的区别是,存储的长度不是列长,而是数据的长度。

(3)NCHAR

NCHAR数据类型用来存储定长统一编码字符型数据。统一编码用双字节结构来存储每个字符,而不是用单字节(普通文本中的情况)。它允许大量地扩展字符。此数据类型能存储4000种字符,使用的字节空间上增加了一倍。

(4)NVARCHAR

NVARCHAR数据类型是一种变长类型的字符型数据,具有统一的编码方式。此数据类型能存储4000种字符,使用的字节空间增加了一倍。

4.日期和时间类型

(1)DATE

DATE类型用于存储常用日期,该类型占3个字节的存储空间,数据的存储格式为YYYY-MM-DD。

● YYYY:表示日期的年份,取值范围为0001~9999。

● MM:表示日期中的月份,取值范围为01~12。

● DD:表示日期中的某一天,取值范围为01~31。

(2)TIME

TIME类型用于存储一天当中的某一个时间,该类型占5个字节的存储空间,数据的存储格式为HH:MM:SS[.NNNNNNN]。

● HH:表示存储时间的小时位,取值范围为0~23。

● MM:表示存储时间的分钟位,取值范围为0~59。

● SS:表示存储时间的秒位,取值范围为0~59。

● N:表示存储时间秒的小数位,取值范围为0~9999999。

(3)DATETIME

DATETIME数据类型用来表示日期和时间。这种数据类型存储从1753年1月1日到9999年12月3 1日的所有日期和时间数据,精确到三百分之一秒或3.33毫秒,该类型占用8个字节的存储空间。

(4)DATETIME 2

DATETIME 2是从SQL Server 2008版本以后支持的新日期类型,是DATETIME的扩展。相比于DATETIME,DATETIME 2所支持的日期从0001年01月01日到9999年12月31日,时间精度为100纳秒,占用6~8字节的存储空间。

(5)SMALLDATETIME

SMALLDATETIME类型与DATETIME类型相似,只是它所支持的日期范围更小,从1900年1月1日到2079年6月6日,占用4字节的存储空间。

5.文本和图形数据类型

(1)TEXT

TEXT数据类型用于存储大容量的文本数据,它的理论容量为231-1(2 147 483 674)个字节,在实际使用TEXT类型时需要注意硬盘容量。

(2)NTEXT

NTEXT数据类型与TEXT类型相似,不同的是NTEXT类型采用UNICODE标准字符集(Character Set),因此其理论容量为230-1(1 073 741 823)个字节。

(3)IMAGE

IMAGE数据类型用于存储大量的二进制数据,理论容量为231-1(2 147 483 647)个字节。其存储数据的模式与TEXT数据类型相同。通常用来存储图形等(OLE Object Linking and Embedding,对象连接和嵌入)对象。

在未来的Microsoft SQL Server版本中将不再使用TEXT、NTEXT和IMAGE数据类型,为了避免在开发过程中出现问题,最好不要使用,可以使用nvarchar(max)、varchar(max)和varbinary(max)代替。

6.货币数据类型

(1)MONEY

MONEY数据类型用于存储货币值,存储范围是-922 337 203 685 477.5808~+922 337 203 685 477.5807,占用8个字节的存储空间。

(2)SMALLMONEY

SMALLMONEY与MONEY数据类型的作用一致,只是取值范围更小,取范围是-214 748.3648~214 748.3647,占用4个字节的存储空间。

7.位数据类型

bit在SQL Server 2016中称为位数据类型,取值范围是0或1。bit类型常用于逻辑判断,TRUE为1,FALSE为0。

8.二进制数据类型

(1)BINARY

BINARY(N)是一个固定长度为N字节的二进制数据类型,存储范围由N来决定,N的取值范围为1~8000,存储空间为N字节。为了表示二进制数据,在输入时需在数据前面加上0X作为二进制标识,例如输入0XBB4代表BB4。

(2)VARBINARY

VARBINARY数据类型用来存储可达8000字节长的变长的二进制数据。当输入表的内容大小可变时,应该使用这种数据类型。

9.其他数据类型

(1)ROWVERSION

在SQL Server 2016中,每一次对数据表的更改,SQL Server都会更新一个内部的序列数,这个序列数就保存在ROWVERSION字段中。所有ROWVERSION列的值在数据表中是唯一的,并且每张表中只能有一个包含ROWVERSION字段的列存在。

使用ROWVERSION作为数据类型的列,其字段本身的内容是无自身含义的,这种列主要是作为数据是否被修改过、更新是否成功的作用列。

(2)TIMESTAMP

TIMESTAMP时间戳数据类型和ROWVERSION有一定的相似性,每次插入或更改包含TIMESTAMP的记录时,TIMESTAMP的值就会更新,一张表中只能有一个TIMESTAMP列。在创建表时只需提供数据类型即可,不需要为TIMESTAMP所在的数据列提供列名:

    CREATE TABLE TestTable1(PriKey int PRIMARY KEY, timestamp)

使用ROWVERSION时不具备这种特性,如果要为某一列指定为ROWVERSION数据类型,需声明列名:

    CREATE TABLE TestTable2(PriKey int PRIMARY KEY, VeCol rowversion)

(3)UNIQUEIDENTIFIER

全局唯一标识符GUID,一般用作主键的数据类型,是由硬件地址、CPU标识、时钟频率所组成的随机数据,在理论上每次生成的GUID都是全球独一无二、不存在重复的。通常在并发性较强的环境下可以考虑使用。它的优点在于全球唯一性、可对GUID值随意修改,但是缺点也很明显,检索速度慢、编码阅读性差。

(4)CURSOR

游标数据类型,该类型的数据用来存放数据库中选中所包含的行和列,只是一个物理地址的引用,并不包含索引,用于建立数据集。

(5)SQL_VARIANT

用于存储SQL Server 2016支持的各种数据类型(不包括TEXT、NTEXT、IMAGE、TIMESTAMP和SQL_VARIANT)的值。

在微软后续的SQL版本中将不再使用TIMESTAMP数据类型,请避免使用。已使用的请修改设计,避免出现问题。

4.1.2 用户自定义数据类型

在SQL Server 2016中,除了系统提供的基本数据类型外,用户还可以根据自己的需求自定义数据类型。这里要注意的是,用户自定义数据类型并不是完全按照自己的意愿凭空创造,而是建立在系统的基础数据类型之上。用户在自定义数据类型的时候需要指定该类型的名称、所基于的基础数据类型是否可以为空等。在SQL Server 2016中可以使用两种方法来创建自定义数据类型,下面分别对这两种方法进行介绍。

1.使用资源管理器创建

首先连接SQL Server 2016服务器,创建一个用于测试的数据库test,配置参数使用系统默认的即可。创建自定义数据类型的操作步骤如下:

步骤01 数据库创建成功后,依次单击【test】|【可编程性】|【类型】节点,在【类型】节点打开之后可以看到【用户定义数据类型】节点,右击此节点,在弹出的快捷菜单中选择【新建用户定义数据类型】命令,如图4.1所示。

图4.1 选择【新建用户定义数据类型】命令

步骤02 在弹出的【新建用户定义数据类型】对话框中,可以对一些常用的参数进行设置:【名称】用于标识用户定义新数据类型的名字,在这里定义的新数据类型名为MyNewType;在【数据类型】下拉列表中选择nchar类型;将【长度】设置为4000;如果该字段能够为空,可以选中【允许NULL值】复选框,如图4.2所示。

图4.2 设置自定义数据类型

步骤03 所需的参数都输入完成之后,单击【确定】按钮就完成了自定义数据类型的设置,可以通过展开【用户定义数据类型】节点看到,如图4.3所示。

图4.3 建立好的自定义数据类型

数据库正在使用的用户自定义数据类型不能被删除。

2.使用T-SQL语句创建

在SQL Server 2016中除了能够使用管理器创建自定义类型之外,还可以通过存储过程提供的sp_addtype语句来创建,语法规则如下:

    sp_addtype[@typename=] type,
    [@phystype=] system_data_type
    [,[@nulltype=]'null_type']
    [,[@owner=]'owner_name']

【参数解释】

● [@typename=]type:创建自定义类型的名称。

● [@phystype=] system_data_type]:该类型所依附的基本数据类型。

● [@nulltype=]'null_type':指定该数据类型的空属性,其值可为null、not null、nonull。

【例4-1】创建一个自定义数据类型——ZipCode邮编地址类型,操作步骤如下。

步骤01 在对应的数据库中创建一个查询,在弹出的查询编辑器中输入如图4.4所示的代码。

图4.4 在查询编辑器中输入代码

步骤02 代码编辑完成后,单击【执行】按钮。执行成功后,右击【用户定义数据类型】,在弹出的快捷菜单中选择【刷新】命令,可以看到数据类型已创建成功,如图4.5所示。

图4.5 新建用户定义数据类型

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