数据库.docx
- 文档编号:8872719
- 上传时间:2023-05-15
- 格式:DOCX
- 页数:18
- 大小:28.07KB
数据库.docx
《数据库.docx》由会员分享,可在线阅读,更多相关《数据库.docx(18页珍藏版)》请在冰点文库上搜索。
数据库
数据库
第1节数据库定义
数据库是自描述的完整记录的集合。
数据库是自描述的:
它除了包含用户的源数据外,还包含关于它本身结构的描述。
这个描述称为数据字典(或数据目录,或元数据)。
从这种意义上讲,数据库与作为一个自描述的书的集合的图书馆是相似的。
除了书籍以外,图书馆还包含一个描述它们的卡片目录。
同样,数据字典(是数据库的一部分,这与卡片目录是图书馆的一部分一样的)描述了包含在数据库中的数据。
数据库是集成记录的集合。
用户数据文件是由这些记录组合而成的。
数据库不只是仅仅包含用户数据文件,它还包含其它内容,正如前面所说,元数据也是数据库的一部分,除此之外,数据库还包含用来表示数据之间的关系和提高数据库应用性能的索引。
最后,数据库还包含关于使用数据库的应用程序的数据,我们把这种数据称为应用元数据。
因此,数据库包含4个要素:
用户数据、元数据、索引和应用元数据。
大多数数据库把用户数据表示为关系(表),元数据也以表的形式存储,称作为系统表。
应用元数据用来存储用户窗体、报表、查询和其它形式的应用组件。
第2章数据库设计
数据库设计的方法是首先建立E-R(实体-联系)模型,然后将E-R模型转换为关系模型,再对关系模型进行规范化处理。
下面分别对它们进行讨论。
2.1实体-联系模型
数据库设计的早期阶段的主要目标是,建立要在数据库中表示的事物,确定这些事物的特征,并建立它们之间的联系。
2.1.1实体
实体是可以从用户的工作环境中标识出的事物,是用户想要跟踪的某个事物,也就是要在数据库中表示的事物。
如产品、供应商、定单、雇员和客户等是实体。
实体表示的是一类事物,我们称为实体类,实体类中的一个具体事物称为该实体的一个实例。
如“雇员”是实体类,名为“王非”的雇员是“雇员”实体类的一个实例。
名为“李强”的雇员是“雇员”实体类的另一个实例。
一个实体类通常有很多实例。
2.1.2属性
实体具有属性,有时也称为性质,它是用来描述实体的特性的。
姓名、性别、出生日期这些都是“雇员”实体的属性。
属性的具体取值称为属性的值。
名为“王非”的雇员,性别为“男”,出生日期为“1980-10-18”,这里“王非”为姓名属性的值,“男”为性别属性的值,“1980-10-18”为出生日期属性的值。
实体类的每个实例的属性具有确定的的值。
2.1.2标识符
第2章使用关系(表)存储用户数据
2.1关系模型
2.1.1关系模型的概念
一个关系是一个二维表(如图2.1所示),表中的每一行保存属于某些事物或某些事物的一部分的数据。
表中的每一列包含关于事物的属性的数据。
有时行称作元组,列称作属性。
关系、元组和属性这些术语来自关系数学,即该模型的理论根源。
但用程序员用文件、记录和字段表达同样的概念,用户则用表、行和列来表达同样的含义。
具体如图2.1。
表2.1关系术语及其含义
术语
含义
关系(或表,文件)
二维窗体
属性(或列,字段)
一个关系的列
元组(或行,记录)
一个关系中的行
一个表要想成为关系,它必须满足如下条件:
(1)表中的每一格必须是单值的,不允许是多值的.这样可使每行和每列的交叉点仅包含单个值。
(2)每一列(字段)的所有条目都必须是同一类型。
例如,有一列包含雇员的名字,另一列包含雇员的出生日期。
每一列都有唯一的名字(字段名),列在在表中的顺序不重要。
每一列都有一个域,是指该列中允许取值的物理或逻辑描述。
它不仅包括数据类型的概念,也包括列中所允许的值(如每一列的数据类型(如果必要,还应注意列宽等))。
(3)表中任意两行不能相同。
行的顺序无关紧要。
以后我们要讨论的所有的表都满足关系的条件,我们就使用表这个术语
2.1.2关键字
2.2指定列数据类型
表中的每一列(字段)都有特定的数据类型。
数据类型定义了各列(字段)所允许的数据值。
整型数据
整型数据由负整数或正整数组成,如-15、0、5和2509。
依整型数数值的大小范围,有bigint、int、smallint和tinyint五种。
精确数值数据类型
精确数值数据类型用于存储带有小数的数据,有decimal和numeric两种。
在SQLServer中,numeric数据类型和decimal数据类型是一样的。
近似浮点数值数据类型
近似浮点数值数据类型有float和real两种,它们不能确定所输出的数值的精确度。
字符数据
字符数据由字母、符号和数字组成。
例如,有效字符数据包括"928"、"Johnson"和"(0*&(%B99nh jkJ"。
字符数据使用char、varchar和text数据类型存储。
当列中各项的字符长度数时可用varchar类型,但任何项的长度都不能超过8KB。
当列中各项为同一固定长度时使用char类型(最多8KB)。
text数据类型的列可用于存储大于8KB的ASCII字符。
例如,由于HTML文档均由ASCII字符组成且一般长于8KB,所以用浏览器查看之前应在SQLServer中存储在text列中
Unicode数据类型
Unicode数据使用SQLServer中的nchar、varchar和ntext数据类型进行存储。
对于存储来源于多种字符集的字符的列,可采用这些数据类型。
当列中各项所包含的Unicode字符数不同时(至多为4000),使用nvarchar类型。
当列中各项为同一固定长度时(至多为4000个Unicode字符),使用nchar类型。
当列中任意项超过4000个Unicode字符时,使用ntext类型。
货币数据
货币数据表示正的或负的货币值。
有money和smallmoney两种货币数据类型。
货币数据存储的精确度为四位小数。
可以存储在money数据类型中的值的范围是-922,337,203,685,477.5808至+922,337,203,685,477.5807(需8个字节的存储空间)。
可以存储在smallmoney数据类型中的值的范围是-214,748.3648至214,748.3647(需4个字节的存储空间)。
如果数值超过了上述范围,则可使用decimal数据类型代替。
二进制数据
二进制数据由十六进制数表示。
例如,十进制数245等于十六进制数F5。
二进制数据使用binary、varbinary和image数据类型存储。
指派为binary数据类型的列在每行中都是固定的长度(最多为8KB)。
指派为varbinary数据类型的列,各项所包含的十六进制数字的个数可以不同(最多为8KB)。
image数据列可以用来存储超过8KB的可变长度的二进制数据,如MicrosoftWord文档、MicrosoftExcel电子表格、包含位图的图像、图形交换格式(GIF)文件和联合图像专家组(JPEG)文件。
除非数据长度超过8KB时用image数据类型存储,一般宜用varbinary类型来存储二进制数据。
日期和时间数据
日期和时间数据由有效的日期或时间组成。
例如,有效日期和时间数据既包括"4/01/9812:
15:
00:
00:
00PM",也包括"1:
28:
29:
15:
01AM8/17/98"。
日期和时间数据使用datetime和smalldatetime数据类型存储。
使用datetime数据类型存储从1753年1月1日至9999年12月31日的日期(每个数值要求8个字节的存储空间)。
使用smalldatetime数据类型存储从1900年1月1日至2079年6月6日的日期(每个数值要求4个字节的存储空间
特殊数据
特殊数据包括不能用前面所述的二进制、字符、Unicode、日期和时间、数字和货币数据类型表示的数据。
有四种特殊数据类型:
(1)timestamp
用于表示SQLServer在一行上的活动顺序,按二进制格式以递增的数字来表示。
当表中的行发生变动时,用从@@DBTS函数获得的当前数据库的时间戮值来更新时间戮。
timestamp数据与插入或修改数据的日期和时间无关。
若要自动记录表中数据更改的时间,使用datetime或smalldatetime数据类型记录事件或触发器。
(2)bit
bit数据类型只能包括0或1。
可以用bit数据类型代表TRUE或FALSE、YES或NO。
例如,询问客户是否为初次访问的问题可存储在bit列中。
(3)uniqueidentifier
以一个16位的十六进制数表示全局唯一标识符(GUID)。
当需要在多行中唯一标识某一行时可使用GUID。
例如,可使用unique_identifier数据类型定义一个客户标识代码列,以编辑公司来自多个国家/地区的总的客户名录。
(4)sql_variant
一种存储SQLServer所支持的各种数据类型(text、ntext、timestamp和sql_variant除外)值的数据类型。
(5)table
一种特殊的数据类型,存储供以后处理的结果集。
table数据类型只能用于定义table类型的局部变量或用户定义函数的返回值。
2.3关系的实现
完成了表(关系)的设计之后,就可创建表了。
由于表包含在数据库中,数据库是存放表的逻辑实体,因此在创建表时,必须先创建数据库。
2.3.1创建数据库
下面的示例SQL命令创建名为mydatabase的数据库,。
CREATEDATABASEmydatabase
删除数据库
当不再需要数据库,或如果它被移到另一数据库或服务器时,即可删除该数据库。
数据库删除之后,文件及其数据都从服务器上的磁盘中删除。
一旦删除数据库,它即被永久删除,
(1)除去单个数据库
下例从系统表中删除publishing数据库的所有引用。
DROPDATABASEpublishing
(2)除去多个数据库
下例从系统表中删除每个列出的数据库的所有引用。
DROPDATABASEpubs,newpubs
不能除去当前正在使用(正打开供用户读写)的数据库。
修改数据库
下例将数据库accounting改名为financial。
EXECsp_renamedb'accounting','financial'
2.3.2创建表
1.使用SQL语言创建表
SQL语言提供了CREATETABLE来创建表,其基本语法如下:
CREATETABLE表名
(
字段名1数据类型NULL或NOTNULL,
字段名2数据类型NULL或NOTNULL,
……
字段名n数据类型NULL或NOTNULL
)
1)下面的示例SQL创建名Employees。
Usemydatabase
CREATETABLEEmployees
(
EmployeeIDINTNULL,
Namenvarchar(20),
Titlenvarchar(30),
BirthDatedatetimenull,
HireDatedatetimenull,
Addressnvarchar(60)null
)
2.3.3修改表
使用SQL语言修改表
1)增加字段。
基本语法如下:
ALTERTABLE表名ADD字段名数据类型NULL或NOTNULL
下例添加一个允许空值的字段Phone。
各行的Phone字段的值将为NULL。
CREATETABLEdoc_exa(column_aINT)
GO
ALTERTABLEEmployeesADDPhoneNVARCHAR(20)NULL
GO
2)删除字段。
基本语法如下:
ALTERTABLE表名DROPCOLUMN字段名
下例修改表以删除字段Phone。
ALTERTABLEEmployeesDROPCOLUMNPhone
3)修改字段。
基本语法如下:
ALTERTABLE表名
ALTERCOLUMN字段名数据类型NULL或NOTNULL
下例修改Employees表的Name字段,将其数据类型改为VARCHAR,宽度为30。
ALTERTABLEEmployees
ALTERCOLUMN
NameVARCHAR(30)NULL
ALTERTABLEEmployees
ALTERCOLUMN
EmployeeIDchar(20)
4).重命名表
下例将表Employees重命名为empls。
EXECsp_rename'Employees','empls'
5)重命名字段
下例将表empls中的字段Name重命名为FullName。
EXECsp_rename'empls.[Name]','FullName','COLUMN'
2.3.4操作表的数据
1)添加数据
可以使用INSERT...Values插入行,其基本语法为:
INSERTINTO表名(字段列表)VALUES(字段值列表)
说明:
VALUES关键字为表的某一行指定值。
值被指定为逗号分隔的标量表达式列表,表达式的数据类型、精度和小数位数必须与字段的列表对应的字段一致,或者可以隐性地转换为字段的列表中的对应字段。
如果没有指定字段的列表,指定值的顺序必须与表中的字段顺序一致。
(1)使用简单的INSERT
下面的示例向Employees表插入一行。
INSERTINTOEmployeesVALUES(12345,'王飞','经理',1980/10/2,2000-1-6,'广州')
查看Employees表数据:
SELECT*
FROMEmployees
(2)插入与列顺序不同的数据
下面的示例使用字段列表及字段值列表显式地指定将被插入每个列的值。
INSERTINTOEmployees(Name,EmployeeID,Title,BirthDate,HireDate,Address)
VALUES('王飞',12345,'经理',1980/10/2,2000-1-6,'广州')
(3)插入值少于列个数的数据
INSERT语句插入一行,该行只有部分列包含值。
INSERTINTOEmployees(EmployeeID,Name,Title,HireDate)
VALUES(12345,'王飞','经理',2000-1-6)
2)修改数据
使用UPDATE语句更改数据。
UPDATE语句可以更改表中单行、多行或所有行的数据值。
其基本语法为:
UPDATE表名
SET字段名1=表达式1,字段名2=表达式2,……字段名n=表达式n
WHERE条件表达式
UPDATE语句包括以下主要子句:
SET
包含要更新的列和每个列的新值的列表(用逗号分隔),格式为:
字段名=表达式。
表达式提供的值包含多个项目,如常量或使用复杂的表达式计算出来的值。
WHERE
指定搜索条件,该搜索条件定义源表可以为SET子句中的表达式提供值的行。
(1)使用简单的UPDATE
下列示例说明如果从UPDATE语句中去除WHERE子句,所有的行会受到什么影响。
下面这个例子说明,如果表publishers中的所有出版社将总部搬迁到佐治亚州的亚特兰大市,表publishers如何更新。
UPDATEpublishers
SETcity='Atlanta',state='GA'
本示例将所有出版商的名字变为NULL。
UPDATEpublishers
SETpub_name=NULL
也可以在更新中使用计算值。
本示例将表titles中的所有价格加倍。
UPDATEtitles
SETprice=price*2
(2)把WHERE子句和UPDATE语句一起使用
WHERE子句指定要更新的行例如,在下面这个虚构的事件中,北加利福尼亚(CA)更名为Pacifica(缩写为PC),而奥克兰(Oakland)的市民投票决定将其城市的名字改为BayCity。
这个例子说明如何为奥克兰市以前的所有居民(他们的地址已经过时)更新表authors。
UPDATEauthors
SETstate='PC',city='BayCity'
WHEREstate='CA'ANDcity='Oakland'
下面的示例将类别(category)2中所有Northwind产品的价格提高了10%:
UPDATENorthwind.dbo.Products
SETUnitPrice=UnitPrice*1.1
WHERECategoryID=2
3)删除数据
可使用DELETE语句删除行。
DELETE语句可删除表或视图中的一行或多行。
DELETE基本语法为:
DELETE表名WHERE条件表达式
表名指定要从中删除行的表。
表名指定的表中所有符合WHERE搜索条件的行都将被删除。
如果没有指定WHERE子句,将删除表名指定的表中的所有行。
WHERE子句搜索条件中的谓词使用它们限定要从指定的表中中删除的行。
任何已删除所有行的表仍会保留在数据库中。
DELETE语句只从表中删除行,要从数据库中删除表,必须使用DROPTABLE语句
(1)不带参数使用DELETE
下例从authors表中删除所有行。
USEpubs
DELETEauthors
(2)在行集上使用DELETE
因为au_lname可能不是唯一的,下例删除其中的au_lname是McBadden的所有行。
USEpubs
DELETEFROMauthors
WHEREau_lname='McBadden'
第3章字段的属性和约束
2.设置字段的属性。
描述
显示对选定列的文本描述。
默认值
每当在表中为该列插入带空值的行时,显示该列的默认值。
该字段的值既可以是SQLServer默认约束值,也可以是该列绑定的全局约束名。
下拉列表包含在数据库中定义的所有全局默认值。
若要将列绑定到全局默认值上,请从下拉列表中选择。
或者,若要创建列的默认约束,请直接以文本形式输入默认值。
精度
显示该列值的最大数字个数。
小数位数
显示该列值小数点右边能出现的最大数字个数。
标识
显示SQLServer是否将该列用作标识列。
可能的值是:
否 不将该列用作标识列。
是 将该列用作标识列。
是(不适用于复制) 将该列用作标识列,但复制代理程序正将数据插入表中时除外。
IdentitySeed
显示标识列的种子值。
该选项只适用于其"标识"选项设置为"是"或"是(不适用于复制)"的列。
IdentityIncrement
显示标识列的递增量值。
该选项只适用于其"标识"选项设置为"是"或"是(不适用于复制)"的列。
是RowGuid
显示SQLServer是否将该列用作ROWGUID列。
只有对于标识列才能将该值设置为"是"。
CREATETABLETA
(
aint,
bintdefault35,
cchar(26)default'abc'
)
CREATETABLETB
(
afloat,
bdecimal(8,2)
)
CREATETABLETC
(
aintidentity(10,2),
bchar(20)
)
CREATETABLEGlobally_Unique_Data
(guiduniqueidentifier
DEFAULTNEWID(),
Employee_Namevarchar(60)
)
CREATETABLEmytable
(
lowint,
highint,
myavgAS(low+high)/2
)
空(NULL)值
空(NULL)值表示数值未知。
空值不同于空白或零值。
没有两个相等的空值。
比较两个空值或将空值与任何其它数值相比均返回未知,这是因为每个空值均为未知。
空值通常表示未知、不可用或将在以后添加的数据。
例如,客户的中间名首字母在客户下定单时可能不知道。
空值或NULL并不等于零(0)、空白或零长度的字符串(如""),NULL意味着没有输入。
NULL的存在通常表明值未知或未定义。
例如,pubs数据库titles表中price列的空值并不表示该书没有价格,而是指其价格未知或尚未设定。
如果插入某行但没有为允许空值的列包括值,则Microsoft®SQLServer™2000提供NULL值(除非存在DEFAULT定义或DEFAULT对象)。
用关键字NULL定义的列也接受用户的NULL显式输入,不论它是何种数据类型或是否有默认值与之关联。
NULL值不应放在引号内,否则会被解释为字符串"NULL"而不是空值。
指定一列不允许空值而确保行中一列永远包含数据可以保持数据的完整性。
如果不允许空值,用户在向表中写数据时必须在列中输入一个值,否则该行不被接收入数据库
约束
PRIMARYKEY约束
表中经常有一个列或列的组合,其值能唯一地标识表中的每一行。
这样的一列或多列称为表的主键,通过它可强制表的实体完整性。
当创建或更改表时可通过定义PRIMARYKEY约束来创建主键。
一个表只能有一个PRIMARYKEY约束,而且PRIMARYKEY约束中的列不能接受空值。
由于PRIMARYKEY约束确保唯一数据,所以经常用来定义标识列。
CREATETABLETA
(
aintCONSTRAINTcolumn_b_pkPRIMARYKEY,
bintdefault35,
cchar(26)default'abc'
)
Usemydatabase
CREATETABLEEmployees
(
EmployeeIDINTNULL,
Namenvarchar(20),
Titlenvarchar(30),
BirthDatedatetimenull,
HireDatedatetimenull,
Addressnvarchar(60)null
)
CREATETABLEdoc_exe(column_aINTCONSTRAINTcolumn_a_unUNIQUE)
GO
ALTERTABLEdoc_exeADD
/*AddaPRIMARYKEYidentitycolumn.*/
column_bINTIDENTITY
CONSTRAINTcolumn_b_pkPRIMARYKEY,
UNIQUE约束
可使用UNIQUE约束确保在非主键列中不输入重复值。
尽管UNIQUE约束和PRIMARYKEY约束都强制唯一性,但在强
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据库