第5章〓数据库和表的管理 【本章导读】 管理SQL Server的数据库和表有两种方式: 一是使用SSMS,二是使用TSQL语句。本章主要讲述SQL Server 数据库和表的结构、创建和管理,SQL Server 2019提供的数据类型以及数据的更新和导入。 【本章要点】  数据库的基本结构。  数据库的创建和管理。  表的结构。  SQL Server 2019的系统数据类型。  表的创建和管理。  数据的插入、修改和删除。  数据导入。 视频讲解 5.1数据库的创建 5.1.1数据库的结构 1. 数据库文件和文件组 SQL Server 2019用文件来存放数据库,即将数据库映射到操作系统文件上。数据库文件有以下3类。 (1) 主数据文件(Primary Database File,也称主文件): 主要用来存储数据库的启动信息、部分或全部数据,是数据库的关键文件。主数据文件是数据库的起点,包含指向数据库中其他文件的指针。每个数据库都有一个主数据文件。主数据文件的推荐文件扩展名是.mdf。 (2) 次要数据文件(Secondary Database File,也称辅助数据文件): 除主数据文件以外的所有其他数据文件都是次要数据文件。用于存储主数据文件中未存储的剩余数据和数据库对象。一个数据库可以没有,也可以有多个次要数据文件。次要数据文件的推荐文件扩展名是.ndf。 (3) 事务日志文件: 简称日志文件,存放用来恢复数据库所需的事务日志信息,每个数据库必须有一个或多个日志文件。事务日志的推荐文件扩展名是.ldf。 SQL Server 2019不强制使用.mdf、.ndf和.ldf文件扩展名,但使用它们有助于标识文件的各种类型和用途。 SQL Server 2019中的文件通常有两个名称: 逻辑文件名和物理文件名。逻辑文件名是在所有TSQL语句中引用物理文件时所使用的名称。逻辑文件名与物理文件名一一对应,其对应关系由SQL Server系统维护。逻辑文件名必须符合SQL Server的标识符命名规则,而且在数据库中的逻辑文件名中必须是唯一的。物理文件名是包括目录路径的文件名。它必须符合操作系统文件的命名规则。 一般情况下,一个简单的数据库可以只有一个主数据文件和一个日志文件。如果数据库很大,则可以设置多个次要数据文件和多个日志文件,并将它们放在不同的磁盘上,以提高数据存取和处理的效率。 为便于分配和管理,可以将数据库对象和文件一起分成文件组,对它们整体进行管理。例如,可以将3个数据文件(data1.ndf、data2.ndf和data3.ndf)分别创建在3个磁盘上,这3个文件共同组成文件组fgroup1。在创建表时,就可以指定一个表创建在文件组fgroup1上。这样该表的数据就可以分布在3个盘上,在对该表执行查询时,可以并行操作,从而有效地提高查询效率。 SQL Server 2019中提供了两种类型的文件组: 主文件组和用户定义文件组。 主文件组包含主数据文件和任何没有明确分配给其他文件组的数据文件。用户定义文件组是在CREATE DATABASE或ALTER DATABASE语句中使用FILEGROUP关键字指定的任何文件组。 一个文件组可以包含多个文件,但是一个文件只能属于一个文件组。每个数据库中均有一个文件组被指定为默认文件组。如果创建表或索引时未指定文件组,则将其分配到默认文件组。一次只能有一个文件组作为默认文件组。db_owner固定数据库角色成员可以将默认文件组从一个文件组切换到另一个文件组。如果没有指定默认文件组,则将主文件组作为默认文件组。 日志空间与数据空间要分开管理,所以日志文件不包括在文件组内。 综上所述,SQL Server的数据文件和文件组必须遵循以下规则。 (1) 一个文件和文件组只能被一个数据库使用。 (2) 一个文件只能属于一个文件组。 (3) 日志文件不能属于文件组。 用户可以指定数据库文件的存放位置,如果用户不指定,则数据库文件将被存放在系统的默认存储路径上。SQL Server 2019的默认存储路径是C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQLDATA。如果多个SQL Server实例在一台计算机上运行,则每个实例都会用不同的默认路径来保存在该实例中创建的数据库文件。 2. 数据库对象 SQL Server 2019数据库中的数据在逻辑上被组织成一系列对象,当一个用户连接到数据库后,他所看到的是这些逻辑对象,而不是物理的数据库文件。 SQL Server 2019中有以下数据库对象: 表(Table)、视图(View)、存储过程 (Stored Procedures)、触发器(Triggers)、用户定义数据类型(Userdefined Data Types)、用户自定义函数(Userdefined Functions)、索引(Indexes)、规则 (Rules)、默认值(Defaults)等。 在SQL Server 2019中创建的每个对象都必须有一个唯一的完全限定对象名,即对象的全名。完全限定对象名由4个标识符组成: 服务器名、数据库名、所有者名和对象名,各个部分之间由句点“.”连接。格式如下: 服务器名.数据库名.所有者名.对象名 server.database.Owner.object 使用当前数据库内的对象可以省略完全限定对象名的某部分,省略的部分系统将使用默认值或当前值,例如: server.database..object/*省略所有者名称 */ server..owner.object/*省略数据库名称 */ database.owner.object/*省略服务器名称 */ server…object/*省略数据库及所有者名称 */ owner.object/*省略服务器及数据库名称 */ object/*省略服务器、数据库及所有者名称 */ 5.1.2系统数据库 在没创建任何数据库之前,依次打开SSMS中“对象资源管理器”对话框中的“服务器”→“数据库”→“系统数据库”文件夹,可以看到4个系统数据库,如图51所示。 图51系统数据库 SQL Server 2019的系统数据库分别是master数据库、tempdb数据库、model数据库和msdb数据库。 1. master数据库 master数据库记录SQL Server的所有系统级信息。包括实例范围内的元数据(如登录账户)、端点、连接服务器和系统配置设置。master数据库也记录了所有其他数据库是否存在以及它们的数据库文件位置。另外,master数据库还记录了SQL Server的初始化信息。因此,如果master数据库不可用,则SQL Server将无法启动。 2. tempdb数据库 tempdb数据库是连接到SQL Server实例的所有用户都可用的全局资源,它保存了所有临时表和临时存储过程。另外,它还用来满足所有其他临时存储的要求,如存储SQL Server生成的临时工作表。 每次启动SQL Server时,都要重新创建tempdb,以便系统启动时,该数据库总是空的。在断开连接时,系统会自动删除临时表和存储过程,并且在系统关闭后没有活动连接。因此tempdb中不会有什么内容从一个SQL Server会话保存到另一个会话。 3. model数据库 model数据库是在SQL Server实例上创建的所有数据库的模板。因为每次启动SQL Server 时都会创建tempdb,所以model数据库必须始终存在于SQL Server系统中。model数据库相当于一个模子,所有在系统中创建的新数据库的内容,在刚创建时都和model数据库完全一样。 4. msdb数据库 msdb数据库由SQL Server代理(SQL Server Agent)来计划警报和作业。 5.1.3创建数据库 1. 使用SSMS创建数据库 在SSMS中创建数据库可以按照下列步骤来操作。 (1) 打开SSMS,连接到相应的服务器。在“对象资源管理器”中,逐个展开将被使用的“服务器”→“数据库”,右击数据库,在弹出的快捷菜单中选择“新建数据库”命令,如图52所示。 图52创建新数据库 (2) 在出现的如图53所示的“新建数据库”窗口中,左侧“选择页”包括“常规”“选项”和“文件组”3项。默认显示的是“常规”选项,可以在该选项卡中设置新建数据库的名称、数据库的所有者、数据文件、事务日志文件等信息。在“数据库名称”文本框内输入“Study”,就建立了“Study”数据库,同时系统为数据库设置了两个必需的文件。 图53“新建数据库”对话框 要添加一个数据库文件,可以在“新建数据库”窗口中单击“添加”按钮。现在为新的数据库文件设置“逻辑名称”为study_log1,“文件类型”修改为“日志”类型,如图54所示。 图54添加数据库文件1 再为数据库添加一个数据库文件study_data1,如图55所示。可以为数据文件study_data1设置所在的文件组,单击“文件组”选项,可以显示本数据库所包含的所有文件组,因为是新建数据库,所以在这里只有两项。如果选择“<新文件组>”,将打开“Study的新建文件组”对话框,可以为本数据库添加一个新的文件组,如图56所示。 图55添加数据库文件2 要删除一个数据库文件,选中该文件,单击“删除”按钮即可。 图56新建文件组 对于数据库文件的设置包括以下内容。 ① 逻辑名称: 标识一个数据文件。 图57“更改Study的自动增长设置”对话框 ② 文件类型: 标识此文件的类型,包括行数据和日志两种类型。 ③ 文件组: 标识该文件所在的文件组名称,默认为PRIMARY。 ④ 初始大小: 设置文件的初始大小。 ⑤ 自动增长/最大大小: 设置文件的自动增长方式和最大文件大小,可以通过单击其后的“…”来设置具体选项,如图57所示。 ⑥ 路径: 表示该文件所在的完整路径。 ⑦ 文件名: 数据库文件的物理文件名,即其在操作系统下的名称。 (3) 在“新建数据库”对话框左侧的“选择页”中单击“选项”,在出现的选项页面中可以设置数据库的选项信息,如排序规则、恢复模式、兼容性级别、包含类型和其他选项,如图58所示。 图58设置数据库选项 (4) 在“新建数据库”对话框左侧的“选择页”中单击“文件组”选项,可以显示当前数据库中的所有文件组信息,如图59所示。可以在此页查看或修改文件组的信息,也可以单击“添加文件组”按钮新建文件组。单击“删除”按钮,删除一个选中的文件组。当一个文件组被删除后,包含在其中的数据文件会自动添加到默认的文件组。需要注意的是,PRIMARY文件组是不能被删除的。 (5) 当设置完需要的信息后,单击“确定”按钮,系统会根据用户设置的信息完成数据库的建立。 在SSMS的“对象资源管理器”中,会出现新的数据库Study,如图510所示。 可以根据用户设置的数据库文件存储路径找到创建的数据库文件。默认情况下,在本机的C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQLDATA下生成物理数据库文件,如图511所示。 图59设置文件组 图510查看新建的数据库 图511数据库文件及路径 2. 使用TSQL语句创建数据库 TSQL提供了数据库创建语句CREATE DATABASE。其语法格式如下。 CREATE DATABASE database_name/*指定数据库逻辑名称*/ [ON [[,…n]] [,[,…n]]]/*指定数据文件及文件组属性*/ [LOG ON{[,…n]}]/*指定日志文件属性*/ [COLLATE ]/*指定数据库的默认排序规则*/ [FOR LOAD|FOR ATTACH]/*FOR LOAD从一个备份数据库向新建数据库加载数据; FOR ATTACH从已有的数据文件向数据库添加数据*/ 说明: (1) database_name是所创建的数据库的逻辑名称。数据库名称在当前服务器中必须唯一,且符合标识符的命名规则,最多可以包含128个字符。 (2) ON子句用于指定数据文件及文件组属性,具体属性值在中指定。格式如下。 ::=[PRIMARY] (NAME='逻辑文件名', FILENAME='存放数据库的物理路径和文件名' [, SIZE=数据文件的初始大小] [, MAXSIZE=指定文件的最大大小] [, FILEGROWTH=指出文件每次的增量]) 项用以定义用户文件组及其文件。格式如下: ::= FILEGROUP 文件组名 (3) LOG ON子句用于指定事务日志文件的属性,具体属性值在中指定。 如果在定义时没有指定ON子句和LOG ON子句,系统将采用默认设置,自动生成一个主数据文件和一个事务日志文件,并将文件存储在系统默认路径上。 【例51】创建一个名为BookSys的数据库。 CREATE DATABASE BookSys 由于没有指定数据库文件名,在默认的情况下,命名主数据文件为BookSys.mdf,事务日志文件名为BookSys_log.log。同时由于按复制model数据库的方式来创建新的数据库,主数据文件和事务日志文件的大小都与model数据库的主数据文件和事务日志文件大小一致,并且可以自由增长。 【例52】创建一个名为KEJI_DB的数据库。要求有3个文件,其中,主数据文件为10MB,最大大小为50MB,每次增长20%; 辅助数据文件属于文件组Fgroup,文件为10MB,大小不受限制,每次增长10%; 事务日志文件大小为20MB,最大大小为100MB,每次增长10MB。文件存储在c:\db路径下。 CREATE DATABASEKEJI_DB/*数据库名*/ ON PRIMARY/*主文件组*/ (NAME='KEJI_DB_Data1',/*主文件逻辑名称*/ FILENAME='c:\db\KEJI_DB_Data1.mdf',/*主文件物理名称*/ SIZE=10mb, MAXSIZE=50mb, FILEGROWTH=20%), FILEGROUP Fgroup/*文件组*/ (NAME='KEJI_DB_Data2',/*主文件逻辑名称*/ FILENAME='c:\db\ KEJI_DB_Data2.ndf',/*主文件物理名称*/ MAXSIZE=UNLIMITED,/*增长不受限制*/ SIZE=10Mb, FILEGROWTH=10mb) LOG ON (NAME='KEJI_DB_Log',/*日志文件逻辑名称*/ FILENAME='c:\db\ KEJI_DB_Log.ldf', /*日志文件物理名称*/ SIZE=20mb, MAXSIZE=100mb, FILEGROWTH=10mb) 说明: KEJI_DB数据库的物理文件创建在c:\db路径下,在运行此语句前要首先确定此路径是存在的。 5.1.4查看数据库信息 1. 使用SSMS查看数据库信息 在SSMS的“对象资源管理器”中,展开“服务器”→“数据库”,右击数据库Study,在弹出的快捷菜单中选择“属性”命令,打开如图512所示的“数据库属性”对话框来查看数据库的信息。 “数据库属性”对话框包含“常规”“文件”“文件组”“选项”“更改跟踪”“权限”“扩展属性”“镜像”“事务日志传送”和“查询存储”10个选择页。可以通过它们查看、修改数据库的基本属性,在此不再具体说明。 图512Study的“数据库属性”对话框 2. 使用TSQL语句查看数据库信息 (1) 使用系统存储过程sp_helpdb查看数据库信息。其语法格式如下。 sp_helpdb[数据库名] ① 不指定数据库参数,将显示服务器中所有数据库的信息,如图513所示。 ② 指定具体数据库参数,将显示指定数据库的信息,如图514所示。 (2) 使用系统存储过程sp_databases。其语法格式如下。 sp_databases 此命令将显示服务器中所有可以使用的数据库的信息,如图515所示。 (3) 使用系统存储过程sp_helpfile查看数据库中文件的信息。其语法格式如下。 sp_helpfile [文件名] 图513查看服务器中所有数据库的信息 图514查看Study数据库的信息 图515查看服务器中所有可用的数据库的信息 ① 不指定文件名参数,将显示当前数据库中所有文件的信息,如图516所示。 图516查看Study数据库中所有文件的信息 ② 指定具体文件名参数,将显示数据库中指定文件的信息,如图517所示。 图517查看Study数据库中study_data1文件的信息 (4) 使用系统存储过程sp_helpfilegroup查看文件组信息。其语法格式如下。 sp_helpfilegroup [文件组名] ① 不指定文件组名参数,将显示数据库中所有文件组的信息。 ② 指定具体文件组名参数,将显示数据库中指定文件组的信息。 其用法同sp_helpfile。 5.1.5修改数据库 修改数据库包括增减数据库文件、修改文件属性(包括更改文件名和文件大小等)、修改数据库选项等。 1. 使用SSMS修改数据库 在SSMS的“对象资源管理器”中,展开“服务器”→“数据库”,右击要修改的数据库如Study,在弹出的快捷菜单中选择“属性”命令,打开“数据库属性”对话框来修改数据库的信息。 (1) 增减数据库文件和文件组。用户可以使用“文件”选项增减数据库文件或修改数据库文件属性。可以使用“文件组”选项增加或删除一个文件组,修改现有文件组的属性。具体操作在新建数据库时已经涉及,在此不再赘述。 (2) 修改数据库选项。使用“选项”选项可以修改数据库的选项。只需在图518中单击要修改的属性值后的下拉列表按钮,选择True或False,就可以非常容易地更改当前数据库的选项值。 图518使用“选项”选项卡修改数据库选项 2. 使用TSQL语句修改数据库 TSQL提供了数据库修改语句ALTER DATABASE。其基本语法格式如下。 ALTER DATABASE database_name/*指定要修改的数据库的名称*/ {ADD FILE [,…n][TO FILEGROUP filegroup_name] /*在文件组中增加数据文件*/ |ADD LOG FILE [,…n]  /*增加事务日志文件*/ |REMOVE FILE logical_file_name  /*删除数据文件*/ |ADD FILEGROUP filegroup_name  /*增加文件组*/ |REMOVE FILEGROUP filegroup_name  /*删除文件组*/ |MODIFY FILE   /*修改文件属性*/ |MODIFY NAME=new_dbname  /*更新数据库名称*/ } 【例53】为KEJI_DB数据库增加一个数据文件KEJI_DB_Data3,物理文件名为KEJI_ DB_Data3.ndf,初始大小为5MB,最大大小为50MB,每次扩展1MB。 ALTER DATABASE KEJI_DB ADD FILE (NAME ='KEJI_DB_Data3', FILENAME='c:\db\KEJI_DB_Data3.ndf', SIZE=5MB, MAXSIZE=50MB, FILEGROWTH=1MB) 其中,ADD FILE是指增加一个数据文件,还可以使用ADD LOG FILE增加事务日志文件。 【例54】将KEJI_DB数据库的第二个数据文件KEJI_DB_data2的初始大小修改为 40MB。 ALTER DATABASE KEJI_DB MODIFY FILE (NAME ='KEJI_DB_data2', SIZE=40MB) 【例55】删除KEJI_DB的数据文件KEJI_DB_Data3。 ALTER DATABASE KEJI_DB REMOVE FILE KEJI_DB_Data3 【例56】使用ALTER DATABASE语句修改数据库选项,将Study数据库的自动缩减选项设置为True。 ALTER DATABASE Study SET AUTO_SHRINK ON 关于ALTER DATABASE语句的更详细的用法可以参考SQL Server 2019的联机丛书。 5.1.6删除数据库 当不再需要用户定义的数据库,或者已将其移到其他数据库或服务器上时,可以删除该数据库。数据库删除之后,文件及其数据都从服务器的磁盘中删除。一旦删除数据库,它将被永久删除,并且不能进行检索,除非使用以前的备份。所以,删除数据库之前应格外小心。 可以删除数据库,而不管该数据库所处的状态。这些状态包括脱机、只读和可疑。 删除数据库时,应注意以下情况。 (1) 如果数据库涉及日志传送操作,应在删除数据库之前取消日志传送操作。 (2) 若要删除为事务复制发布的数据库,或删除为合并复制发布或订阅的数据库,必须首先从数据库中删除复制。 (3) 如果数据库已损坏,不能删除复制,则可以首先使用ALTER DATABASE语句将数据库设置为脱机,然后再删除数据库。 (4) 不能删除系统数据库。 (5) 删除数据库后,应备份master数据库,因为删除数据库将更新master数据库中的信息。如果必须还原master,自上次备份master以来删除的任何数据库仍将引用这些不存在的数据库。这可能导致产生错误消息。 1. 使用SSMS删除数据库 在SSMS的“对象资源管理器”中找到要删除的数据库,右击选中的数据库,在弹出的快捷菜单中选择“删除”命令,进入如图519所示的“删除对象”窗口,单击“确定”按钮即可删除数据库。 图519删除数据库 2. 使用TSQL语句删除数据库 使用TSQL提供的DROP DATABASE语句可以删除数据库,并且可以一次删除多个数据库。其语法格式如下。 DROP DATABASE database [,…n] 【例57】删除数据库BookSys。 DROPDATABASE BookSys 5.2数据表的创建 表是用来存储数据和操作数据的逻辑结构。关系数据库中的所有数据都存储在表中,因此表是SQL Server数据库最重要的组成部分。在介绍表的创建之前,先要介绍SQL Server 2019提供的数据类型。 视频讲解 5.2.1数据类型 SQL Server为了实现TSQL的良好性能,提供了丰富的数据类型。 1. 数值型数据 (1) bigint。bigint型数据可以存放-263~263-1范围内的整型数据。以bigint数据类型存储的每个值占用8B,共64位,其中63位用于存储数字,1位用于表示正负。 (2) int。int也可以写作integer,可以存储-231~231-1范围内的全部整数。以int数据类型存储的每个值占用4B,共32位,其中31位用于存储数字,1位用于表示正负。 (3) smallint。smallint型数据可以存储-215~215-1范围内的所有整数。以smallint数据类型存储的每个值占用2B,共16位,其中15位用于存储数字,1位用于表示正负。 (4) tinyint。tinyint型数据可以存储0~255范围内的所有整数。以tinyint数据类型存储的每个值占用1B。 整数型数据可以在较少的字节里存储较大的精确数字,而且存储结构的效率很高。所以,平时在选用数据类型时,应尽量选用整数型数据类型。 (5) decimal和numeric。事实上,numeric数据类型是decimal数据类型的同义词,decimal可以简写为Dec。在TSQL中,numeric与decimal数据类型在功能上是等效的。 使用decimal和numeric型数据可以精确指定小数点两边的总位数p(precision,精度)和小数点右面的位数s(scale,刻度)。 在SQL Server中,decimal和numeric型数据的最高精度可以达到38位,即1≤p≤38,0≤s≤p。decimal和numeric型数据的刻度的取值范围必须小于精度的最大范围。 SQL Server分配给decimal和numeric型数据的存储空间随精度的不同而不同,一般说来,对应的比例关系如下。 精度范围分配字节数 1~95 10~199 20~2813 29~3817 (6) real和float。real型数据范围为-3.40E+38~1.79E+38,存储时使用4B,精度可以达到7位。float型数据范围为-1.79E+38~1.79E+38。利用float来表明变量和表列时可以指定用来存储按科学记数法记录的数据尾数的bit数。例如float(n),n的范围是1~53。当n的取值为1~24时,float型数据可以达到的精度是7位,用4B来存储; 当n的取值范围为25~53时,float型数据可以达到的精度是15位,用8B来存储。 2. 字符数据类型 SQLServer提供了3类字符数据类型,分别是char、varchar和text。在这3类数据类型中,最常用的是char和varchar两类。 (1) char(n)。利用char数据类型存储数据时,每个字符占用一个字节的存储空间。char数据类型使用固定长度来存储字符,最长可以容纳8000个字符。利用char数据类型来定义表列或者变量时,应该给定数据的最大长度n。如果实际数据的字符长度短于给定的最大长度,则多余的字节会以空格填充。如果实际数据的字符长度超过了给定的最大长度,则超过的字符将会被截断。在使用字符型常量为字符数据类型赋值时,必须使用单引号('')将字符型常量引起来。 (2) varchar(n)。varchar数据类型的使用方式与char数据类型类似。SQL Server利用varchar数据类型来存储最长可以达到8000字符的变长字符。与char数据类型不同的是,varchar数据类型的存储空间随存储在表列中的每一个数据的字符数的不同而变化。 例如,定义表列为varchar(20),那么存储在该列的数据最多可以长达20B。但是,在数据没有达到20B时并不会在多余的字节上填充空格,而是按实际占用的字符长度分配字节。 当存储在列中的数据值大小经常变化时,使用varchar数据类型可以有效地节省空间。 (3) text。当要存储的字符型数据非常庞大以至于8000B完全不够用时,char和varchar数据类型都失去了作用,这时应该选择text数据类型。 text数据类型专门用于存储庞大的变长字符数据。最大长度可以达到231-1个字符,约2GB。 【例58】建立一个以字符类型定义表列的表,然后向其中插入一行数据。 创建一个表格: CREATE TABLEchars_example (char_1 char(5), varchar_1 varchar(5), text_1 text) go 插入一行数据: INSERT INTO chars_example VALUES('abc', 'abc', 'dddddddddddddddddddddddddd') go 3. 日期/时间数据类型 SQL Server提供的日期/时间数据类型可以存储日期和时间的组合数据。以日期和时间数据类型存储日期或时间的数据比使用字符型数据更简单,因为SQL Server提供了一系列专门处理日期和时间的函数来处理这些数据。如果使用字符型数据来存储日期和时间,只有用户本人可以识别,计算机并不能识别,因而也不能自动将这些数据按照日期和时间来进行处理。 日期/时间数据类型有datetime和smalldatetime两类。 (1) datetime。datetime数据类型范围从1753年1月1日到9999年12月31日,可以精确到千分之一秒。datetime数据类型的数据占用8B的存储空间。 (2) smalldatetime。smalldatetime数据范围从1900年1月1日到2079年6月6日,可以精确到分。smalldatetime数据类型占4B的存储空间。 SQL Server在用户没有指定小时以上精度的数据时,会自动设置datetime和smalldatetime数据的时间为00:00:00。 在SQL Server 2019中,用户可以使用GETDATE()函数来得到系统时间,使用SET DATEFORMAT命令设置日期格式。 【例59】设置日期格式为“月日年”。 Set DATEFORMAT MDY 本例设置的日期格式为“月日年”。M表示月,D表示日,Y表示年。 SQL Server 2019提供了多种日期表达式,其中,年可以是4位数或2位数,月和日可以用2位数或1位数。系统默认的日期格式是: 年月日。常用的日期格式如下。  年  年月日  月日年  月/日/年  年月日 4. 货币数据类型 货币数据类型专门用于货币数据处理。SQL Server提供了money和smallmoney两种货币数据类型。 (1) money。money数据类型存储的货币值由2个4B整数构成。前面的一个4B表示货币值的整数部分,后面的一个4B表示货币值的小数部分。以money存储的货币值的范围为-263~263-1,可以精确到万分之一货币单位。 (2) smallmoney。由smallmoney数据类型存储的货币值由2个2B整数构成。前面的一个2B表示货币值的整数部分,后面的一个2B表示货币值的小数部分。以smallmoney存储的货币值的范围为-231~231-1,也可以精确到万分之一货币单位。 在把值加入定义为money或smallmoney数据类型的表列时,应该在最高位之前放一个货币记号$或其他货币单位的记号,但是也没有严格要求。 【例510】建立一个以货币数据类型定义表列的表,然后向其中插入一行数据。 建立一个表格: CREATE TABLE money_example2 (money_num money, smallmoney_num smallmoney ) go 插入一行数据: INSERT INTO money_example2 VALUES ($222.222,$333.333) 5. 二进制数据类型 二进制数据是一些用十六进制来表示的数据。例如,十进制数据245表示成十六进制数据就应该是F5。在SQL Server中,可以使用3种数据类型来存储二进制数据,分别是binary、varbinary和image。 二进制数据类型同字符数据类型非常相似。使用binary数据类型定义的列或变量,具有固定的长度,最大长度可以达到8KB; 使用varbinary数据类型定义的列或变量具有不固定的长度,其最大长度也不得超过8KB; image数据类型可以用于存储字节数超过8KB的数据,比如Microsoft Word文档、Microsoft Excel图表及图像数据(包括.GIF、.BMP、.JPEG文件)等。 一般说来,最好使用binary或varbinary数据类型来存储二进制数据。只有在数据的字节数超过8KB的情况下,才使用image数据类型。 在对二进制数据进行插入操作时,必须在数据常量前面增加一个前缀0x。 【例511】建立一个以二进制数据类型定义表列的表,然后向其中插入一行数据。 建立一个表格: CREATE TABLE binary_example (bin_1 binary(5), bin_2 varbinary(5)) go 插入一行数据: INSERT INTO binary_example VALUES (0xaabbccdd,0xaabbccddee) INSERT INTO binary_example VALUES (0xaabbccdde,0x) go 6. 双字节数据类型 SQL Server 2019提供的双字节数据类型共有3类,分别是nchar、nvarchar、ntext。 (1) nchar(n)。nchar(n)是固定长度的双字节数据类型,括号里的n用来定义数据的最大长度。n的取值范围是1~4000,所以使用nchar数据类型所能存储的最大字符数是4000字符。由于存储的都是双字节字符,所以双字节数据的存储空间为: 字符数×2(B)。 nchar数据类型的其他属性及使用方法与char数据类型一样。例如,在有多余字节的情况下也会自动加上空格进行填充。 (2) nvarchar(n)。nvarchar(n)数据类型存储可变长度的双字节数据类型,括号里的n用来定义数据的最大长度。n的取值为0~4000。所以使用nvarchar数据类型所能存储的最大字符数也是4000。nvarchar数据类型的其他属性及使用方法与varchar数据类型一样。 (3) ntext。ntext数据类型存储的是可变长度的双字节字符,ntext数据类型突破了前两种双字节数据类型不能超过4000字符的规定,最多可以存储多达230-1个双字节字符。ntext数据类型的其他属性及使用方法与text数据类型一致。 7. 图像、文本数据的使用 为了方便用户存储和使用文本、图像等大型数据,SQL Server 2019提供了text、ntext和image三种数据类型。 文本和图像数据在SQL Server中是用text、ntext和image数据类型来表示的。这3种数据类型很特殊,因为它们的数据量往往较大,所以它们不像表中其他类型的数据那样一行一行地依次存放在数据页中,而是经常被存储在专门的页中,在数据行的相应位置处只记录指向这些数据实际存储位置的指针。在SQL Server 2019以前的版本中,文本和图像数据都是这样与表中的其他数据分开存储的。SQL Server 2019提供了将小型的文本和图像数据在行中存储的功能。 当将文本和图像数据存储在数据行中时,SQL Server 2019不需要为访问这些数据而去访问另外的页,这使得读、写文本和图像数据可以与读写varchar、nvarchar和varbinary字符串一样快。 为了指定某个表的文本和图像数据在行中存储,需要使用系统存储过程sp_tableoption设置该表的text in row选项为true。当指定text in row选项时,还可以指定一个文本和图像数据大小的上限值,这个上限值应为24B~7000B。当同时满足以下两个条件时,文本和图像数据可以直接存储在行中。 (1) 文本和图像数据的大小不超过指定的上限值。 (2) 数据行有足够的空间存放这些数据。 当以上两个条件有一个不满足时,行中只存放指向这些数据实际存储位置的指针。 现建立表text_example: CREATE TABLE text_example (bin_1 text, bin_2 ntext) 以下语句将指定text_example表在行中存储文本和图像数据。 sp_tableoption 'text_example','text in row','true' 规定text_example 表中不大于1000B的文本和图像数据直接在行中存储,可以执行以下语句。 sp_tableoption'text_example', 'text in row', '1000' 如果不显式地指定上限,那么默认的上限为256B,即在前一个例子中,行中存储文本和图像数据最大为256B 以下语句指定text_example表不在行中存储文本和图像数据。 sp_tableoption 'text_example', 'text in row', 'false' 8. 用户定义数据类型及使用 用户定义的数据类型并不是真正的数据类型,它只是提供了一种加强数据库内部和基本数据类型之间一致性的机制。通过使用用户定义数据类型能够简化对常用规则和默认值的管理。 可以使用系统存储过程sp_addtype来创建用户定义数据类型。其语法格式如下。 sp_addtype type_name, system_type,{'NULL'|'NOT NULL'} 默认为NULL,可以为空。 凡是包含诸如“()”或“,”等分隔符的系统数据类型,如Char(9),必须使用单引号括起来,即'Char(9)'。用户自定义数据类型在数据库中的命名必须唯一。只要命名唯一,甚至相同的类型定义也可以存储在同一个数据库中。 【例512】下面的例子创建了两个用户定义数据类型。 use model go exec sp_addtype telelephone,'varchar(24)','not null' exec sp_addtype fax, 'varchar(24)','null' 可以直接使用用户定义数据类型来定义表列,就如同使用系统数据类型那样。但是用户自定义数据类型更常与默认值或规则等配合使用。 使用系统存储过程sp_droptype可以删除用户定义数据类型,其语法格式如下。 sp_droptype type_name 在实际使用中,如果用户定义数据类型正被某表中的某列使用,则不能立即删除,必须首先删除使用该数据类型的表。 也可以使用SSMS来创建用户定义数据类型,步骤如下。 (1) 选中要创建数据类型的数据库Study,展开该结点。 (2) 选中树状结构上的“可编程性”→“类型”→“用户定义数据类型”。 (3) 右击,从弹出的快捷菜单中选择“新建用户定义数据类型”命令。在弹出的“新建用户定义数据类型”窗口中输入名称、系统数据类型、长度、可否为空等参数,如图520所示。 图520“新建用户定义数据类型”窗口 (4) 设置完毕后,单击“确定”按钮,即可完成用户定义数据类型的创建。 5.2.2创建表结构 在创建表及其对象之前,最好先规划并确定表的下列特征。 (1) 表要包含的数据类型。 (2) 表中的列数,每一列中数据的类型和长度(如果必要)。 (3) 哪些列允许空值。 下面在数据库Study中创建以下3个表: Student(学生)、Course(课程)、Score(选课)。表的结构如表51~表53所示。 表51Student表结构 列名数 据 类 型可 否 为 空备注 snochar(10)Not null学号 snamevarchar(40)Not null姓名 sagetinyintNull年龄 ssexchar(4)Null性别: 男,女 sbirthdaysmalldatetimeNull出生日期 departchar(20)Null系别 classchar(10)null班级 表52Course表结构 列名数 据 类 型可 否 为 空备注 cnochar(10)Not null课程号 cnamevarchar(40)Not null课程名 creditchar(4)Null学分 notesvarchar(200)Null备注 表53Score表结构 列名数 据 类 型可 否 为 空备注 snochar(10)Not null学号 cnochar(10)Not null课程号 degreetinyintnull成绩 表的创建也有两种方式: 一是通过SSMS创建,二是用TSQL命令创建。 1. 利用SSMS提供的图形界面创建表 利用SSMS提供的图形界面创建表,步骤如下。 (1) 在“对象资源管理器”的树形目录中找到要建表的数据库Study,展开该数据库。 (2) 选择“表”,右击,在弹出的快捷菜单中选择“新建表”命令,打开表设计器,如图521所示。 图521表设计器 (3) 表设计器的上半部分有一个表格,在这个表格中输入列的属性,表格的每一行对应设置一列。对每一列都需要进行以下设置。 ① 列名: 为每一列设定一个列名。 ② 数据类型: 数据类型是一个下拉列表框,其中包括所有的系统数据类型和用户定义数据类型。用户可根据需要来选择数据类型和长度。 ③ 允许Null值: 单击该行的复选框,可以切换是否允许该列为空值的状态。选中状态表示允许为空值,空白表示不允许为空值,默认状态下是允许为空值的。 表设计器的下半部分是特定列的详细属性,包括是否是IDENTITY列、是否使用默认值等。 (4) 逐个定义好表中的列,单击工具栏中的“保存”按钮。若没有在表设计器中给出表的名称,会出现保存对话框,提示用户输入表的名称,这里输入“Student”,如图522所示。单击“确定”按钮,Student表就建立完成了。 图522保存表结构 2. 使用TSQL语句创建表 在TSQL中,可以用CREATE TABLE命令来创建表,表中列的定义必须用括号括起来。一个表最多1024列。CREATE TABLE的基本语法格式如下。 CREATE TABLE table_name ({column_name datatypeNOT NULL|NULL}) 说明: (1) table_name是所创建的表的名称,表名在一个数据库内必须唯一。 (2) column_name是列名,列名在一个表内必须唯一。 (3) datatype是该列的数据类型,可以使用系统数据类型,也可以使用用户定义数据类型。对于需要给定数据最大长度的类型,在定义时要给出长度。 (4) NOT NULL|NULL指示该列可否输入空值,默认可以为空。 【例513】在Study数据库上创建课程表Course和成绩表Score。 use Study go CREATE TABLE Course/*定义课程表Course*/ (cno char(10) not null,  /*课程号列cno,不能输入空值*/ cname varchar(40) not null,  /*课程名列cname,不能输入空值*/ credit char(4),  /*学分列credit */ notes varchar(200))  /*备注列notes*/ go CREATE TABLE Score  /*定义成绩表Score*/ (sno char(10) not null,  /*学号列sno,不能输入空值*/ cno char(10) not null,  /*课程号列cno,不能输入空值*/ degree tinyint)  /*成绩列degree*/ go 5.2.3查看表结构 1. 使用SSMS查看表属性 在SSMS的“对象资源管理器”中找到要查看的表所在数据库,打开树形菜单中的“表”结点,其下方会显示这一数据库中所有的表,其中系统表单独在“系统表”文件夹内。对于每个表,都会显示它的结构。 在列表中选择一个要查看的表,右击打开快捷菜单,选择“属性”命令,打开“表属性”窗口,如图523所示。可以在此查看、设置表的属性、权限和扩展属性等。 图523查看Student表的属性 2. 使用TSQL语句显示表结构 可以使用系统存储过程sp_help来查看表结构,包括表的所有者、类型(系统表还是用户表)、创建时间、表上每一列的名称、数据类型、表上定义的索引及约束等。 【例514】查看表Course的基本结构。 use Study go exec sp_helpCourse 使用查询编辑器执行这一语句的结果如图524所示。 图524查看Course表的结构 实际上,使用sp_help可以查看所有数据库对象的定义,除了表外,还包括视图、存储过程以及用户定义数据类型等,只需将不同数据库对象的名字作为sp_help的输入参数即可。另外,若执行不带参数的sp_help命令时,将返回当前数据库中的所有数据库对象。 【例515】查看Study数据库上的所有数据库对象。 use Study go exec sp_help 执行结果如图525所示。 图525查看Study库的所有对象 5.2.4修改表结构 创建完一个表以后,如果要修改表的结构,如添加、修改及删除列等,可以使用SSMS或TSQL语句两种方式实现。 1. 使用SSMS修改表 在SSMS的“对象资源管理器”中找到要修改的表,右击,在弹出的快捷菜单中选择“设计”命令,将弹出如图521所示的表设计器。 此时可以像新建表时一样,向表中增加列、从表中删除列或修改列的属性,修改完毕后单击“保存”按钮即可。 选中某一列,右击,在弹出的快捷菜单中选择“删除列命令”,则可删除某一列。用与建表时相似的方法可以对列值进行修改。 2. 使用TSQL语句修改表 (1) 添加列。向表中增加一列时,应使新增加的列有默认值或允许为空值,SQL Server将向表中已存在的行填充新增列的默认值或空值。如果既没有提供默认值也不允许为空值,那么新增列的操作将会出错,因为SQL Server不知道该怎么处理那些已经存在的行。 向表中添加列的语句格式如下。 ALTER TABLE表名 ADD 列名 列的描述 【例516】向Student表中添加两个新的列: 邮箱Email和电话phone。 use Study go ALTER TABLE Student ADD Email varchar(20) null, phone char(20) null 可以一次向表中添加多个列,各列之间用逗号分开即可。 (2) 删除列。删除一列的语句格式如下。 ALTER TABLE表名 DROP COLUMN列名 【例517】删除Student表的Email列。 use Study go ALTER TABLE Student DROP COLUMN Email,phone (3) 修改列定义。表中的每一列都有其定义,包括列名、数据类型、数据长度及是否允许为空值等,这些值都可以在表创建好以后修改。 修改列定义的语句格式如下。 ALTER TABLE表名 ALTER COLUMN列名 列的描述 【例518】将Student表的姓名列sname改为最大长度为20的varchar型数据,且不允许为空值。 use Study go ALTER TABLE Student ALTER COLUMN sname varchar(20) not null 默认状态下,列是被设置允许空值的,将一个原来允许为空的列改为不允许为空时,必须在以下两个条件满足时才能成功。 ① 列中没有存放空值的记录。 ② 在列上没有创建索引。 5.2.5删除表结构 当不再需要某个表时,可以将其删除。一旦一个表被删除,那么它的数据、结构定义、约束、索引等都将被永久地删除,以前用来存储数据和索引的空间可以用来存储其他的数据库对象。 1. 使用SSMS删除表 使用SSMS删除一个表非常简单,只需在“对象资源管理器”中找到要删除的表,右击,在弹出的快捷菜单中选择“删除”命令。在打开的如图526所示的“删除对象”窗口中,单击“确定”按钮即可。 图526“删除对象”对话框 2. 使用TSQL语句删除表 在TSQL语句中,DROP TABLE语句可以用来删除表。其语法格式如下。 DROP TABLE表名 需要注意的是,DROP TABLE语句不能用来删除系统表。 【例519】删除Study数据库中的表table1。 use Study go DROP TABLE table1 视频讲解 5.3数据更新 新创建的表中没有任何数据,可以通过数据更新操作向表中插入新数据,修改表中的数据和删除表中的数据。 5.3.1向表中插入数据 使用INSERT语句,可以实现数据的插入操作。INSERT语句的基本语法格式如下。 INSERT[INTO]表名[(列名)] VALUES(表达式) 1. 添加数据到一行中的所有列 当将数据添加到一行中的所有列时,使用VALUES关键字来给出要添加的数据。INSERT语句中无须给出表中的列名,只要在VALUES中给出的数据与用CREATE TABLE定义表时给定的列名顺序、类型和数量均相同即可。 【例520】向Course表中添加一条记录。 use Study go INSERT INTO Course VALUES('080110H','数据库原理与应用','3','必修') 在查询编辑器中执行,返回的结果为: (1行受影响) 若对表中的结构不明确,即对列的顺序不明确,则要在表名后面给出具体的列名,而且列名顺序、类型和数量也要与VALUES中给出的数据一一对应。如上面的语句也可以写成如下形式。 INSERT INTO Course(cno,cname,credit,notes) VALUES('080110H','数据库原理与应用','3','必修') 2. 添加数据到一行中的部分列 要将数据添加到一行中的部分列时,则必须同时给出要使用的列名以及要赋给这些列的数据。 【例521】向Student表中添加一条记录。 use Study go INSERT INTO Student(sno,sname,sage,ssex,sbirthday) VALUES('05091101','李明',19,'男','1989-1-10') 在查询编辑器中执行,返回的结果为: (1行受影响) 对于这种添加部分列的操作,在添加数据前应确认表中的列是否允许为空,只有允许为空的列才能不出现在VALUES列表中。 注意: (1) 输入数据的顺序和数据类型必须与表中列的顺序和数据类型一致。 (2) 列名与数据必须一一对应,当每列都有数据输入时,列名可以省略,但输入数据的顺序必须与表中列的定义顺序相一致。 (3) 可以不给全部列赋值,但没有赋值的列必须是可以为空的列。 (4) 插入字符型和日期型数据时要用单引号括起来。 3. 添加多行数据 通过在INSERT语句中嵌套子查询,可以将子查询的结果作为批量数据,一次向表中添加多行数据。查询语句将在第6章中讲解,在此只给出一个简单的例子。 【例522】添加批量数据。 创建一个新的数据表stu_temp: CREATE TABLE stu_temp (sno char(10) not null, sname char(20) not null, sage tinyint) go 假设Student中已有一批数据,可以从Student表中选择部分数据插入新表stu_temp中,此时将所有女生的信息插入新表stu_temp中。 INSERT INTO stu_temp SELECT sno,sname,sage FROM Student WHERE ssex='女' 5.3.2修改表中数据 当数据添加到表中后,会经常需要修改,如客户的地址发生了变化、货品库存量的增减等。使用UPDATE语句可以实现数据的修改,其语法格式如下。 UPDATE表名 SET列名= 表达式 [ WHERE 条件 ] 【例523】将所有课程的备注信息都改为“必修”。 use Study go UPDATECourse SET notes='必修' 因为没有使用WHERE子句,所以对备注列的修改将影响到表中的每一行。 【例524】将课程号为080110H的课程改为“选修”。 use Study go UPDATE Course SET notes='必修' WHERE cno='080110H' 在此例中,只有满足WHERE子句条件的行被修改。 5.3.3删除表中数据 当数据的添加工作完成以后,随着使用和对数据的修改,表中可能存在着一些无用的数据,这些无用数据不仅会占用空间,还会影响修改和查询数据的速度,所以应及时将它们删除。 1. 使用DELETE语句删除数据 使用TSQL中的DELETE语句可以删除数据表中的一个或多个记录。DELETE语句最简单的形式如下。 DELETE表名 [WHERE条件] 其中,表名是要删除数据的表的名字。如果DELETE语句中没有WHERE子句限制,表中的所有记录都将被删除。 【例525】删除学号为05091101的学生的基本信息。 use Study go DELETE Student WHERE sno='05091101' 执行结果为: (1行受影响) 2. 使用TRUNCATE TABLE语句删除数据 TRUNCATE TABLE语句提供了一种删除表中所有记录的快速方法,因为TRUNCATE TABLE语句不记录日志,只记录整个数据页的释放操作,而DELETE语句对每一行修改都记录日志,所以TRUNCATE TABLE语句总比没有指定条件的DELETE语句快。 【例526】删除所有学生的成绩记录。 TRUNCATETABLEScore 因为TRUNCATE TABLE操作是不进行日志记录的,所以建议在使用TRUNCATE TABLE语句之前先对数据库备份,数据库备份的操作将在第10章中介绍。 视频讲解 5.4数据导入 在实际应用中,经常需要在不同或相同的数据源之间互相复制数据。SQL Server 2019提供了功能非常强大的组件,可以将SQL Server 2019中的数据导出到其他数据源或从其他数据源导入数据到SQL Server 2019中。 导出操作可以看作导入操作的反操作,本节主要介绍如何使用SQL Server 导入向导将Excel工作表中的数据导入SQL Server 2019中。 首先,新建一个Excel示例文件,在Sheet1工作表中输入需要导入的数据,文件名命名为teacher.xls,并保存在预先建好的文件夹下,如图527所示。 图527新建Excel文件 下面使用SQL Server 导入向导将此Excel文件中的数据导入Study数据库中,其操作步骤如下。 (1) 打开SSMS,在“对象资源管理器”中展开“数据库”文件夹,右击要向其导入数据的数据库,如Study,在弹出的快捷菜单中选择“任务”→“导入数据”命令。系统会启动SQL Server导入和导出向导工具,并出现欢迎界面,如图528所示。 图528导入和导出向导欢迎界面 (2) 单击Next按钮,出现“选择数据源”对话框,如图529所示。 图529“选择数据源”对话框 在此对话框中可以设置数据源的相关信息,可用的数据源包括Access、OLE DB访问接口、SQL本机客户端和Excel文件等。数据源不同,需要设置的身份验证模式、服务器名称、数据库名称和文件格式等选项也不同。根据实际操作中数据源的类型,在其后的下拉列表中选择相应的类型。在此选择Microsoft Excel,如图530所示。 图530设置Excel数据源 在Excel连接设置中设置Excel文件路径和Excel版本信息,并选中“首行包含列名称”复选框,表示该文件中的首行为列名称信息。 (3) 设置完数据源的相关信息后,单击Next按钮,出现“选择目标”窗口,如图531所示。 图531“选择目标”窗口 在“目标”选项下拉列表中选择Microsoft OLE DB Provider for SQL Server,表示选择SQL Server作为数据导入的目的地。选择相应的服务器名称、身份验证方式和数据导入的数据库Study,单击Next按钮即可。 (4) 接下来出现“指定表复制或查询”窗口,如图532所示。 图532“指定表复制或查询”窗口 其中,“复制一个或多个表或视图的数据”选项可以用于指定复制源数据库中现有表或视图的全部数据。“编写查询以指定要传输的数据”选项可以用于编写SQL查询,以便对复制操作的源数据进行操纵或限制。在此选择第一项“复制一个或多个表或视图的数据”。 (5) 单击Next按钮,会出现“选择源表和源视图”窗口,如图533所示。 图533“选择源表和源视图”窗口 在此窗口中可以设置数据导入的“源”“目标”和“映射”等选项。本例中,选中数据所在的工作表Sheet1$,“目标”选项中会出现数据导入的默认目标[Study].[dbo].[Sheet1$],可以对其进行修改,如将表名改为“teacher”。也可以选择已经存在的数据表作为数据导入的目的地。单击“编辑映射”按钮,将打开“列映射”对话框,如图534所示。 图534“列映射”窗口 在“列映射”窗口中,可以设置源和目标之间列的映射关系,来协调源和目标之间类型等的差异。还可以设置在数据导入时系统所做的工作,如对于不存在的目标表,可以选择“创建目标表”,而对于已存在的目标表,则可以根据需要选择“删除目标表中的行”“向目标表中追加行”或“删除并重新创建目标表”三种不同的操作。另外,还可以选择“启用标识插入”复选框来增加一个标识列。 设置完毕单击“确定”按钮,返回“选择源表和源视图”窗口,单击Next按钮,进入“保存并运行包”窗口。 (6) 在“保存并运行包”窗口中,设置是否要立即执行,还可以设置将包保存到 SQL Server msdb数据库或保存到文件系统,如图535所示。 图535“保存并运行包”窗口 (7) 设置完毕后,单击Next按钮,打开完成该向导窗口,给出本次数据导入的信息,如图536所示。 图536完成该向导窗口 单击Finish按钮,会出现导入数据的执行过程,并出现“执行成功”窗口,如图537所示。单击Close按钮,完成本次导入数据的操作。 图537“执行成功”窗口 (8) 数据导入成功后,可以打开Study数据库,查看teacher表中的数据,如图538所示。 图538查看导入的结果 小结 SQL Server 2019用文件来存放数据库,即将数据库映射到操作系统文件上。数据库文件有3类: 主数据文件、次要数据文件和事务日志文件。用户可以使用SSMS和TSQL语句两种方式创建、查看、修改和删除数据库。 SQL Server为了实现TSQL的良好性能,提供了丰富的数据类型,包括数值型、字符型、日期/时间型、货币型、二进制型、双字节型、图像、文本型以及用户自定义型数据。可以使用SSMS和TSQL语句两种方式创建、显示、修改和删除数据表结构。 新创建的表中没有任何数据,可以用TSQL语句插入、修改和删除数据,也可以用SQL Server 2019的数据导入功能实现批量数据导入。 习题 一、 填空题 1. SQL Server 2019提供的系统数据类型有、、、、和货币数据,也可以使用用户定义的数据类型。 2. SQL Server 2019的数据库包含3类文件: 、和。包含4个系统数据库: 、、和msdb数据库。 3. 可以使用系统存储过程来查看表的定义,后面加上要查看的作为参数。 二、 操作题 1. 创建用户定义的数据类型: 编号(非空,长度为8的字符型)。 2. 创建图书数据库(BookSys),并在数据库中建立图书信息(tsxx)、读者信息(dzxx)和借阅信息(jyxx)表,表结构如表54~表56所示。要求图书编号、读者编号使用用户定义类型: 编号。 表54tsxx表结构 图书编号 (tusbh)书名 (shum)价格 (jiag)出版社 (chubs)出版日期 (chubrq)作者 (zuoz) 说明: 图书编号、书名不能为空。 表55dzxx表结构 读者编号 (duzbh)姓名 (xingm)身份证号 (shenfzh)级别 (jib) 说明: 读者编号、姓名不能为空。 表56jyxx表结构 读者编号 (duzbh)图书编号 (tusbh)借阅日期 (jieyrq)还书日期 (huansrq)是否续借 (shifxj) 说明: 图书编号、读者编号不能为空。 3. 完成如下操作。 (1) 向读者信息表中添加列: 联系方式,可以为空。 (2) 修改列“出版社”的定义,长度修改为200。 (3) 删除“联系方式”一列。 4. 完成如下数据操作。 (1) 向各表插入若干数据。 (2) 修改读者信息表中编号为00001001的读者的级别为2级。 (3) 删除借阅信息表中编号为00001001的读者借阅10010001图书的记录。 5. 完成如下操作。 导入一个Excel表到SQL Server 2019的BookSys数据库中。