啦啦啦啦啦,数据库终于要实验了,很担心做不好,要是挂了怎么办
只是自己的作业,可能会有问题,欢迎前来指正
一、题目(100分)
一、创建后面给出的这6个表(20分)
二、用不同的方法创建约束;(5分)
三、查看和删除约束;(5分)
四、创建、删除默认和规则 (5分)
五、掌握主键约束的特点和用法;(5分)
六、掌握惟一性约束的用法;(5分)
七、掌握默认约束和默认对象的用法;(5分)
八、掌握CHECK约束和规则对象的用法;(5分)
九、掌握利用主键与外键约束实现参照完整性的方法(5分)
十、增加一个字段;(5分)
十一、删除一个字段;(5分)
十二、增加一个约束; (5分)
十三、修改字段的数据类型(5分)
十四、创建索引;(5分)
十五、重建索引(5分)
十六、创建视图;(5分)
十七、删除视图(5分)
二、一些基础知识
2.1 数据库中的五种约束及其添加方法
五大约束
1.主键约束(Primay Key Coustraint) 唯一性,非空性
2唯一约束 (Unique Counstraint)唯一性,可以空,但只能有一个
3.检查约束 (Check Counstraint) 对该列数据的范围、格式的限制(如:年龄、性别等)
4.默认约束 (Default Counstraint) 该数据的默认值
5.外键约束 (Foreign Key Counstraint) 需要建立两表间的关系并引用主表的列
五大约束的语法示例
1.添加主键约束(将stuNo作为主键)
alter table stuInfo
add constraint PK_stuNo primary key (stuNo)
2.添加唯一约束(身份证号唯一,因为每个人的都不一样)
alter table stuInfo
add constraint UQ_stuID unique(stuID)
3.添加默认约束(如果地址不填 默认为“地址不详”)
alter table stuInfo
add constraint DF_stuAddress default (‘地址不详’) for stuAddress
4.添加检查约束 (对年龄加以限定 15-40岁之间)
alter table stuInfo
add constraint CK_stuAge check (stuAge between 15 and 40)
alter table stuInfo
add constraint CK_stuSex check (stuSex=’男’ or stuSex=’女′)
5.添加外键约束 (主表stuInfo和从表stuMarks建立关系,关联字段stuNo)
alter table stuInfo
add constraint FK_stuNo foreign key(stuNo)references stuinfo(stuNo)
2.2 查看和删除约束
--查看约束
1. 查看user表的约束信息
select * from user_constraints WHERE TABLE_NAME='USERS';
2. 查看约束列上的信息
select * from WHERE user_cons_columns TABLE_NAME='USERS';
--删除约束
ALTER TABLE 表名 DROP CONSTRAINT 约束名
2.3 新增一个字段
alter TABLE t_Execution(表名)
add FIsModifyQuote(列名) int(1)(字段的属性和长度) not NULL(设置非空) DEFAULT 0(默认值设置为0)
2.4 删除一个字段
alter table [表名] drop 字段名
2.5 修改字段的数据类型
alter table <表名> alter column <列名> type <type>;
有时候会用到强制转换
alter table <table name> alter column <column name> type <type> using <column name> :: <type>;
2.6 创建索引
索引的分类
唯一索引(UNIQUE):每一行的索引值都是唯一的(创建了唯一约束,系统将自动创建唯一索引)
主键索引:当创建表时指定的主键列,会自动创建主键索引,并且拥有唯一的特性。
聚集索引(CLUSTERED):聚集索引就相当于使用字典的拼音查找,因为聚集索引存储记录是物理上连续存在的,即拼音 a 过了后面肯定是 b 一样。
非聚集索引(NONCLUSTERED):非聚集索引就相当于使用字典的部首查找,非聚集索引是逻辑上的连续,物理存储并不连续。
PS:聚集索引一个表只能有一个,而非聚集索引一个表可以存在多个。
UNIQUE:为表或视图创建唯一索引。 唯一索引不允许两行具有相同的索引键值。 视图的聚集索引必须唯一。如果要建唯一索引的列有重复值,必须先删除重复值。
CLUSTERED:表示指定创建的索引为聚集索引。创建索引时,键值的逻辑顺序决定表中对应行的物理顺序。 聚集索引的底层(或称叶级别)包含该表的实际数据行。
NONCLUSTERED:表示指定创建的索引为非聚集索引。创建一个指定表的逻辑排序的索引。 对于非聚集索引,数据行的物理排序独立于索引排序。
CREATE INDEX 索引名 ON 表名(列名);
联合索引
CREATE INDEX 索引名 ON 表名(列名1, 列名2, 列名3, ...);
2.7 删除索引
DROP INDEX 索引名;
查看某表的所有索引
SELECT * FROM ALL_INDEXES WHERE TABLE_NAME = '表名'
2.8 重建索引
DBCC DBREINDEX('Table'')
2.9 创建视图
CREATE VIEW 视图名称
AS
SELECT column_name(s) FROM table_name
WHERE condition
2.10 查看视图
select * from 视图名
2.11 删除视图
drop view 视图名
三、我的垃圾代码(仅供参考)
--参照完整性:若属性(或属性组)F是基本关系R的外码,它与基本关系S的主码Ks相对应,
--则对于R中每个元组在F上的值必须:或者取空值(F的每个属性组均为空值),或者等于S中某个元组的主码值。
--提示:定义约束格式为
--constraint 约束名称 约束类型 (列)
--如constraint pk_id primary key clustered (id))
--ALTER TABLE 表名 DROP PRIMARY KEY; -- 这种方式才对,不用加主键名字是因为一张表中只有一个主键
--ALTER TABLE stu DROP INDEX phone_number; -- 删除唯一约束的真正语法
--later table 表名 add constraint 外键名 foreign key (外键字段列) referenes 主表名称(主表列名称);
---- 删除外键约束 ALTER TABLE employee DROP FOREIGN KEY emp_dep_fk;
--SQLServer 中有五种约束,* Primary Key 约束、 *Foreign Key 约束、* Unique 约束、 Default 约束和* Check 约束,
--为了可以现场演示,这里写一个可以删掉刚创建的【读者信息表】,然后就可以重复演示了
drop table 读者信息表
--创建第一个表:读者信息表
create table 读者信息表
(
借书证号 int not null unique, --主码,不能为空
姓名 char(10) not null, --名字给到10个字符,不能为空
性别 char(2) not null, --性别给到2个字符,表中没有空
出生日期 date not null, --这是数据库特有的变量,不能为空
借书量 smallint, --看起来都很小,虽然应该不能为空,但表中有空
工作单位 char(30) not null, --工作单位可能比较长
电话 char(10) not null,
E_mail char(20) not null --给多一点,不能直接写E-mail,只好写E_mail了
--指定借书证号为主键值,并且创建一个聚簇索引
constraint reader_rno primary key clustered (借书证号) ,
--输入性别字段值时,只能接受“男”或者“女”
constraint chkoo_rsex check(性别 in ('男','女')),
--为rphone字段创建检查约束,限制只能输入类似85860126之类的数据,而不能随意输入其他数据
constraint check_phone check
(电话 like '[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]') ,
)
insert into 读者信息表 values ('29307142','张晓露','女','1989-02-1','2','管理信息系','85860126','zxl@163.com');
insert into 读者信息表 values ('36405216','李阳','男','1988-12-26', '1','航海系','85860729','ly@sina.com.cn');
insert into 读者信息表 values ('28308208','王新全','男','1988-04-25','1','人文艺术系','85860618','wxq@yahoo.cn');
insert into 读者信息表 values ('16406236','张继刚','男','1989-08-18','1','轮机工程系','85860913','zjg@163.com');
insert into 读者信息表(借书证号,姓名,性别,出生日期,工作单位,电话,E_mail) values ('16406247','顾一帆','男','1981-12-30', '轮机工程系','85860916','gyf@yahoo.cn');
--检查一下表的内容
select * from 读者信息表
--但是奇怪的是,插入后,没有按照我插入的顺序,而是按照了借书证号的首字符排序
--为了可以现场演示,这里写一个可以删掉刚创建的【借还明细表】,然后就可以重复演示了
drop table 借还明细表
--创建第二个表:借还明细表
create table 借还明细表
(
借书证号 int not null,
图书编号 char(10) not null, --可以看到有0开头的数据,所以用char
借还 char(2) not null, --借或者还
借书日期 date not null, --同理
还书日期 date, --可以为空
数量 smallint not null, --很小的数字
工号 char(10) not null --带着0开头的数据
foreign key(借书证号) references 读者信息表(借书证号), --外码
constraint chk_bor check(借还 in ('借','还')),
)
--插入数据
insert into 借还明细表 values ('29307142','07108667','还','2008-03-28','2008-04-14','1','002016');
insert into 借还明细表 (借书证号,图书编号,借还,借书日期,数量,工号) values ('29307142','99011818','借','2008-04-27','1','002016');
insert into 借还明细表 (借书证号,图书编号,借还,借书日期,数量,工号) values ('36405216','07410802','借','2008-04-27','1','002018');
insert into 借还明细表 (借书证号,图书编号,借还,借书日期,数量,工号) values ('29307142','07410298','借','2008-04-28','1','002018');
insert into 借还明细表 values ('36405216','00000746','还','2008-04-29','2008-05-09','1','002016');
insert into 借还明细表 (借书证号,图书编号,借还,借书日期,数量,工号) values ('28308208','07410139','借','2008-05-10','1','002019');
insert into 借还明细表 (借书证号,图书编号,借还,借书日期,数量,工号) values ('16406236','07410139','借','2008-05-11','1','002017');
--确认数据
select *from 借还明细表
--更怪了,这次的顺序是对的,没有按照借书证号排序
--为了可以现场演示,这里写一个可以删掉刚创建的【图书类别】,然后就可以重复演示了
drop table 图书类别
--创建第三个表:图书类别
create table 图书类别
(
类别号 char(10) not null, --不确定有多少,就先给10吧
图书类别 char(20) not null --名字可能会很长
)
--插入数据
insert into 图书类别 values('H31','英语');
insert into 图书类别 values('I267','当代作品');
insert into 图书类别 values('TP312','程序语言');
insert into 图书类别 values('TP393','计算机网络');
insert into 图书类别 values('U66','船舶工程');
--确认数据
select * from 图书类别
--这次的数据也对了,难道是因为主码的原因吗
--为了可以现场演示,这里写一个可以删掉刚创建的【图书借阅明细表】,然后就可以重复演示了
drop table 图书借阅明细表
--创建第四个表
create table 图书借阅明细表
(
图书编号 char(10) not null, --可以看到有0开头的数据,所以用char
图书名称 char(30) not null, --可能很长的名字
借书证号 char(20) not null,
借出日期 date not null, --不能为空
归还日期 date, --可能为空
库存数 int --不知道有多少
)
--插入数据
insert into 图书借阅明细表 (图书编号,图书名称,借书证号,借出日期,库存数) values('99011818','文化苦旅','29307142','2008-04-27','14');
insert into 图书借阅明细表 (图书编号,图书名称,借书证号,借出日期,库存数) values('07410802','航海英语','36405216','2008-04-27','24');
insert into 图书借阅明细表 (图书编号,图书名称,借书证号,借出日期,库存数) values('07410298','C++程序设计语言','29307142','2008-04-28','14');
insert into 图书借阅明细表 (图书编号,图书名称,借书证号,借出日期,库存数) values('07410139','艺海潮音','28308208','2008-05-10','18');
insert into 图书借阅明细表 (图书编号,图书名称,借书证号,借出日期,库存数) values('07410139','艺海潮音','16406236','2008-05-11','17');
--查看数据
select * from 图书借阅明细表
--这次也对的,我迷茫了
--为了可以现场演示,这里写一个可以删掉刚创建的【工作人员】,然后就可以重复演示了
drop table 工作人员
--创建第五个表:工作人员
create table 工作人员
(
工号 char(10) not null, --带着0开头的数据
姓名 char(10) not null, --给10个字符
性别 char(2) not null, --性别为两个字符
出生日期 date not null, --不能为0
联系电话 char(10) not null, --感觉用int也可以
E_mail char(20) not null, --给多一点,不能直接写E-mail,只好写E_mail了
--为rphone字段创建检查约束,限制只能输入类似85860126之类的数据,而不能随意输入其他数据
constraint choo_wphone check
(联系电话 like '[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]')
)
--插入数据
insert into 工作人员 values('002016','周学飞','男','1971-05-03','85860715','zxf@163.com');
insert into 工作人员 values('002017','李晓静','女','1979-09-15','85860716','lj@163.com');
insert into 工作人员 values('002018','顾彬','男','1972-04-25','85860717','gb@yahoo.cn');
insert into 工作人员 values('002019','陈欣','女','1968-11-03','85860718','cx@sina.com.cn');
--查看数据
select * from 工作人员
--现在顺序是对的
--为了可以现场演示,这里写一个可以删掉刚创建的【图书明细表】,然后就可以重复演示了
drop table 图书明细表
--创建第六个表:图书明细表
create table 图书明细表
(
类别号 char(10) not null,
图书编号 char(10) not null,
图书名称 char(30) not null,
作者 char(10),
出版社 char(30),
定价 char(10),
购进日期 date,
购入数 int,
复本数 int,
库存数 int
)
--插入数据
insert into 图书明细表 values('I267','99011818','文化苦旅','余秋雨','知识出版社','16','2000-03-19',8,15,14);
insert into 图书明细表 values('TP312','00000476','Delphi高级开发指南','坎图','电子工业出版社','80','2000-03-19',15,15,15);
insert into 图书明细表 values('U66','01058589','船舶制造基础','杨敏','国防工业出版社','19','2001-07-15',20,20,20);
insert into 图书明细表 values('I267','07410139','艺海潮音','李叔','江苏文艺出版社','19','2007-04-12',15,20,18);
insert into 图书明细表 values('TP312','07410298','C++程序设计','成颖','东南大学出版社','38','2007-05-08',10,15,14);
insert into 图书明细表 values('H31','07410802','航海英语','陈宏权','武汉工业大学出版社','42','2007-10-20',25,25,24);
insert into 图书明细表 values('H31','07108667','大学英语学习辅导','姜丽蓉','北京理工大学出版社','23.5','2008-02-06',25,25,25);
insert into 图书明细表 values('TP393','07410810','网络工程实用教程','汪新民','北京大学出版社','34.8','2008-08-21',10,15,15);
--查看数据
select * from 图书明细表
--增加一个字段
alter table 读者信息表 add rage smallint; --增加“年龄”列,smallint
--删除一个字段
alter table 读者信息表 drop column rage ; --删除“年龄”列
--删除约束
alter table 读者信息表 drop CONSTRAINT reader_rno; --删除rno的unique约束
--alter table reader drop CONSTRAINT rname
--修改字段的数据类型
alter table 读者信息表 ALTER COLUMN 借书量 int; --将借书量修改为int
--创建索引
create unique index Rearno on 读者信息表(借书证号); --创建唯一索引
create clustered index Boobname on 图书明细表(图书名称); --创建聚簇索引
drop index Rearon; --删除索引
drop index Boobname; --删除索引
--创建视图
go
create view readerview
as
select 姓名,出生日期 from 读者信息表;
go
--查看当前视图
select * from readerview
--删除视图
drop view readerview;