第3章 创建数据库和创建表 本章要点:  SQL Server数据库的基本概念  以图形界面方式创建SQL Server数据库  以命令方式创建SQL Server数据库  表的基本概念  以命令方式创建SQL Server表  使用图形用户界面创建SQL Server表 使用SQL Server设计和实现信息系统,首先就要设计和实现数据的表示和存储,即创建数据库,数据库是SQL Server用于组织和管理数据的基本对象,SQL Server能够支持多个数据库。表是最重要的数据库对象,它是由行和列构成的集合,用来存储数据。本章介绍SQL Server数据库的基本概念、以图形界面方式创建SQL Server数据库、以命令方式创建SQL Server数据库、表的基本概念、数据类型、以命令方式创建SQL Server表、以图形界面方式创建SQL Server表等内容。 3.1SQL Server数据库的基本概念 数据库是SQL Server存储和管理数据的基本对象,下面从逻辑数据库和物理数据库两个角度进行讨论。 3.1.1逻辑数据库 从用户的观点看,组成数据库的逻辑成分称为数据库对象,SQL Server数据库由存放数据的表以及支持这些数据的存储、检索、安全性和完整性的对象所组成。 1. 数据库对象 SQL Server的数据库对象包括表(table)、视图(view)、索引(index)、存储过程(stored procedure)、触发器(trigger)等,下面介绍常用的数据库对象。  表: 表是包含数据库中所有数据的数据库对象,由行和列构成,它是最重要的数据库对象。  视图: 视图是由一个表或多个表导出的表,又称为虚拟表。  索引: 为加快数据检索速度并可以保证数据唯一性的数据结构。  存储过程: 为完成特定功能的TSQL语句集合,编译后存放于服务器端的数据库中。  触发器: 它是一种特殊的存储过程,当某个规定的事件发生时,该存储过程自动执行。 2. 系统数据库和用户数据库 SQL Server的数据库有两类: 一类是系统数据库; 另一类是用户数据库。 (1) 系统数据库 SQL Server在安装时创建4个系统数据库: master、model、msdb和tempdb。系统数据库存储有关SQL Server的系统信息,当系统数据库受到破坏时,SQL Server将不能正常启动和工作。  master数据库: 它是系统最重要的数据库,记录了SQL Server的系统信息,例如登录账号、系统配置、数据库位置及数据库错误信息等,用于控制用户数据库和SQL Server的运行。  model数据库: 为创建数据库提供模板。  msdb数据库: 该数据库是代理服务数据库,为调度信息、作业记录等提供存储空间。  tempdb数据库: 它是一个临时数据库,为临时表和临时存储过程提供存储空间。 第 3 章 创建数据库和创建表 SQL Server数据库技术与应用(SQL Server 2019版) (2) 用户数据库 用户数据库是由用户创建的数据库,本书所创建的数据库都是用户数据库,用户数据库和系统数据库在结构上是相同的。 3. 完全限定名和部分限定名 在TSQL中引用SQL Server对象对其进行查询、插入、修改、删除等操作,所使用的TSQL语句需要给出对象的名称,用户可以使用完全限定名和部分限定名。 (1) 完全限定名 完全限定名是对象的全名,SQL Server创建的每个对象都有唯一的完全限定名,它由4部分组成: 服务器名、数据库名、数据库架构名和对象名,其格式如下: server.database.scheme.object 例如,DELLPC.stsco.dbo.student即为一个完全限定名。 (2) 部分限定名 使用完全限定名往往很烦琐且没有必要,经常省略其中的某些部分。在对象全名的4部分中,前3部分均可被省略,当省略中间的部分时,圆点符“.”不可省略。这种只包含对象完全限定名中的一部分的对象名称为部分限定名。 在部分限定名中,未指出的部分使用以下默认值。 服务器: 默认为本地服务器。 数据库: 默认为当前数据库。 数据库架构名: 默认为dbo。 部分限定名格式如下: server.database...object/*省略架构名*/ server..scheme.object   /*省略数据库名*/ database.scheme.object   /*省略服务器名*/ server...object   /*省略架构名和数据库名*/ scheme.object   /*省略服务器名和数据库名*/ object   /*省略服务器名、数据库名和架构名*/ 例如,完全限定名DELLPC.stsco.dbo.student的部分限定名如下: DELLPC.stsco..student DELLPC..dbo.student stsco.dbo.student DELLPC..student dbo.student student 3.1.2物理数据库 从系统的观点看,数据库是存储逻辑数据库的各种对象的实体,它们存放在计算机的存储介质中,从这个角度我们称数据库为物理数据库。SQL Server的物理数据库架构包括页和区、数据库文件、数据库文件组等。 1. 页和区 页和区是SQL Server数据库的两个主要数据存储单位。  页: 每页的大小是8KB,1MB的数据文件可以容纳128页,页是SQL Server中用于数据存储的最基本单位。  区: 每连接的8页组成一个区,区的大小是64KB,1MB的数据库有16个区,区用于控制表和索引的存储。 2. 数据库文件 SQL Server采用操作系统文件来存放数据库,使用的文件有主数据文件、辅助数据文件、日志文件三类。 (1) 主数据文件 主数据文件(Primary)用于存储数据,每个数据库必须有也只能有一个主文件,它的默认扩展名为.mdf。 (2) 辅助数据文件 辅助数据文件(Secondary)也用于存储数据,一个数据库中辅助数据文件可以创建多个,也可以没有,辅助数据文件的默认扩展名为.ndf。 (3) 日志文件 日志文件(Transaction Log)用于保存恢复数据库所需的事务日志信息。每个数据库至少有一个日志文件,也可以有多个,日志文件的扩展名为.ldf。 3. 数据库文件组 为了管理和分配数据将多个文件组织在一起,组成文件组,对它们进行整体管理,以提高表中数据的查询效率,SQL Server提供了两类文件组: 主文件组和用户定义文件组。 (1) 主文件组 主文件组包含主要数据文件和任何没有指派给其他文件组的文件,数据库的系统表均分配在主文件组中。 (2) 用户定义文件组 用户定义文件组包含所有使用CREATE DATABASE或ALTER DATABASE语句并用FILEGROUP关键字指定的文件组。 3.2以图形界面方式创建SQL Server数据库 SQL Server提供两种方式创建SQL Server数据库,一种方式是使用SQL Server Management Studio的图形用户界面创建SQL Server数据库; 另一种方式是使用TSQL语句创建SQL Server数据库。本节介绍以图形界面方式创建SQL Server数据库。 以图形界面方式创建SQL Server数据库包括创建数据库、修改数据库、删除数据库等内容,下面分别介绍。 1. 创建数据库 在使用数据库之前,首先需要创建数据库。在学生成绩管理系统中,我们以创建名称为stsco的学生成绩数据库为例,说明创建数据库的步骤。 【例3.1】使用SQL Server Management Studio创建stsco数据库。 创建stsco数据库的操作步骤如下。 (1) 单击“开始”按钮,选择Microsoft SQL Server Tools 18→SQL Server Management Studio 18命令,出现“连接到服务器”对话框,在“服务器名称”框中选择DESKTOP7O2OTMS,在“身份验证”框中选择“SQL Server身份验证”,在“登录名”框中选择sa,在“密码”框中输入123456,单击“连接”按钮,即可启动SQL Server Management Studio,并连接到SQL Server服务器。 (2) 屏幕出现SQL Server Management Studio窗口,在左边“对象资源管理器”窗口中选中“数据库”节点,右击,在弹出的快捷菜单中选择“新建数据库”命令,如图3.1所示。 图3.1选择“新建数据库”命令 (3) 进入“新建数据库”窗口,在窗口的左上方有3个选项: “常规”选项、“选项”选项和“文件组”选项,其中“常规”选项首先出现。 在“数据库名称”文本框中输入创建的数据库名称stsco,在“所有者”文本框使用系统默认值,系统自动在“数据库文件”列表中生成一个主数据文件stsco.mdf和一个日志文件stsco_log.ldf,主数据文件stsco.mdf初始大小为8MB,增量为64MB,存放的路径为C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA\,日志文件stsco_log.ldf初始大小为8MB,增量为64MB,存放的路径与主数据文件的路径相同,如图3.2所示。 图3.2“新建数据库”窗口 这里只配置“常规”选项,其他选项采用系统默认设置。 (4) 单击“确定”按钮,stsco数据库创建完成,在C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA\文件夹中增加了两个数据文件stsco.mdf和stsco_log.ldf。 2. 修改数据库 在创建数据库后,用户可以根据需要对数据库进行以下修改。  增加或删除数据文件,改变数据文件的大小和增长方式。  增加或删除日志文件,改变日志文件的大小和增长方式。  增加或删除文件组。 【例3.2】在abc数据库(已创建)中增加数据文件abcbk.ndf和日志文件abcbk_log.ldf。 操作步骤如下。 (1) 启动SQL Server Management Studio,在左边“对象资源管理器”窗口中展开“数据库”节点,选中数据库abc,右击,在弹出的快捷菜单中选择“属性”命令。 (2) 在弹出的“数据库属性abc”窗口中,单击“选择页”中的“文件”选项,进入文件设置页面,如图3.3所示。通过本窗口可增加数据文件和日志文件。 图3.3“文件”选项 (3) 增加数据文件。单击“添加”按钮,在“数据库文件”列表中出现一个新的文件位置,单击“逻辑名称”文本框并输入名称abcbk,单击“大小”文本框,通过该框后的微调按钮将大小设置为10MB,单击“自动增长”文本框中的“...”按钮,出现“更改abcbk的自动增长设置”对话框,将文件增长设置为15MB,最大文件大小限制为100MB,“文件类型”文本框、“文件组”文本框和“路径”文本框都选择默认值。 (4) 增加日志文件。单击“添加”按钮,在“数据库文件”列表中出现一个新的文件位置,单击“逻辑名称”文本框并输入名称abcbk_log,单击“文件类型”文本框,在该框的下拉列表中选择“日志”,单击“大小”文本框,通过该框后的微调按钮将大小设置为5MB,单击“自动增长”文本框中的“...”按钮,出现“更改abcbk_log的自动增长设置”对话框,将文件增长设置为10%,最大文件大小无限制,“文件组”文本框和“路径”文本框都选择默认值,如图3.4所示,单击“确定”按钮。 图3.4增加数据文件和日志文件 操作完成后,在C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA文件夹中增加了辅助数据文件abcbk.ndf和日志文件abcbk_log.ldf。 【例3.3】在abc数据库中删除数据文件和日志文件。 操作步骤如下。 (1) 启动SQL Server Management Studio,在左边“对象资源管理器”窗口中展开“数据库”节点,选中数据库abc,右击,在弹出的快捷菜单中选择“属性”命令。 (2) 出现“数据库属性abc”窗口,单击“选择页”中的“文件”选项,进入文件设置页面,通过本窗口可删除数据文件和日志文件。 (3) 选择abcbk数据文件,单击“删除”按钮,该数据文件被删除。 (4) 选择abcbk_log日志文件,单击“删除”按钮,该日志文件被删除。 (5) 单击“确定”按钮,返回SQL Server Management Studio窗口。 3. 删除数据库 数据库运行后,需要消耗资源,往往会降低系统运行效率,通常可将不再需要的数据库进行删除,释放资源。删除数据库后,其文件及数据都会从服务器上的磁盘中删除,并永久删除,除非使用以前的备份,所以删除数据库应谨慎。 【例3.4】删除abc数据库。 操作步骤如下。 (1) 启动SQL Server Management Studio,在左边“对象资源管理器”窗口中展开“数据库”节点,选中数据库abc,右击,在弹出的快捷菜单中选择“删除”命令。 (2) 出现“删除对象”对话框,单击“确定”按钮,abc数据库被删除。 3.3以命令方式创建SQL Server数据库 3.2节介绍了使用SQL Server Management Studio的图形用户界面创建SQL Server数据库,本节介绍使用TSQL语句创建SQL Server数据库,与图形用户界面相比,使用TSQL语句创建SQL Server数据库更为灵活、方便。 3.3.1创建数据库 创建数据库使用CREATE DATABASE语句。 语法格式: CREATE DATABASE database_name [[ON [filespec] ] [LOG ON [filespec] ] ] ::= {( NAME = logical_file_name , FILENAME = ' os_file_name ' [, SIZE = size] [, MAXSIZE = {max_size | UNLIMITED }] [, FILEGROWTH = growth_increament [ KB | MB | GB | TB | % ]] ) } 说明:  database_name: 创建的数据库名称,命名须唯一且符合SQL Server的命名规则,最多为128个字符。  ON子句: 指定数据库文件和文件组属性。  LOG ON子句: 指定日志文件属性。  filespec: 指定数据文件的属性,给出文件的逻辑名、存储路径、大小及增长特性。  NAME: 为filespec定义的文件指定逻辑文件名。  FILENAME: 为filespec定义的文件指定操作系统文件名,指出定义物理文件时使用的路径和文件名。  SIZE子句: 指定filespec定义的文件的初始大小。  MAXSIZE子句: 指定filespec定义的文件的最大大小。  FILEGROWTH子句: 指定filespec定义的文件的增长增量。 当仅使用CREATE DATABASE database_name语句而不带参数时,创建的数据库大小将与model数据库的大小相等。 【例3.5】使用TSQL语句,创建test数据库。 在SQL Server查询编辑器中输入以下语句。 CREATE DATABASE test ON ( NAME='test', FILENAME='C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA\test.mdf', SIZE=12MB, MAXSIZE=30MB, FILEGROWTH=1MB ) LOG ON ( NAME='test_log', FILENAME='C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA\test_log.ldf', SIZE=1MB, MAXSIZE=10MB, FILEGROWTH=10% ) 在查询编辑器窗口中单击“执行”按钮或按F5键,系统提示“命令已成功完成”。 【例3.6】创建test2数据库,其中主数据文件为20MB,最大大小不限,按1MB增长; 1个日志文件,大小为1MB,最大为20MB,按10%增长。 在SQL Server查询编辑器中输入以下语句。 CREATE DATABASE test2 ON ( NAME='test2', FILENAME='C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA\test2.mdf', SIZE=20MB, MAXSIZE=UNLIMITED, FILEGROWTH=1MB ) LOG ON ( NAME='test2_log', FILENAME='C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA\test2_log.ldf', SIZE=1MB, MAXSIZE=20MB, FILEGROWTH=10% ) 在查询编辑器窗口中单击“执行”按钮或按F5键,系统提示“命令已成功完成”。 【例3.7】创建一个具有两个文件组的数据库test3。要求: 主文件组包括文件test3_dat1,文件初始大小为15MB,最大为45MB,按4MB增长; 另一个文件组名为test3gp,包括文件test3_dat2,文件初始大小为5MB,最大为20MB,按10%增长。 在SQL Server查询编辑器中输入以下语句。 CREATE DATABASE test3 ON PRIMARY ( NAME = ' test3_dat1', FILENAME = 'D:\data\ test3_dat1.mdf', SIZE =15MB, MAXSIZE = 45MB, FILEGROWTH = 4MB ), FILEGROUP test3gp ( NAME = ' test3_dat2', FILENAME = 'D:\data\ test3_dat2.ndf', SIZE = 5MB, MAXSIZE = 20MB, FILEGROWTH = 10% ) 在查询编辑器窗口中单击“执行”按钮或按F5键,系统提示“命令已成功完成”。 创建数据库后使用数据库时,可使用USE语句。 语法格式: USE database_name 其中,database_name是使用的数据库名称。 说明: USE语句只在第一次打开数据库时使用,后续都作用在该数据库中。如果要使用另一数据库,需要重新使用USE语句。 3.3.2修改数据库 修改数据库使用ALTER DATABASE语句。 语法格式: ALTER DATABASE database { ADD FILE filespec | ADD LOG FILE filespec | REMOVE FILE logical_file_name | MODIFY FILE filespec | MODIFY NAME = new_dbname } 说明:  database: 需要更改的数据库名称。  ADD FILE子句: 指定要增加的数据文件。  ADD LOG FILE子句: 指定要增加的日志文件。  REMOVE FILE子句: 指定要删除的数据文件。  MODIFY FILE子句: 指定要更改的文件属性。  MODIFY NAME子句: 重命名数据库。 【例3.8】在test2数据库中,增加一个数据文件test2add,大小为10MB,最大为50MB,按5MB增长。 ALTER DATABASE test2 ADD FILE ( NAME = 'test2add', FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA\test2add.ndf', SIZE = 10MB, MAXSIZE = 50MB, FILEGROWTH = 5MB ) 3.3.3删除数据库 删除数据库使用DROP DATABASE语句。 语法格式: DROP DATABASE database_name 其中,database_name是要删除的数据库名称。 【例3.9】使用TSQL语句删除test3数据库。 DROP DATABASE test3 3.4表的基本概念 在SQL Server中,每个数据库包括若干表,表用于存储数据。在建立数据库的过程中,最重要的一步就是创建表。下面介绍创建表要用到的两个基本概念: 表和数据类型。 3.4.1表和表结构 表是SQL Server中最基本的数据库对象,用于存储数据的一种逻辑结构,由行和列组成,又称为二维表。例如,在学生成绩管理系统中的学生表(student),如表3.1所示。 表3.1学生表(student) 学号姓名性别出生日期专业总学分 201001罗俊杰男20000615通信52 201002韩红丽女19990923通信49 201004冯露女19990807通信50 202001徐桥男20000225计算机52 202002袁志敏男19991204计算机48 202005董莎女20000419计算机50 (1) 表 表是数据库中存储数据的数据库对象,每个数据库包含了若干表,表由行和列组成。例如,表3.1的学生表由6行6列组成。 (2) 表结构 每个表具有一定的结构,表结构包含一组固定的列,列由数据类型、长度、允许NULL值等组成。 (3) 记录 每个表包含若干行数据,表中一行称为一个记录(Record)。表3.1的学生表有6个记录。 (4) 字段 表中每列称为字段(Field),每个记录由若干数据项(列)构成,构成记录的每个数据项就称为字段。表3.1的学生表有6个字段。 (5) 空值 空值(NULL)通常表示未知、不可用或将在以后添加的数据。 (6) 关键字 关键字用于唯一标识记录,如果表中记录的某一字段或字段组合能唯一标识记录,则该字段或字段组合称为候选关键字(Candidate Key)。如果一个表有多个候选关键字,则选定其中的一个为主关键字(Primary Key),又称为主键。表3.1的学生表的主键为“学号”。 3.4.2数据类型 SQL Server支持两类数据类型: 系统数据类型和用户自定义数据类型。 1. 系统数据类型 创建数据库最重要的一步为创建其中的数据表,创建数据表必须定义表结构和设置列的数据类型、长度等。下面介绍SQL Server系统数据类型,包括整数型、精确数值型、浮点型、货币型、位型、字符型、Unicode字符型、文本型、二进制型、日期时间类型、时间戳型、图像型、其他等,如表3.2所示。 表3.2SQL Server系统数据类型 数 据 类 型符 号 标 识 整数型bigint,int,smallint,tinyint 精确数值型decimal,numeric 浮点型float,real 货币型money,smallmoney 位型bit 字符型char,varchar,varchar(MAX) Unicode字符型nchar,nvarchar,nvarchar(MAX) 文本型text,ntext 二进制型binary,varbinary,varbinary(MAX) 日期时间类型datetime,smalldatetime,date,time,datetime2,datetimeoffset 时间戳型timestamp 图像型image 其他cursor,sql_variant,table,uniqueidentifier,xml,hierarchyid (1) 整数型 整数型包括bigint、int、smallint和tinyint 4类。  bigint(大整数) 精度为19位,长度为8字节,数值范围为-263~263-1。  int(整数) 精度为10位,长度为4字节,数值范围为-231~231-1。  smallint(短整数) 精度为10位,长度为2字节,数值范围为-215~215-1。  tinyint(微短整数) 精度为3位,长度为1字节,数值范围为0~255。 (2) 精确数值型 精确数值型包括decimal和numeric两类,这两种数据类型在SQL Server中的功能是完全等价的。 精确数值型数据由整数部分和小数部分构成,可存储从-1038+1到1038-1的固定精度和小数位的数字数据,它的存储长度最少为5字节,最多为17字节。 精确数值型数据的格式是: numeric | decimal(p[,s]) 其中,p为精度,s为小数位数,s的默认值为0。 例如,指定某列为精确数值型,精度为7,小数位数为2,则为 decimal(7,2)。 (3) 浮点型 浮点型又称近似数值型,近似数值数据类型包括float[(n)]和real两类,这两类通常都使用科学记数法表示数据。科学记数法的格式为: 尾数E阶数 其中,阶数必须为整数。 例如,4.804 E9、3.682E6、7 8594E8等都是浮点型数据。  real 精度为7位,长度为4字节,数值范围为-3.40E+38~3.40E+38。  float[(n)] 当n为1~24时,精度为7位,长度为4字节,数值范围为-3.40E+38~3.40E+38。 当n为25~53时,精度为15位,长度为8字节,数值范围为-1.79E+308~1.79E+308。 (4) 货币型 处理货币的数据类型有money和smallmoney,它们用十进制数表示货币值。  money 精度为19,小数位数为4,长度为8字节,数值范围为-263~263-1。  smallmoney 精度为10,小数位数为4,长度为4字节,数值范围为-231~231-1。 (5) 位型 SQL Server中的位(bit)型数据只存储0和1,长度为1字节,相当于其他语言中的逻辑型数据。当一个表中有小于8位的bit列,将作为一字节存储,如果表中有9~16位bit列,将作为两字节存储,依此类推。 当为bit类型数据赋0时,其值为0; 而赋非0时,其值为1。 字符串值TRUE和FALSE可以转换的bit 值: TRUE转换为1,FALSE转换为0。 (6) 字符型 字符型数据用于存储字符串,字符串中可包括字母、数字和其他特殊符号。在输入字符串时,需将字符串中的符号用单引号或双引号括起来,如'def'、"Def | column_name AS computed_column_expression [PERSISTED [NOT NULL]] } [ ] [ ,...n ] ) [ ON { partition_scheme_name ( partition_column_name ) | filegroup | "default" } ] [ { TEXTIMAGE_ON { filegroup | "default" } ] [ FILESTREAM_ON { partition_scheme_name | filegroup | "default" } ] [ WITH ( [ ,...n ] ) ] [ ; ] ::= column_name data_type [ FILESTREAM ] [ COLLATE collation_name ] [ NULL | NOT NULL ] [ [ CONSTRAINT constraint_name ] DEFAULT constant_expression ] | [ IDENTITY [ ( seed ,increment ) ] [ NOT FOR REPLICATION ] ] [ ROWGUIDCOL ] [ [ ...n ] ] [ SPARSE ] 说明: (1) database_name是数据库名,schema_name是表所属架构名,table_name是表名。如果省略数据库名,则默认在当前数据库中创建表,如果省略架构名,则默认是dbo。 (2) 列定义:  column_name 为列名,data_type为列的数据类型。  FILESTREAM是SQL Server引进的一项新特性,允许以独立文件的形式存放大对象数据。  NULL | NOT NULL: 确定列是否可取空值。  DEFAULT constant_expression: 为所在列指定默认值。  IDENTITY: 表示该列是标识符列。  ROWGUIDCOL: 表示新列是行的全局唯一标识符列。  : 列的完整性约束,指定主键、外键等。  SPARSE: 指定列为稀疏列。 (3) column_name AS computed_column_expression[PERSISTED[NOT NULL]]: 用于定义计算字段。 (4) : 表的完整性约束。 (5) ON 子句: filegroup|"default"指定存储表的文件组。 (6) TEXTIMAGE_ON{filegroup|"default"}: TEXTIMAGE_ON指定存储text、ntext、image、xml、varchar(MAX)、nvarchar(MAX)、varbinary(MAX)和CLR用户自定义类型数据的文件组。 (7) FILESTREAM_ON子句: filegroup|"default"指定存储FILESTREAM数据的文件组。 【例3.11】使用TSQL语句,在stsco数据库中创建student表、score表。 在stsco数据库中创建student表的语句如下。 USE stsco CREATE TABLE student ( stid char(6) NOT NULL PRIMARY KEY, stname char(8) NOT NULL, stsex char(2) NOT NULL, stbirthday date NOT NULL, speciality char(12) NULL, tc int NULL ) GO 上面的TSQL语句,首先指定stsco数据库为当前数据库,然后使用CREATE TABLE语句在stsco数据库中创建student表,student表的表结构如图3.5所示。 上述语句中的GO命令不是TransactSQL语句,它是由SQL Server Management Studio代码编辑器识别的命令。SQL Server实用工具将GO解释为应该向SQL Server实例发送当前批TransactSQL语句的信号。当前批语句由上一条GO命令后输入的所有语句组成,如果是第一条GO命令,则由会话或脚本开始后输入的所有语句组成。GO命令和TransactSQL语句不能在同一行中,但在GO命令行中可包含注释。 注意: SQL Server应用程序可以将多个TransactSQL语句作为一个批发送到SQL Server的实例来执行。然后,该批中的语句被编译成一个执行计划。程序员在SQL Server实用工具中执行特殊语句,或生成TransactSQL语句的脚本在SQL Server实用工具中运行时,使用GO作为批结束的信号。 提示: 由一条或多条TSQL语句组成一个程序,通常以.sql为扩展名存储,称为sql脚本。双击sql脚本文件,其TSQL语句即出现在查询编辑器窗口内。查询编辑器窗口内的TSQL语句,可用“文件”→“另存为”命令命名并存入指定目录。 在stsco数据库中创建score表的语句如下。 USE stsco USE stsco CREATE TABLE score ( stid char (6) NOT NULL, cid char(3) NOT NULL, grade int NULL, PRIMARY KEY(stid,cid) ) GO 注意: 如果主键由多个列组成,可采用PRIMARY KEY(列1,列2,…)语句,其中一个列将允许重复值,但是主键中所有列的值的各种组合必须是唯一的。 score表的表结构如图3.6所示。 图3.5student表的表结构 图3.6score表的表结构 【例3.12】在test数据库中创建clients表。 USE test CREATE TABLE clients ( cno int, cname char(8), csex char(2), address char(40) ) 2. 由其他表创建新表 使用SELECT INTO 语句创建一个新表,并用SELECT的结果集填充该表。 语法格式: SELECT 列名表 INTO 表1 FROM 表2 该语句的功能是由“表2”的“列名表”来创建新表“表1”。 【例3.13】在stsco数据库中,由student表创建student1表。 USE stsco SELECT stid,stname,stbirthday INTO student1 FROM student 3.5.2修改表 使用ALTER TABLE语句修改表的结构。 语法格式: ALTER TABLE table_name { ALTER COLUMN column_name { new_data_type [ (precision,[,scale])] [NULL | NOT NULL] | {ADD | DROP } { ROWGUIDCOL | PERSISTED | NOT FOR REPLICATION | SPARSE } }/ | ADD {[]}[,…n] | DROP {[CONSTRAINT] constraint_name | COLUMN column}[,…n] } 说明: (1) table_name为表名。 (2) ALTER COLUMN子句: 修改表中指定列的属性。 (3) ADD子句: 增加表中的列。 (4) DROP子句: 删除表中的列或约束。 【例3.14】在student1表中新增加一列remarks。 USE stsco ALTER TABLE student1 ADD remarks char(10) 3.5.3删除表 使用DROP TABLE语句删除表。 语法格式: DROP TABLE table_name 其中,table_name是要删除的表的名称。 【例3.15】删除stsco数据库中的student1表。 USE stsco DROP TABLE student1 3.6使用图形用户界面创建SQL Server表 使用图形用户界面创建SQL Server表包括创建表、修改表、删除表等内容。 1. 创建表 【例3.16】在stsco数据库中创建student表(学生表)。 操作步骤如下。 (1) 启动SQL Server Management Studio,在“对象资源管理器”中展开“数据库”节点,选中stsco数据库,展开该数据库,选中“表”,右击,在弹出的快捷菜单中选择“新建”→“表”命令,如图3.7所示。 图3.7选择“新建”→“表”命令 (2) 屏幕出现表设计器窗口,根据已经设计好的student的表结构分别输入或选择各列的数据类型、长度、允许Null值,根据需要,可以在每列的“列属性”表格填入相应内容,输入完成后的结果如图3.8所示。 (3) 在stid行上右击,在弹出的快捷菜单中选择“设置主键”命令,如图3.9所示,此时,stid左边会出现一个钥匙图标。 图3.8输入或选择各列的数据类型、长度、允许Null值 图3.9选择“设置主键”命令 注意: 如果主键由两个或两个以上的列组成,需要按住Ctrl键选择多个列,再在右键快捷菜单中选择“设置主键”命令。 (4) 单击工具栏中的“保存”按钮,出现“选择名称”对话框,输入表名称student,如图3.10所示,单击“确定”按钮即可创建student表,如图3.11所示。 图3.10设置表的名称 图3.11创建student表 2. 修改表 在SQL Server中,当用户使用SQL Server Management Studio修改表的结构(如增加列、删除列、修改已有列的属性等)时,必须要删除原表,再创建新表才能完成表的更改。如果强行更改,会弹出不允许保存更改对话框。 为了在进行表的修改时不出现此对话框,需要进行如下操作。 在SQL Server Management Studio面板中选择“工具”→“选项”命令,在出现的“选项”窗口中展开“设计器”,选择“表设计器和数据库设计器”选项,取消勾选窗口右面的“阻止保存要求重新创建表的更改”复选框,如图3.12所示,单击“确定”按钮,就可进行表的修改了。 图3.12解除阻止保存的选项 【例3.17】在student表中增加一列stclass(班级),在tc列之前,然后删除该列。 (1) 启动SQL Server Management Studio,在“对象资源管理器”中展开“数据库”节点,选中stsco数据库,展开该数据库,选中表,将其展开,选中表dbo.student,右击,在弹出的快捷菜单中选择“设计”命令,打开“表设计器”窗口,为了在tc列之前加入新列,右击该列,在弹出的快捷菜单中选择“插入列”命令,如图3.13所示。 (2) 在“表设计器”窗口中的tc列前出现空白行,输入列名stclass,选择数据类型char(6),允许空,如图3.14所示,完成插入新列操作。 (3) 在“表设计器”窗口中选择需删除的stclass列,右击,在弹出的快捷菜单中选择“删除列”命令,该列即被删除,如图3.15所示。 【例3.18】将def表(已创建)表名修改为xyz表。 (1) 启动SQL Server Management Studio,在“对象资源管理器”中展开“数据库”节点,选中stsco数据库,展开该数据库,选中表,将其展开,选中表dbo.def,右击,在弹出的快捷菜单中选择“重命名”命令。 图3.13选择“插入列”命令 图3.14插入新列 图3.15选择“删除列”命令 (2) 此时,表dbo.def的名称已变为可编辑,将名称修改为dbo.xyz,完成表名修改。 3. 删除表 删除表时,表的结构定义、表中的所有数据以及表的索引、触发器、约束等都被删除,删除表操作时一定要谨慎小心。 【例3.19】删除xyz表(已创建)。 (1) 启动SQL Server Management Studio,在“对象资源管理器”中展开“数据库”节点,选中stsco数据库,展开该数据库,选中表,将其展开,选中表dbo.xyz,右击,在弹出的快捷菜单中选择“删除”命令。 (2) 系统弹出“删除对象”对话框,单击“确定”按钮,即可删除xyz表。 3.7小结 本章主要介绍了以下内容。 (1) 数据库是SQL Server存储和管理数据的基本对象。 从用户的观点看,组成数据库的逻辑成分称为数据库对象,SQL Server的数据库对象包括表(table)、视图(view)、索引(index)、存储过程(stored procedure)、触发器(trigger)等。SQL Server的数据库有两类: 一类是系统数据库,另一类是用户数据库。SQL Server在安装时创建4个系统数据库: master、model、msdb和tempdb。用户数据库是由用户创建的数据库。 从系统的观点看,数据库是存储逻辑数据库的各种对象的实体,它们存放在计算机的存储介质中,从这个角度我们称数据库为物理数据库。SQL Server 的物理数据库架构包括页和区、数据库文件、数据库文件组等。 (2) 使用图形用户界面创建SQL Server数据库: 包括创建数据库、修改数据库、删除数据库。 (3) 使用TSQL语句创建SQL Server数据库: 包括使用CREATE DATABASE语句创建数据库、使用ALTER DATABASE语句修改数据库、使用DROP DATABASE语句删除数据库。 (4) 表是SQL Server中最基本的数据库对象,它是用于存储数据的一种逻辑结构,由行和列组成。表结构包含一组固定的列,列由数据类型、长度、允许Null值等组成。创建表之前,首先要确定表名和表的属性,表所包含的列名、列的数据类型、长度、是否为空、是否主键等,然后进行表结构设计。 (5) SQL Server支持两类数据类型: 系统数据类型和用户自定义数据类型。系统数据类型包括整数型、精确数值型、浮点型、货币型、位型、字符型、Unicode字符型、文本型、二进制型、日期时间类型、时间戳型、图像型、其他数据类型等。用户自定义数据类型的创建和删除。 (6) 以命令方式创建SQL Server表的语句有: 创建表用CREATE TABLE语句、修改表用ALTER TABLE语句、删除表用DROP TABLE语句。 (7) 以图形界面方式创建SQL Server表,包括创建表、修改表、删除表等内容。 习题3 一、 选择题 3.1在SQL Server中创建用户数据库,其主要数据文件的大小必须大于。 A. master数据库的大小B. model数据库的大小 C. msdb数据库的大小D. 3MB 3.2在SQL Server中,如果数据库tempdb的空间不足,可能会造成一些操作无法进行,此时需要扩大tempdb的空间。下列关于扩大tempdb空间的方法,错误的是。 A. 手工扩大tempdb中某数据文件的大小 B. 设置tempdb中的数据文件为自动增长方式,每当空间不够时让其自动增长 C. 手工为tempdb增加一个数据文件 D. 删除tempdb中的日志内容,以获得更多的数据空间 3.3在SQL Server中创建用户数据库,实际就是定义数据库所包含的文件以及文件的属性。下列不属于数据文件属性的是。 A. 初始大小B. 物理文件名 C. 文件结构D. 最大大小 3.4SQL Server数据库是由文件组成的。下列关于数据库所包含的文件的说法中,正确的是。 A. 一个数据库可包含多个主要数据文件和多个日志文件 B. 一个数据库只能包含一个主要数据文件和一个日志文件 C. 一个数据库可包含多个次要数据文件,但只能包含一个日志文件 D. 一个数据库可包含多个次要数据文件和多个日志文件 3.5在SQL Server系统数据库中,存放用户数据库公共信息的是。 A. masterB. model C. msdbD. tempdb 3.6出生日期字段不宜选择。 A. datetimeB. bit C. charD. date 3.7性别字段不宜选择。 A. charB. tinyint C. intD. float 3.8字段可以采用默认值。 A. 出生日期B. 姓名 C. 专业D. 学号 3.9设在SQL Server中,某关系表需要存储职工的工资信息,工资的范围为2000~6000,采用整型类型存储。下列数据类型中最合适的是。 A. intB. smallint C. tinyintD. bigint 二、 填空题 3.10从用户的观点看,组成数据库的称为数据库对象。 3.11SQL Server的数据库对象包括表、、索引、存储过程、触发器等。 3.12SQL Server 的物理数据库架构包括页和区、、数据库文件组等。 3.13SQL Server数据库的每个页的大小是8KB,每个区的大小是。 3.14SQL Server使用的数据库文件有主数据文件、辅助数据文件、三类。 3.15表结构包含一组固定的列,列由列名、、长度、允许Null值等组成。 3.16空值通常表示未知、或将在以后添加的数据。 3.17创建表之前,首先要确定表名和表的属性,表所包含的、列的数据类型、长度、是否为空、是否主键等,然后进行表结构设计。 3.18整数型包括bigint、int、smallint和四类。 3.19字符型包括固定长度字符数据类型和两类。 3.20Unicode字符型用于支持国际上的字符数据的存储和处理。 三、 问答题 3.21SQL Server有哪些数据库对象? 3.22SQL Server数据库中包含哪几种文件? 3.23简述使用图形用户界面创建SQL Server数据库的步骤。 3.24使用TSQL语句创建数据库包含哪些语句? 3.25什么是表?什么是表结构? 3.26简述SQL Server 常用数据类型。 3.27分别写出student、course、score的表结构。 3.28可以使用哪些方式创建数据表? 3.29简述以命令方式创建SQL Server表的语句。 四、 应用题 3.30使用图形用户界面创建mydb数据库,主数据文件为mydb.mdf,初始大小为15MB,增量为15%,最大文件150MB,日志文件为mydb_log.ldf,初始大小为1MB,增量8%,增长无限制。 3.31使用TSQL语句创建mydb1数据库,主数据文件的初始大小、增量、增长和日志文件初始大小、增量、增长与上题相同。 3.32在stsco数据库中,以命令方式分别创建student表、course表、score表、teacher表和lecture表,表结构参见附录B。 3.33在stsco数据库中,以图形界面方式分别创建student1表、course1表、score1表、teacher1表和lecture1表,表结构参见附录B。 实验3创建数据库和创建表 实验3.1创建数据库 1. 实验目的及要求 (1) 理解SQL Server数据库的基本概念。 (2) 掌握使用TSQL语句创建数据库、修改数据库、删除数据库的命令和方法,具备编写和调试创建数据库、修改数据库、删除数据库的代码的能力。 2. 验证性实验 使用TSQL语句创建商店实验数据库storepm,数据库storepm在实验中多次用到,其主数据文件为storepm.mdf,初始大小为15MB,增量为1MB,增长无限制,日志文件为storepm_log.ldf,初始大小为1MB,增量10%,增长无限制。 (1) 创建数据库storepm。 CREATE DATABASE storepm ON ( NAME='storepm', FILENAME='C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA\storepm.mdf', SIZE=15MB, MAXSIZE=UNLIMITED, FILEGROWTH=1MB ) LOG ON ( NAME='storepm_log', FILENAME='C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA\storepm_log.ldf', SIZE=1MB, MAXSIZE=UNLIMITED, FILEGROWTH=10% ) (2) 修改数据库storepm,首先增加数据文件storepmbk.ndf,再删除数据文件storepmbk.ndf。 ALTER DATABASE storepm ADD FILE ( NAME = 'storepmadd', FILENAME='C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA\storepmadd.ndf', SIZE=10MB, MAXSIZE=150MB, FILEGROWTH=2MB ) ALTER DATABASE storepm REMOVE FILE storepmadd (3) 删除数据库storepm。 DROP DATABASE storepm 3. 设计性实验 使用TSQL语句创建图书借阅实验数据库librarypm,主数据文件为librarypm.mdf,初始大小为10MB,增量为10%,最大文件200MB,日志文件为librarypm_log.ldf,初始大小为2MB,增量1MB,最大文件50MB。 (1) 创建数据库librarypm。 (2) 修改数据库librarypm,首先增加数据文件librarypmbk.ndf和日志文件librarypmbk_log.ldf,再删除数据文件librarypmbk.ndf和日志文件librarypmbk_log.ldf。 (3) 删除数据库librarypm。 4. 观察与思考 (1) 在数据库storepm已存在的情况下,使用CREATE DATABASE语句创建数据库storepm,查看错误信息。怎样避免数据库已存在又创建的错误? (2) 能够删除系统数据库吗? 实验3.2创建表 1. 实验目的及要求 (1) 理解数据定义语言的概念和CREATE TABLE语句、ALTER TABLE语句、DROP TABLE语句的语法格式。 (2) 理解表的基本概念。 (3) 掌握使用数据定义语言创建表的操作,具备编写和调试创建表、修改表、删除表的代码的能力。 2. 验证性实验 商店实验数据库storepm是实验中多次用到的数据库,包含部门表DeptInfo、员工表EmplInfo、订单表OrderInfo、订单明细表DetailInfo和商品表GoodsInfo,它们的表结构分别如表3.4~表3.8所示。 表3.4DeptInfo表的表结构 列名数 据 类 型允许NULL值是否主键说明 DeptNo varchar(4)主键部门号 DeptNamevarchar(20)部门名称 表3.5EmplInfo表的表结构 列名数 据 类 型允许NULL值是否主键说明 EmplNo varchar(4)主键员工号 EmplNamevarchar(8)姓名 Sexvarchar(2)性别 Birthdaydate出生日期 Nativevarchar(20)√籍贯 Wagesdecimal(8,2)工资 DeptNovarchar(4)√部门号 表3.6OrderInfo表的表结构 列名数 据 类 型允许NULL值是否主键说明 OrderNovarchar(6)主键订单号 EmplNo varchar(4)√员工号 CurstomerNo varchar(4)√客户号 SaleDatedate销售日期 Costdecimal(10,2)总金额 表3.7DetailInfo表的表结构 列名数 据 类 型允许NULL值是否主键说明 OrderNovarchar(6)主键订单号 GoodsNovarchar(4)主键商品号 SaleUnitPricedecimal(8,2)销售单价 Quantityint销售数量 Totaldecimal(10,2)总价 Discountfloat折扣率 DiscountTotaldecimal(10,2)折扣总价 表3.8GoodsInfo表的表结构 列名数 据 类 型允许NULL值是否主键说明 GoodsNovarchar(4)主键商品号 GoodsNamevarchar(30)商品名称 ClassificationNamevarchar(30)商品类型 UnitPricedecimal(8,2)√单价 StockQuantityint库存量 在数据库storepm中,验证和调试创建表、修改表、删除表的代码。 (1) 创建EmplInfo表。 CREATE TABLE EmplInfo ( EmplNo varchar(4) NOT NULL PRIMARY KEY, EmplName varchar(8) NOT NULL, Sex varchar(2) NOT NULL, Birthday date NOT NULL, Native varchar(20) NULL, Wages decimal(8,2) NOT NULL, DeptNO varchar(4) NULL ) (2) 由EmplInfo表创建EmplInfo1表。 SELECT EmplNO,EmplName,Sex,Birthday,Native,Wages,DeptNO INTO EmplInfo1 FROM EmplInfo (3) 在EmplInfo表中增加一列Eno,不为空。 ALTER TABLE EmplInfo ADD Eno varchar(4) NOT NULL (4) 将EmplInfo1表的列Sex的数据类型改为char,可空。 ALTER TABLE EmplInfo1 ALTER COLUMN Sex char(2) NULL (5) 在EmplInfo表中删除列Eno。 ALTER TABLE EmplInfo DROP COLUMN Eno (6) 删除EmplInfo1表。 DROP TABLE EmplInfo1 3. 设计性试验 在数据库storepm中,设计、编写和调试创建表、修改表、删除表的代码。 (1) 创建GoodsInfo表。 (2) 由GoodsInfo表创建GoodsInfo1表。 (3) 在GoodsInfo表中增加一列Gno,不为空。 (4) 将GoodsInfo1表的列UnitPrice的数据类型改为money。 (5) 在GoodsInfo表中删除列Gno。 (6) 删除GoodsInfo1表。 4. 观察与思考 (1) 在创建表的语句中,NOT NULL的作用是什么? (2) 一个表可以设置几个主键? (3) 主键列能否修改为NULL?