高级网络工程师专业
SQL Server 2000
第6章 实现SQL Server 2000数据完整性
6.1 完整性的概念(《数据库应用》P39)
关系完整性:关系模型中数据的正确性、一致性和有效性。
关系完整性包括实体完整性、参照完整性、用户定义的完整性。
实体完整性(Entity Integrity):主码不能为空。
参照完整性(Reference Integrity):
一个关系中的外码值或者为空,或者为被参照关系中的一个主码值。
例2-15 客户关系和订单关系(《数据库应用》P40)
订单(订单号,客户号,雇员号,订单日期)
客户(客户号,姓名,性别,联系电话,联系地址)
用户定义的完整性(User - defined Integrity):
对关系中的属性的取值所作出的限定。
6.2 约束的类型
6.2.1 建立表结构(《数据库应用》P75)
语句格式:
CREATE TABLE [数据库名.]<基本表名>
(<列定义>,...[,<表级完整性约束>,...])
1)列级完整性约束
DEFAULT<常量表达式>:默认值约束。
NULL/NOT NULL:空值/非空值约束。
PRIMARY KEY:主码约束。
UNIQUE:单值约束。注明该列取值互不相同。
REFERENCES<父表名>(<主码>):外码约束。
注明该列为外码,并给出对应的父表及父表中被参照的主码。
CHECK(<逻辑表达式>):检查约束。如“性别='男'or 性别='女'”
2)表级完整性约束在所有列定义后给出。
PRIMARY KEY(<列名>,...)主码约束。注明一个或同时多个列为主码。
UNIQUE:单值约束。注明一个或同时若干个列为单值。
FOREIGN KEY(<列名>,...)REFERENCES<父表名>(<主码列名>,...)
外码约束。注明一个或同时多个列为外码,
并给出对应的父表及父表中被参照的主码中的所有列。
CHECK(<逻辑表达式>):检查约束。
注明每行中一个或若干个列在取值上必须满足的条件。
如,check(工龄<年龄)。
语句举例:
create table 学生(
学号 char(7) primary key,
姓名 char(6) not null unique,
性别 char(2) not null check(性别='男'or 性别='女'),
出生日期 datetime check(出生日期<'1993-12-31'),
专业 char(10),
年级 int check(年级>=1 and 年级<=4)
)
6.3 约束的创建(《数据库应用》P272)
* 约束的用途是限制用户输入到表中的数据的值的范围。
1.PRIMARY KEY 主码约束
例1:创建表级主码约束
create table 学生(
学号 char(7) not null,
姓名 char(6) not null,
constraint PK_学生表 primary key(学号)
)
例2:创建列级主码约束
create table 学生(
学号 char(7) not null,
constraint PK_学生表 primary key nonclustered,
姓名 char(6) not null,
)
聚集索引(clustered):按照索引键值重新排序。
非聚集索引(nonclustered):不按照索引键值排序。
2.FOREIGN KEY 外码约束
某列的取值必须参照另一个表的主码值。
3.Default 默认约束
4. UNIQUE:单值约束。对主码外的其它字段单值约束。
5.CHECK 检查约束
6.4 查看约束的定义(《数据库应用》P272-10)
使用系统存储过程查看约束的定义:
sp_helpconstraint 表名
6.5 删除约束(《数据库应用》P275-9)
alter table 表名
drop constraint 约束名
6.6 使用规则(《数据库应用》P275)
1.使用 Transact SQL 创建和删除规则
create rule 规则名 as 条件表达式
drop 规则名
例1:创建学生的年龄必须在一定范围的规则 Age_rule。
create rule Age_rule
as @MyAge between 17 and 28
@MyAge:局部变量
例2:创建图书定价必须在一定范围的规则图书定价_rule。
create rule 图书定价_rule
as @My图书定价 between 10 and 100
2.使用 Transact SQL 绑定规则
sp_bindrule 规则名,'表名.列名'
例:将规则与“学生表”中的年龄字段绑定
sp_bindrule Age_rule,'学生表.年龄'
3.使用企业管理器管理规则
企业管理器的树型结构—右击规则—新建规则—
规则名:如,图书定价_rule
规则条件表达式:如,@My图书定价 between 10 and 100
—确定。
双击规则名—修改、绑定规则。
6.7 使用默认(《数据库应用》P276)
1.使用 Transact SQL 创建和删除默认
create default 默认名 as 默认值
drop 默认名
例1:创建一个默认日期值 def_data。
create default def_data
as '2005-01-01'
例2:创建图书定价默认值 图书定价_default。
create default 图书定价_default as 33
2.使用 Transact SQL 绑定默认
sp_binddefault 默认名,'表名.列名'
例:将默认与“图书记录表”中的图书定价字段绑定
sp_binddefault 图书定价_default,'图书记录表.图书定价'
3.使用企业管理器管理默认
企业管理器的树型结构—右击默认—新建默认—
默认名、默认条件表达式—确定。
双击默认名—修改、绑定默认。
6.8 数据完整性强制选择方法
6.9 案例中的完整性实现
7.1 索引的基础知识
1.数据表包含字段多,搜索扫描慢。
索引表包含索引列,如,编号列,搜索简单的编号列快,
根据索引表中存储的记录指针到数据表中找出相应记录。
2.索引的分类
聚集索引(clustered):按照索引键值重新排序。
非聚集索引(nonclustered):不按照索引键值排序。
7.2 索引的操作
7.2.2 使用 SQL 企业管理器创建索引(P129)
SQL 企业管理器 ==》选择数据库和表 ==》右击表 ==》
所有任务 ==》管理索引 ==》[New]按钮 ==》新索引名、索引关键字。
例如:创建图书记录表的图书定价索引。
选择数据库和表 ==》右击图书记录表 ==》所有任务 ==》管理索引
==》[New]按钮 ==》索引名:tsdj_index、索引关键字:图书定价 ==》
索引选项:聚集索引 ==》编辑 SQL 语句
CREATE CLUSTERED
INDEX [tsdj_index] ON [dbo].[图书记录表] ([图书定价])
WITH DROP_EXISTING ON [PRIMARY]
==》执行 ==》关闭。
7.3.1 使用 SQL 企业管理器更改索引名(P131)
例如:更改图书记录表的图书定价索引名。
选择数据库和表 ==》右击图书记录表 ==》所有任务 ==》管理索引
==》[Edit]按钮 ==》索引名:tsdj_ind。
7.4 使用 SQL 企业管理器删除索引(P132)
例如:删除图书记录表的图书定价索引。
选择数据库和表 ==》右击图书记录表 ==》所有任务 ==》管理索引
==》[Delete]按钮。
7.5 设置索引的选项
FillFactor 选项:
在线事务处理使用低填充度,数据库存储使用高填充度。
Sorted_Data_Reorg 选项:
清除字段排序,可以减少创建索引的时间。
7.6 索引的分析与维护(P134)
DBCC ShowContig 语句
显示表的数据和索引信息。
DBCC ShowContig (table_id[,index_id])
例:打开 wssdk.mdb,显示图书记录表的数据和索引信息
DBCC ShowContig (图书记录表,图书定价_index)
DBCC DBreIndex 语句
重建表的一个或多个索引。
7.5 案例中的索引
8.1 数据的添加、修改和删除
添加、修改和删除表中的记录。
8.1.1 插入部分数据(P108)
应该指出插入数据的列名。
举例:把《Flash5 网页设计》加入图书记录表中
Insert Into
图书记录表1(图书号,图书名称,作者,图书定价,出版社)
values('55','Flash5 网页设计','李冬春等',36,'冶金工业')
8.1.2 修改表中的数据(P109)
* Update 语句
Set子句:指定要更新的列,
Where子句:指定要更新的行。
语法:
UPDATE table_name
SET columnname1=value1[,columnname2=value2]...
WHERE search_condition
举例:
把图书类别为“大专教材”的行,图书定价改为 0.9*图书定价。
Update 图书记录表1
Set 图书定价=0.9*图书定价
Where 图书类别='大专教材'
8.1.3 删除表中的数据(P110)
* Delete 语句
DELETE FROM table_name
WHERE condition
举例:删除图书记录表中图书类别为“大专教材”的行。
Delete from 图书记录表1 Where 图书类别='大专教材'
8.2 简单查询
SELECT 语句(P55)
查询数据库中已有的数据
SELECT 语句的基本语法格式:
SELECT 字段列表
[INTO 检索结果存储的新表]
FROM 查询的表名
[WHERE 搜索条件]
[GROUP BY 分组表达式]
[HAVIGN 搜索表达式]
[ORDER BY 排序表达式[ASC|DESC] (P63)
* 按要求查询图书记录表
按图书名称、作者、出版社、图书类别
进行分类查询、综合查询和按关键字搜索。
图书记录表
Access wssdk2k.rar SQL wssdk_Data.rar wssdk_Log.rar
图书号 | 图书名称 | 作者 | 出版社 | 图书定价 | 图书类别 |
1 | “神舟”五号清华群英谱 | 编写组 | 北京清华大学 | 33.00 | 新书介绍 |
2 | 纳米激光测尺在清华诞生 | 宋晓梦 | 北京清华大学 | 33.00 | 新书介绍 |
3 | 人类基因组测序 | 编写组 | 北京清华大学 | 33.00 | 新书介绍 |
4 | “舒氏区”学习记忆功能 | 编写组 | 北京清华大学 | 33.00 | 新书介绍 |
5 | 计算机网络应用 | 吕晓阳 | 广东科技 | 28.00 | 大专教材 |
6 | 电脑网络操作 | 编写组 | 北京理工大学 | 24.00 | 大专教材 |
7 | 网络数据库 开发实战 | 刘洪海 | 博嘉科技 | 40.00 | 大专教材 |
8 | SQL Server 2000 教程 | 曹军生 | 北京理工大学 | 29.00 | 大专教材 |
9 | SQL Server 7.0 教程 | 赵增敏等 | 电子工业 | 24.00 | 大专教材 |
10 | Access 2000 数据库 | 能力考试 | 辽宁人民 | 25.00 | 大专教材 |
27 | 计算机专业英语 | 杨永田 | 哈尔滨工大 | 12.00 | 大专教材 |
28 | 计算机应用基础 | 编写组 | 中央电视大学 | 61.50 | 大专教材 |
29 | 计算机信息技术基础 | 许骏 | 科学出版社 | 30.00 | 大专教材 |
30 | 计算机图形学基础 | 陈传波等 | 电子工业 | 28.00 | 大专教材 |
31 | 计算机辅助设计 ACAD | 教材编委 | 北京希望电子 | 32.00 | 大专教材 |
32 | 精通中文版 ACAD | 郭玲文等 | 北京清华大学 | 49.00 | 大专教材 |
33 | 计算机工具软件使用教程 | 刘瑞新等 | 机械工业 | 20.00 | 大专教材 |
34 | 宇宙银河系星座 | 编写组 | 科学出版社 | 33.00 | 科学技术 |
35 | 太阳系 | 编写组 | 科学出版社 | 33.00 | 科学技术 |
36 | 航天航空技术 | 编写组 | 科学出版社 | 33.00 | 科学技术 |
37 | 人造地球卫星 | 编写组 | 科学出版社 | 33.00 | 科学技术 |
38 | 宇宙飞船 | 编写组 | 科学出版社 | 33.00 | 科学技术 |
39 | 航天飞机 | 编写组 | 科学出版社 | 33.00 | 科学技术 |
8.2.1 选择列(P56)
1.选择所有列
select * from 图书记录表
所有列
2.选择特定列
select 图书号,图书名称,图书定价,图书类别 from 图书记录表
3.计算列
select 图书名称,'会员价'=0.9*图书定价 from 图书记录表
4.改变列标题:新列名=旧列名(P58)
select tsmc=图书名称,tsdj=图书定价 from 图书记录表
8.2.3 WHERE 子句(P59)
列出“大专教材”类的图书(准确查询用“=”号)。
select 图书号,图书名称,图书定价 from 图书记录表 Where 图书类别='大专教材'
列名 表源 条件
1.比较运算符
列出不是“大专教材”类的图书。
select * from 图书记录表 Where 图书类别<>'大专教材'
2.范围运算符
列出“图书定价”在30元~35元之间的图书。
select * from 图书记录表 Where 图书定价 between $30 and $35
3.列表运算符
列出“大专教材”和“科学技术”类的图书。
select * from 图书记录表 Where 图书类别 in('大专教材','科学技术')
4.匹配符(P62)
用类似 like 和“%”匹配任意字符,进行模糊查询。
如,查找图书名称为'程序设计'结尾的图书。
select * from 图书记录表 Where 图书名称 like '%计%'
select * from 图书记录表 Where 图书名称 like '%程序设计'
select * from 图书记录表 Where 图书名称 like '计算机%'
select * from 图书记录表 Where 出版社 like '%大学'
* SQL Server 2000中,使用选择 SELECT 语句查询检索数据
工具栏—显示/隐藏SQL窗格,[!]运行SQL。
8.2.4 建立查询(P112)
* SQL 核心语句:SELECT、UPDATE、INSERT、DELETE。
1.打开 SQL 查询分析器两种方法:
开始 ==》程序 ==》SQL 程序组 ==》SQL 查询分析器。
SQL 企业管理器 ==》工具 ==》SQL 查询分析器。
2.查询分析器工具栏
[分析查询]、[执行查询]、
打开数据库列表下拉钮选择数据库,如 wssdk。
3.用有数据的数据库文件复盖无数据的数据库框架
1)SQL 企业管理器中预先建无数据的数据库框架,
如,E:\本地站点\mdb\wssdk_data.mdf wssdk_log.ldf。
2)下载有数据的数据库压缩文件 wssdk_Data.rar wssdk_Log.rar,
解压到 E:\本地站点\mdb1\ 中得 wssdk_data.mdf wssdk_log.ldf。
3)关闭 SQL 服务管理器,用有数据的数据库文件复盖无数据的数据库
框架。
若不带日志文件 wssdk_log.ldf,则系统自动创建新日志文件。
4.执行连接数据库,如 wssdk
1)SQL 企业管理器中预先不建数据库框架,
下载 wssdk_Data.rar wssdk_Log.rar 文件,
解压到 E:\本地站点\mdb\ 中得 wssdk_data.mdf wssdk_log.ldf。
2)把数据库连接到 SQL Server 环境中后进行编辑。
打开 SQL Server 2000 查询分析器,
在查询窗口中复制粘贴执行连接数据库的代码 LJsjk.sql。
exec sp_attach_db 'wssdk',
'E:\本地站点\mdb\wssdk_Data.mdf',
'E:\本地站点\mdb\wssdk_Log.ldf'
3)分析查询、执行查询,
4)企业管理器 ==》树窗口 ==》可找到已经连接上的 wssdk
5.查询分析器编辑 Transact-SQL 语句;
SELECT *
FROM 图书记录表
WHERE 图书类别='大专教材'
按工具栏[执行]按钮,执行查询和显示结果;
用[文件]==》[另存为]保存查询结果。
8.2.5 分布式查询(P118)
对象连接嵌入库(OLEDB)作外部数据接口:
提供程序 PROVIDER:MICROSOFT.JET.OLEDB.4.0;
数据源 DATA SOURCE:
影射站点根目录(如,E:/本地站点/)后的路径。
如 Server.MapPath ("/mdb/wssdk.mdb")。
set cn=Server.CreateObject("ADODB.Connection")
cn.open "PROVIDER=MICROSOFT.JET.OLEDB.4.0;
DATA SOURCE="+Server.MapPath ("/mdb/wssdk.mdb")
8.3 连接查询(P118)
* 以指定表中的列作为连接条件同时从多个表中检索数据。
* FROM 子句中的 ANSI 连接形式
SELECT 表名.列名,表名.列名,……
FROM{表名[连接形式]JOIN 表名 ON 搜索条件}
WHERE [搜索条件]
连接形式:内链接、无限制链接、外链接。
* WHER 子句的 SQL Server 连接形式
SELECT 表名.列名,表名.列名,……
FROM 表名,表名
WHERE {表名.列名 连接运算符 表名.列名}
连接运算符:=, >, <, >=, <=, <>。
例:以用户资料表的用户姓名与用户留言表的留言用户相等
为连接条件,把用户资料表、用户留言表连接在一起。
单值 distinct。(自然连接《数据库应用》P90)
SELECT distinct
X.用户姓名,X.购书密码,X.联系电话,Y.留言主题,Y.电子邮件
FROM 用户资料表 X,用户留言表 Y
WHERE X.用户姓名=Y.留言用户
例:以姓名为连接条件,
把用户资料表、用户留言表连接生成用户资料留言表。
SELECT distinct
X.用户姓名,X.购书密码,X.联系电话,Y.留言主题,Y.电子邮件
INTO 用户资料留言表
FROM 用户资料表 X,用户留言表 Y
WHERE X.用户姓名=Y.留言用户
例:只连接“林木森”的记录。
WHERE X.用户姓名=Y.留言用户 and X.用户姓名='林木森'
8.3.1 内连接(JOIN)(P119)
两个表连接生成包含满足连接条件行的第三个表。
例:以用户资料表的用户姓名'林木森'为连接条件,
把用户资料表、用户留言表连接在一起。
SELECT distinct
X.用户姓名,X.购书密码,X.联系电话,Y.留言主题,Y.电子邮件
FROM 用户资料表 X join 用户留言表 Y
ON X.用户姓名='林木森'
WHERE X.用户姓名=Y.留言用户
8.3.2 无限制连接(CROSS JOIN)(P120)
两个表连接生成包含所有行的第三个表。
例:以用户资料表的用户姓名'林木森'为连接条件,
把用户资料表、用户留言表连接在一起。
SELECT distinct
X.用户姓名,X.购书密码,X.联系电话,Y.留言主题,Y.电子邮件
FROM 用户资料表 X cross join 用户留言表 Y
WHERE X.用户姓名=Y.留言用户
8.3.3 外链接(OUTER JOIN)(P121)
left OUTER JOIN、right OUTER JOIN、full OUTER JOIN
两个表连接生成第三个表,
包含一表满足连接条件的行和另一表全部行的。
例:以用户资料表的用户姓名'林木森'为连接条件,
把用户资料表、用户留言表连接在一起。
SELECT distinct
X.用户姓名,X.购书密码,X.联系电话,Y.留言主题,Y.电子邮件
FROM 用户资料表 X left outer join 用户留言表 Y
ON X.用户姓名='林木森'
WHERE X.用户姓名=Y.留言用户
8.3.4 自连接(P122)
把同一表中的某些行连接起来,便于查询同一表中的相同信息。
同一表指定两次,要用两个别名。(《数据库应用》P95)
例:从用户留言表查询出留言至少两次的留言用户,单值 distinct。
SELECT distinct X.留言用户,X.留言主题
FROM 用户留言表 X,用户留言表 Y
WHERE X.留言用户=Y.留言用户 and X.留言主题<>Y.留言主题
8.4 子查询(P124)
* 查询中再嵌套子查询。
SELECT 可以嵌套子查询 SELECT、INSERT、UPDATE、DELETE。
* 举例:从“图书记录表”中检索出
大专教材类图书定价高于此类图书平均定价的记录。
SELECT 图书号,图书定价
FROM 图书记录表
WHERE 图书类别='大专教材' AND 图书定价 >
(SELECT AVG(图书定价) FROM 图书记录表
WHERE 图书类别='大专教材')
8.5 案例应用举例