第3章关系数据库语言SQL
和Transact?SQL3.1SQL概述〖*4/5〗3.1.1SQL标准SQL是Structured Query Language的缩写,即结构化查询语言。作为关系数据库的标准语言,SQL最初是基于IBM的System R研制的,1986年被美国国家标准化组织(ANSI)批准为关系数据库的标准语言;1987年,国际标准化组织(ISO)把ANSI SQL作为国际标准,这个标准在1992年进行了修订(SQL?92),1999年再次修订(SQL?99),2003年、2008年和2011年分别更新了国际标准。作为一种访问关系型数据库的标准语言,SQL问世以来得到了最为广泛的应用,有名的商用数据库管理系统产品(如Oracle、IBM DB2、Sybase、INGRES、MS SQL Server)都支持它,当前十分流行的开源数据库产品(如Postgre SQL、MySQL等)也支持它。
一般情况下,提起SQL标准,涉及的内容主要是SQL?92里最基本或者最核心的一部分。SQL?92本身是分级的,包括入门级、过渡级、中间级和接近级。不过,SQL标准包含的内容实在太多,而且有很多特性对新的SQL产品也越来越不重要。从SQL?99之后,标准中符合程度的定义就不再分级,而是改成了核心兼容性和特性兼容性。
各种不同的数据库管理系统产品对SQL的支持往往与标准存在细微的不同,这是因为,有的产品的开发先于标准的公布,另外,各产品开发商为了达到特殊的性能或新的特性,需要对标准进行扩展。
3.1.2SQL的特点
SQL集数据查询(Data Query)、数据操纵(Data Manipulation)、数据定义(Data Definition)和数据控制(Data Control)功能于一体,是一个通用的、功能极强的关系数据库语言,充分体现了关系数据语言的特点和优点。
1. 综合统一
SQL集数据定义语言(DDL)、数据操纵语言(DML)、数据控制语言(DCL)的功能于一体,语言风格统一,可以独立完成数据库生命周期中的全部活动,包括定义数据库、定义关系模式、录入数据以及数据库的查询、更新、维护、数据库重构、数据库安全性、完整性控制等一系列操作要求,这就为数据库应用系统开发提供了良好的环境,在数据库系统建成投入运行后,还可根据用户需要随时、逐步地修改模式,并不影响数据库系统的运行,从而使系统具有良好的可扩充性。
2. 高度非过程化
非关系数据模型的数据操纵语言是面向过程的语言,用其完成数据操作请求,必须指定存取路径,对用户极其不便。采用SQL进行数据操作,用户只须提出“做什么”,而不必指明“怎么做”,因此用户无须了解存取路径,存取路径的选择以及SQL语句的操作过程均由数据库管理系统自动完成。这不但大大减轻了用户负担,也有利于提高数据独立性。
3. 面向集合的操作方式 SQL采用集合操作方式,不仅查询结果是元组的集合,数据查询、插入、删除、更新操作的对象也是元组的集合。
而非关系数据模型采用的是面向记录的操作方式,任何一个操作其对象都只能是一条记录。例如,查询所有平均成绩在80分以上的学生姓名,用户必须说明完成该请求的具体处理过程,即如何用循环结构按照某条路径一条一条地把满足条件的学生记录读取出来。
4. 以同一种语法结构提供两种使用方式
SQL有两种使用方式,既是自含式语言,又是嵌入式语言。作为自含式语言,它能够独立地用于联机交互使用方式,用户可以在数据库管理系统的环境中,从终端键盘上直接输入SQL命令语句对数据库进行操作;作为嵌入式语言,SQL语句能够嵌入到高级语言(例如C、C++、PB、Java、PHP、Python等)编写的程序中,供程序员在应用程序中访问数据库时使用;且在两种不同的使用方式下,SQL的语法结构基本上是一致的。这种以统一的语法结构提供两种不同使用方式的机制,为用户提供了极大的灵活性与方便性。
5. 语言简洁,易学易用
SQL功能极其强大,但是十分简洁,易学易用,完成数据管理的核心功能只用了10个命令动词,如表3?1所示,并且SQL的语法类似于英语自然语言,学习和使用均十分简单。表3?1SQL的命令动词SQL功能命 令 动 词数据定义CREATE、DROP、ALTER数据查询SELECT数据操纵INSERT、UPDATE、DELETE数据控制GRANT、REVOKE、DENY3.1.3Transact?SQL
SQL作为关系数据库的标准语言,被关系数据库管理系统产品广泛采用,如Oracle、MS SQL Server、IBM DB2、Informix、MySQL、Sybase 等数据库系统。各种数据库管理系统产品在支持标准SQL的同时,往往又增加一些自己的特定功能,形成各具特色的SQL版本。Transact?SQL(T?SQL)就是Microsoft公司在其数据库管理系统产品MS SQL Server中对ANSI标准SQL的一个实现。
Transact?SQL是结构化查询语言SQL的增强版本,与ANSI SQL标准兼容,而且在标准SQL的基础上还进行了许多扩展,更加方便用户使用。Transact?SQL已经成为SQL Server数据库管理系统的核心。
3.1.4SQL规范
为了使读者能够方便地阅读本书中关于SQL的内容,首先简要说明本书中SQL语句的书写格式,在介绍SQL语句的基本语法结构时,语句成分的基本书写格式如表3?2所示。表3?2SQL语句格式说明语句成分表 达 格 式说明SQL关键字大写字母如 SELECT、INSERT用户必须提供的参数用“< >”括起来, “<”和“>”不是语句成分SQL语句中用户必须提供的信息,如<表名>、<列名>多选一选项用“|”分隔,“|” 不是语句成分如ASC|DESC可选项用“[]”括起来,“[”和“]”不是语句成分如[TOP 2]重复项[, ...,n],重复多次,用“,”分隔重复项[...n],重复多次,用“ ”空格分隔注释用“??”引导或放在“/?”与“?/”之间注意: 在本书的例题中,为输入方便,SQL语句一般都用大写字母书写,但实际应用中,SQL并不区分大小写,用大写或小写输入都可以。
在数据库管理系统中和在编程语言中输入SQL语句时,多个语句成分之间用一个或多个空格分隔,语句中并列元素之间用逗号分隔,字符串用单引号括起来,切记一定要用英文标点符号!
3.2实例数据库〖*4/5〗3.2.1供应管理数据库本章在介绍SQL的各项功能时,大部分举例都采用一个实例数据库――供应管理数据库SPJ,该数据库是记录一些供应商供应图3?1供应管理数据库E?R图多个工程项目各种零部件数据的,实际应用中,每个供应商可以给多个工程项目供应多种零部件,每个工程项目可以使用多个供应商供应的多种零部件,每种零部件可以由多个供应商供应,被多个工程项目使用,因此供应商、工程项目、零部件三者之间是多对多的联系。供应管理数据库的概念结构E?R图如图3?1所示(实体的属性在图中省略)。
SPJ数据库包括S,P,J,SPJ 四个关系模式。
(1) 供应商表S(SNO,SNAME,STAT,CITY)。
供应商表S 的属性有供应商代码(SNO)、供应商名(SNAME)、供应商资质状态(STAT)、供应商所在城市(CIIY)属性,供应商代码(SNO)是主码。
(2) 零部件表P(PNO,PNAME,COLOR,WT)。
零件表P的属性有零件代码(PNO)、零件名(PNAME)、颜色(COLOR)、重量(WT)属性,零件代码(PNO)是主码。
(3) 工程项目表J(JNO,JNAME,CITY)。
工程项目表J的属性有工程项目代码(JNO)、工程项目名(JNAME)、工程项目所在城市(CITY)属性,工程项目代码(JNO)是主码。
(4) 供应情况表SPJ(SNO,PNO,JNO,QTY)。
供应情况表SPJ有供应商代码(SNO)、零件代码(PNO)、工程项目代码(JNO)、供应量(QTY)属性,QTY表示某供应商供应某种零件给某工程项目的数量,供应商代码(SNO)、零件代码(PNO)、工程项目代码(JNO)三者的组合是主码,供应商代码(SNO)、零件代码(PNO)、工程项目代码(JNO)三者均是外码,分别参照供应商、零部件、工程项目三个表的主码。
3.2.2供应管理数据库实例数据
为方便举例,本书为SPJ数据库中的基本表设计了一些实例数据,见表3?3~表3?6。读者在进行实际操作练习时可以根据需要向表中添加更多的数据。表3?3供应商表SSNOSNAMESTATCITYS001天津安贝儿B天津S002北京启明星A北京S003北京新天地C北京S004天津丰泰盛B天津S005上海普丰C上海S006合肥四达B合肥表3?4零部件表PPNOPNAMECOLORWTP001螺母红12P002螺栓绿17P003螺钉旋具蓝14P004螺钉旋具红14P005凸轮蓝40P006齿轮红30表3?5工程项目表JJNOJNAMECITYJ001北京三建北京J002长春一汽长春J003新安弹簧厂天津J004临江造船厂天津J005唐山机车厂唐山J006新新无线电厂常州J007铭泰半导体厂南京续表表3?6供应情况表SPJSNOPNOJNOQTYS001P001J001200S001P001J003100S001P001J004700S001P002J002100S002P003J001400S002P003J002200S002P003J004500S002P003J005400S002P005J001400S002P005J002100S003P001J001200S003P003J001200S004P005J001100S004P006J003300S004P006J004200S005P002J004100S005P003J001200S005P006J002200S005P006J0045003.3数据定义功能
SQL的数据定义功能用来定义数据库中各种对象,包括定义数据库、定义基本表、定义索引和定义视图等。
3.3.1定义数据库
数据库是数据库系统管理和维护的核心对象,包括系统所需的全部数据。使用数据库进行数据管理的第一步就是定义数据库,包括创建数据库、修改数据库和删除数据库功能。
1. 创建数据库
当使用数据库存储数据时,首先必须在数据库管理系统(DBMS)中创建一个数据库。在一般的关系数据库管理系统产品中,一个数据库至少包含一个数据文件和一个事务日志文件。数据文件存放数据库的所有数据,事务日志文件存放访问数据库的事务日志。
在SQL中,可以使用CREATE DATABASE来创建数据库,创建数据库最简单的语法如下(所有参数均使用默认值): CREATE DATABASE
例如,创建“学籍管理系统”数据库,语句如下: CREATE DATABASE 学籍管理系统如果在创建数据库时需要指明确定的数据库文件、文件的大小以及文件的增长方式等,则需要使用CREATE DATABASE的完整语法格式,语句如下: CREATE DATABASE
\[
ON \[PRIMARY\]
\[ (NAME = ,
FILENAME =< 'path'>
\[,SIZE \]
\[,MAXSIZE = \]
\[,FILEGROWTH = \])
\[,FILEGROUP filegroup_name<>
\[ (NAME = ,
FILENAME =< 'path'>
\[,SIZE = \]
\[,MAXSIZE = \]
\[,FILEGROWTH = \]) \] \]
\]
\[
LOG ON
\[ (NAME =< logfile_name>,
FILENAME =< 'path'> \[,SIZE =< logfile_size>\]
\[,MAXSIZE = \]
\[,FILEGROWTH = \]) \]
\]在上述语句中,各关键字作用如下:
? ON关键字用来创建数据库的数据文件,使用PRIMARY选项表示创建的是主数据文件。
? FILEGROUP关键字用来创建数据文件组。
? LOG ON关键字用来创建数据库的事务日志文件。
? NAME后面的参数为所创建文件在数据库管理系统中的文件名称。
? FILENAME其后的字符串指出了各文件在操作系统中存储的路径名。
? SIZE定义文件初始化大小。
? MAXSIZE指定了文件的优选容量。
? FILEGROWTH指定了文件的增长方式(可以是每次增长的空间大小,也可以按百分比增长)。
【例3?1】使用CREATE DATABASE创建SPJ数据库。
(1) 使用SQL语句创建数据库。
创建SPJ数据库的SQL语句如下: CREATE DATABASE SPJ
ON
(NAME=SPJ_DATA,
FILENAME='D:\\SQL Server\\DATABASE\\SPJ_ DATA.mdf',
SIZE=8MB,
MAXSIZE=20MB,
FILEGROWTH=10%
)
LOG ON
(NAME=SPJ_LOG,
FILENAME='D:\\SQL Server\\DATABASE\\SPJ_LOG.ldf',
SIZE=4MB,
MAXSIZE=10MB,
FILEGROWTH=5%
)上述语句中使用CREATE DATABASE后参数指定数据库名称为SPJ,“NAME=”后面的参数指定了数据库系统的主文件名称为SPJ_DATA,“FILENAME=”后面指定了数据库主文件SPJ_DATA的存储路径为“D: \\SQL Server\\DATABASE\\ SPJ_ DATA.mdf”,“SIZE=”指定主文件的初始大小为8MB,“MAXSIZE=”指定数据文件大小的优选值为20MB,“FILEGROWTH=”指定了主文件的增长方式是按照百分比增长,每次增加10%的存储空间。LOG ON 关键词后的语句部分用来指定日志文件的各个相关属性,各参数的作用与数据文件相同。
(2) 使用交互式向导方式创建数据库。
SQL提供两种使用方式: 交互式和嵌入式,既可以用CREATE DATABASE语句创建数据库,也可以在SQL Server中用交互式向导方式根据界面提示创建数据库。实际应用中大多使用交互式方式直观地创建数据库对象。
利用SQL Server 2008中的Management Studio图形工具向导交互式建立数据库的步骤如下。
(1) 启动SQL Server 2008。
依次单击“开始”→“所有程序”→Microsoft SQL Server 2008→SQL Server Management Studio,启动SQL Server 2008数据库管理系统。
(2) 登录数据库服务器。
单击“连接到服务器”对话框中的连接按钮,连接到SQL Server 2008数据库服务器。
(3) 创建数据库“SPJ”。
在SQL Server 2008数据库管理系统的左边栏“对象资源管理器”中,右击数据库对象,在弹出的快捷菜单中单击“新建数据库”命令,如图3?2所示。
图3?2新建数据库菜单
在弹出的“新建数据库”对话框中输入数据库名称SPJ,改变数据库的初始大小、增长方式(如图3?3所示),以及数据文件、日志文件的存储路径,单击“确定”按钮。
图3?3更改数据库增长方式对话框
创建数据库之后,在左侧的对象资源管理器中右击“数据库”,在弹出的快捷菜单中单击“刷新”按钮,可以看到新建的数据库对象SPJ。
2. 修改数据库
在后期使用数据库时,根据用户需求的变化,有时需要对数据库名称进行修改或者更新。SQL使用ALTER DATABASE语句修改数据库名称。语法格式如下: ALTER DATABASE
MODIFY NAME=语句中为原数据库名,为修改后的新数据库名。
【例3?2】将数据库名SPJ改为“零件供应系统”。
语句如下: ALTER DATABASE SPJ MODIFY NAME=零件供应系统;3. 删除数据库
如果数据库不再使用,可以使用DROP DATABASE语句删除数据库。语法格式如下: DROP DATABASE\[,..,n\]【例3?3】删除“零件供应系统”数据库。
语句如下: DROP DATABASE零件供应系统;注意: 在使用DROP语句删除数据库时不会出现确认信息,所以使用该语句删除时一定要谨慎,尤其是不能删除系统数据库,否则可能导致相应的数据库管理系统无法使用。
3.3.2定义基本表
用CREATE DATABASE语句定义了数据库,只是向计算机操作系统为该数据库申请了所需要的命名空间,进一步需要在空间里建立数据库的所有关系模式,即基本表,基本表的定义保存在数据库的数据字典中。关系数据库系统中,所有数据都是存放在基本表里,绝大部分的数据操作都是针对基本表进行的,比如,数据查询、数据更新、视图管理、索引管理等。
定义基本表时,要说明表名、表中属性列的列名、数据类型等。SQL支持的基本数据类型见表3?7,各个数据库管理系统产品通常提供更多更丰富的数据类型。续表表3?7SQL支持的数据类型数 据 类 型含义CHAR(n)长度为n的定长字符串VARCHAR(n)优选长度为n的变长字符串INT长整数(也可以写作INTEGER)SMALLINT短整数NUMERIC(p,d)定点数,由p位数字(不包括符号、小数点)组成,小数点后面有d位小数REAL取决于机器精度的浮点数Double Precision取决于机器精度的双精度浮点数FLOAT(n)浮点数,精度至少为n位数字DATE日期,包含年、月、日,格式为YYYY?MM?DDTIME时间,包含一日的时、分、秒,格式为HH:MM:SSSQL Server支持的数据类型更为丰富,可以在SQL Server的Management Studio 中交互式定义基本表时查看数据类型下拉列表,也可以查阅SQL Server的联机手册或相关参考资料,本书3.11节中也有简单介绍。
1. 定义基本表
定义基本表的语句是CREATE TABLE,语句的语法格式如下: CREATE TABLE \[database_name.\[owner\]\].
(
{ |AS |
}|\[{PRIMARY KEY|UNIQUE } \[ ,...,n \]
)
\[ON {|DEFAULT}\]
\[TEXTIMAGE_ON {|DEFAULT}\];其中,属性列定义如下: ::= { }
\[\[DEFAULT \]|\[IDENTITY \[( ,)\]\]\]
\[\]\[ ,...,n\]上述语法格式中参数的简要说明如下:
? database_name 可选参数,用于指定在哪个数据库中创建数据表的数据库名称。
? owner可选参数,用于指定创建该数据表的所有者。
? 用于指定数据表的名称。
? 用于定义数据表中的字段,多个字段的定义之间用逗号分隔。
? 用于定义计算字段值的表达式。
? 定义表级约束。
? ON {filegroup|DEFAULT}可选参数,用于指定数据表所存储的文件组。
? TEXTIMAGE_ON {filegroup|DEFAULT}可选参数,用于指定数据表中TEXT和IMAGE文件所在存储文件组。
? 在中:
用于指定数据表中各个字段的数据类型。
用于指定字段默认值的常量、NULL或者系统函数。
IDENTITY用于指定该字段为标识字段。
用于定义标识字段的起始值。数据库管理系统允许给基本表定义一个IDENTITY类型的标识字段,作为元祖的专享标识,IDENTITY字段的值从初值开始,以步长自动递增。
SQL提供两种使用方式: 交互式和嵌入式。在SQL Server中,既可以使用SQL语句创建基本表,也可以用交互式向导方式创建基本表,系统会自动生成相应的创建基本表的语句,可以右击目标表,依次单击菜单中的“编辑表脚本为”→“CREATE 到”→“新查询编辑器窗口”,查看系统生成的创建目标表的SQL语句。
【例3?4】利用SQL Server 2008的Management Studio交互式向导创建供应商表S。
根据应用需要,设定供应商表S的各属性列信息,见表3?8。表3?8供应商基本表S的属性信息属性列数 据 类 型是否为空/约束条件SNOCHAR(4)主码,否SNAMECHAR(20)否STATCHAR(2)A、B、CCITYCHAR(10)否(1) 打开SQL Server 2008的Management Studio,在对象资源管理器中,单击SPJ数据库对象“”左侧的“+”,将其下属对象展开,右击“表”对象,在快捷菜单中单击“新建表”,如图3?4所示。
图3?4新建表示意图在打开的创建表的窗口中,按照要求进行建表操作,如图3?5所示。
图3?5交互式建立供应商表S的属性列
根据表定义要求,将供应商号SNO属性设置为主码,方法为: 右击SNO这一列,单击“设置主键”命令,如图3?6所示。
图3?6设置主键快捷菜单
设置成功后,SNO属性列左边出现,表示主码设置成功。
(2) 设置约束条件。
根据供应商表的要求,需要为STAT属性列设置约束条件,要求只能输入A、B、C三种属性值。设置约束条件的方法为: 选中STAT列,右击“CHECK约束”,如图3?7所示。
图3?7设置CHECK约束快捷菜单
在弹出的“CHECK约束”对话框中,单击“添加”按钮,在出现的对话框中将“标识”名称改为“CK_S_STAT”,如图3?8所示。
图3?8设置CHECK约束标识名
在此对话框中单击“常规”属性栏的“表达式”,再单击后面空白处出现的小按钮,弹出“CHECK约束表达式”对话框,在此对话框中输入约束条件“STAT='A' OR STAT='B'OR STAT='C'”(如图3?9所示),单击“确定”按钮,再单击“关闭”按钮即可。
图3?9CHECK约束表达式
(3) 保存表。
单击工具栏上的“保存”按钮,在弹出的对话框中输入表名S,单击“确定”按钮即可。
(4) 查看表。
右击对象资源管理器中的SPJ中的“表”,单击“刷新”按钮即可看到新建立的表,如图3?10所示。
图3?10查看供应商表S
注意: 采用交互式方式定义基本表,选择列的数据类型时,要根据实际应用的要求决定。对于字符型内容,要慎用变长字符串类型(VARCHAR);整数类型列应根据实际取值的大小范围选择TINYINT、SMALLINT、INT等。
【例3?5】在查询分析器中利用SQL语句在SPJ数据库中创建S表(供应商表),将供应商号SNO定义为主码,并建立对STAT 属性的取值约束。
例如:
(1) 双击打开SQL Server 2008,在弹出的“连接到服务器”对话框中单击“连接”按钮,连接到数据库服务器。
(2) 新建表SQL脚本。
单击工具栏中的“新建查询”按钮,在新建查询窗口中输入创建表的SQL语句,建立S表(如图3?11所示),其中,创建表的SQL语句如下: CREATE TABLE S
(
SNOchar(4) PRIMARY KEY,
SNAMEchar(20),
STATchar(2) CHECK (STAT IN ('A', 'B', 'C')),
CITYchar(10)
);图3?11用CREATE TABLE 语句创建供应商表
(3) 单击工具栏中的按钮,运行SQL语句,完成S表的创建工作(如果S表已经存在,则该语句不能运行,需要先把存在的S表删除)。在左侧的“对象资源管理器”中,“刷新”即可看到新建的供应商表S,结果和图3?10所示一样。
由于篇幅所限,对于供应管理数据库的零件P、工程J和供应SPJ基本表的建立参照S表的建立过程,这里不再赘述。下面给出每个表的属性信息列表以及建立表的SQL语句。
【例3?6】建立零件表P。
零件表P的属性信息如表3?9所示。表3?9零件基本表的属性信息属性列数 据 类 型是否为空/约束条件PNOCHAR(4)主码,否PNAMECHAR(10)否COLORCHAR(2)“红”“黄”“蓝”……WTSMALLINT否创建零件基本表P的SQL语句如下: CREATE TABLE P
(
PNO CHAR(4)PRIMARY KEY,
PNAME CHAR(10),
COLOR CHAR(2), WT SMALLINT
);【例3?7】建立工程表J。
工程表J的属性信息如表3?10所示。表3?10工程项目基本表J的属性信息属性列数 据 类 型是否为空/约束条件JNOCHAR(4)主码,否JNAMECHAR(20)否CITYCHAR(10)否创建工程项目基本表J的SQL语句如下: CREATE TABLE J
(
JNO CHAR(4)PRIMARY KEY,
JNAME CHAR(20),
CITY CHAR(10)
);【例3?8】建立供应表SPJ。
基本表SPJ的属性信息如表3?11所示,(SNO,PNO,JNO)属性组是主码。续表表3?11基本表SPJ的属性信息属性列数 据 类 型是否为空/约束条件SNOCHAR(4)主属性,否PNOCHAR(4)主属性,否JNOCHAR(4)主属性,否QTYINT是创建基本表SPJ的SQL语句如下: CREATE TABLE SPJ
(
SNO char(4) NOT NULL,
PNO char(4) NOT NULL,
JNO char(4) NOT NULL,
QTY int,
PRIMARYKEY(SNO,PNO,JNO)
);在上述语句中,将 (SNO,PNO,JNO) 作为一个整体定义为主码,因为在数据表中只有它们三个属性构成的整体能够专享标识表中的元组。在多个字段组合上设置主码,不能在列定义后面直接使用PRIMARY KEY,必须使用表级完整性约束条件来设置主码,表级完整性约束条件放在所有列定义结束之后。
也可以用如下语句在创建表的同时定义主码和外部码,且对主码和外部码约束进行命名: CREATE TABLE SPJ
(
SNO char(4) NOT NULL,
PNO char(4) NOT NULL,
JNO char(4) NOT NULL,
QTY int,
CONSTRAINT SPJ_pk PRIMARY KEY (SNO,PNO,JNO),
CONSTRAINT SPJ_fkSNO FOREIGN KEY (SNO) REFERENCES S(SNO),
CONSTRAINT SPJ_fkPNO FOREIGN KEY (PNO) REFERENCES P(PNO),
CONSTRAINT SPJ_fkJNO FOREIGN KEY (JNO) REFERENCES J(JNO)
);注意: 上面语句在建立SPJ表时,分别对SPJ表的属性供应商号SNO、零件号PNO和工程号JNO增加了外部码约束。外部码约束规定SPJ表的这三个属性值分别来源于S表、P表和J表的主码字段值,如果没有S表中的相应的SNO、P表中的PNO或J表中的JNO的属性值,那么为SPJ表增加数据记录是不符合逻辑的,违反了数据的参照完整性约束条件。新建表时利用子句“CONSTRAINT <约束名称> FORTIGN KEY(<属性名>) REFERENCES <表名(属性名)>”建立外部码约束,则可以保证插入到表中的数据都是符合参照完整性约束条件的。
2. 修改基本表
当创建完基本表之后,在使用的过程中可以根据需要对基本表进行必要的修改,修改基本表功能主要包括修改表的名称、修改字段的数据类型以及增加新属性列等,还可以删除命名的约束条件等。语法格式如下: ALTER TABLE <表名>
\[ ADD <新列名> <数据类型> \[ 完整性约束 \] \]
\[ DROP <完整性约束名> \]
\[ ALTER COLUMN<列名> <数据类型> \];(1) 修改表名称。
使用系统提供的存储过程sp_rename语句可以对数据表进行重命名。
【例3?9】将SPJ表重命名为“零件供应情况表”。EXEC sp_rename 'SPJ','零件供应情况表'(2) 修改列属性。
使用ALTER TABLE语句不仅可以添加新列和删除列的命名约束,还可以对列的属性进行修改。
【例3?10】将S表中的属性列SNAME的数据类型改为nvarchar(10),并且允许为空。ALTER TABLE S
ALTER COLUMN SNAME nvarchar(10) NULL;(3) 添加属性列。
通过使用ALTER TABLE语句,同样可以添加/删除基本表的属性列。
【例3?11】增加供应商电话号码属性列TEL, 其数据类型为字符型,宽度为12。ALTER TABLE S ADD TELCHAR(12);【例3?12】将TEL的数据类型由字符型改为整数。ALTER TABLE S ALTER COLUMN TEL INT;不论基本表中原来是否已有数据,新增加的列取值一律为空值。
(4) 删除属性列。
删除属性列可以使用DROP COLUMN语句。
【例3?13】将S表中TEL列删除。ALTER TABLE S
DROP COLUMN TEL; 3. 删除基本表
当不再需要某个基本表时,可以使用DROP TABLE语句将基本表删除。
【例3?14】将SPJ表删除。DROP TABLE SPJ;注意: 使用DROP TABLE语句删除的是基本表本身,即将基本表的定义和表中的数据一起删除,表上建立的索引、视图、触发器等一般也将被删除。如果只是想删除基本表中的数据而保留基本表的定义,则不能使用DROP TABLE语句,而必须使用后面数据更新功能中介绍的DELETE语句。
3.3.3定义索引 索引是加快数据查询速度的有效手段,它主要用于建立存取路径,提高数据库访问性能。索引是关系数据库的内部实现技术,属于数据库系统三级模式中内模式的范畴。
数据库管理员DBA或表的属主DBO(即创建基本表的用户)可以根据需要,在基本表上建立一个或多个索引,DBMS一般会自动建立具有PRIMARY KEY、UNIQUE约束的属性列上的索引。
索引的定义保存在数据库的数据字典中。索引建立之后,DBMS系统会随着基本表中数据的变化自动维护索引表,在进行数据查询操作时,数据库管理系统会自动选择是否使用索引以及使用哪些索引(这称为数据库管理系统的查询优化功能),以快速定位数据的存储位置。
1. 创建索引
使用CREATE INDEX语句可以在基本表上创建索引,可以定义索引是专享索引、非专享索引或聚簇索引,其基本语法格式如下: CREATE \[ UNIQUE \] \[ CLUSTERED | NONCLUSTERED \] INDEX
ON