SQL SERVER 2005练习集(修改数据库文件,修改表数据,约束,视图)

约束 ­

PRIMARY  KEY(主键)约束 ­

FOREIGN  KEY(外键)约束 ­

UNIQUE (唯一)约束 ­

CHECK  (核查)约束 ­

=======================

1、修改数据库名称

use master
go
execute sp_renamedb 'newDemo','Demo'
go

2、数据库文件组更名

use master
go
alter database school
modify filegroup  teachers
name=teacher
go

3、查看文件组属性

use school
go
exec sp_helpfilegroup
go

4、更改数据文件名称

use school
go
alter database school
modify file
(
  name=school2,
  newname=school3
)
go

5、通过sp_helpfile系统存储过程来查看数据文件属性

use  school
go
exec sp_helpfile
go

6、修改数据库school中逻辑名称为school2的数据文件物理位置,将其变更到c:/下

use  master
go
alter database school
modify  file
(
  name=school2
  filename='c:/school2.ndf'    --filename无效
)
go

7、修改数据文件的大小

use school
go
alter database school
modify file
(
  name=school2,
  size=23
)
go

8、添加文件组

alter database school
add filegroup linshi1
go

9、添加数据文件(在linshi1中)

alter database school
add file
(
   name=linshi2,
   filename='D:/SQL  2005/School/Data/linshi2.ndf',
   size=3,
   maxsize=20,
   filegrowth=1
)
to filegroup linshi1
go

10、添加日志文件

alter database school
add log file
(
   name=school_log4,
   filename='D:/SQL  2005/School/Data/school_log4.ldf',
   size=3,
   maxsize=20,
   filegrowth=1
)
go
exec sp_helpfile
go

11、删除文件

--先删除数据文件
alter database school
remove file linshi2
go
--再删除文件组
alter database school
remove filegroup linshi1
go
--最后删除日志文件
alter database school
remove file school_log4
go
exec sp_helpfile
go

12、查看数据库文件组的属性

1 exec sp_helpfilegroup
2 go

13、卸载附加数据库

--卸载数据库
use master
go
execute sp_detach_db  'Demo'
go
--附加数据库
use master
go
exec sp_attach_db 'Demo',
'D:/SQL  2005/DATABASE/DATA/demo.mdf'
go

14、查看系统表

--查看master数据库中存储数据库的系统表
use master
go
select * from sysdatabases
go
--查看数据库school中存储文件组的系统表
use school
go
--select * from sys.filegroups
--go
--查看存储数据文件信息的系统表
select * from sys.database_files
go

15、理解sysobjects系统视图

--1、表中没有存储信息的情况
--在数据库中增加其他文件组
use demo
go
/*alter database demo
add filegroup test
go
--在文件组中增加一个数据文件
alter database demo
add  file
(
  name=test1,
  filename='D:/SQL  2005/DATABASE/DATA/test1.ndf',
  size=10,
  maxsize=20,
  filegrowth=1
)
to  filegroup test
go
--建表
create table worker
(
  id  int,
  [name]  char(20)
)
on  test
go
--删除test1数据文件
alter database demo
remove file test1
go
select * from  worker
go*/
/*当删除数据文件test1后,这个表在数据库中仍然存在,这是因为表的名称存储在sysobjects中,
表的列的定义则存储在sys.columns中,这些系统视图实际上都存储在主文件组内*/

--2、表中有存储信息的情况
-- 增加一个数据文件

 alter database demo
 add  file 
(
  name=test2,
  filename='D:/SQL  2005/DATABASE/DATA/test2.ndf',
  size=10,
  maxsize=20,
  filegrowth=1
)
to  filegroup test
go
insert into worker
(id ,[name])
values(200601,'Alice')
go
insert into worker
(id ,[name])
values(200602,'Alfred')
go
--删除test2
alter database demo
remove file  test2
go

/*当表中有数据以后数据文件就不能够删除,因为数据文件中的内容已经不为空.
  因此我们可以看出表中的真实数据书存储在数据文件中,表的定义则是存储在主文件组中的*/

16、修改表明,表列名

use  school
go
--查看表的属性
exec  sp_help student
go

--修改表名称
exec  sp_rename  'student','students'
go
--修改表列的名称
exec  sp_rename  'student.name','学生名'
go

17、修改表结构

use demo
go
--修改列
alter table worker
alter column [name]  char(30)
go
--添加列
alter table worker
add city varchar(10)
go
--select * from worker
--删除列
alter  table  worker
drop column  city
go

18、修改表的数据类型

alter table worker
alter column  id  char(10)
go
insert  into  worker
(id,[name])
values
('200603a','Tom'   )
go
--修改表的数据类型
alter  table  worker
alter  column  id  int
go
/*从上面的列子我们可以看出当字段中存储了字符串数据类型的数值后,此字段就无法转换成数值类型,
  能够将字符串类型的列转换成为数字类型,只能是在此列存储的数值都是数字的情况下*/
--将列变为not null
alter  table worker
alter  column  id  int  not  null
go

  列子:

 

use  school
go
alter  table  学生
add    毕业时间   char(20)
go
--将学生表中毕业日期列数值补全
update  学生
set  毕业时间='2005年毕业'
where  学生编号=2006001
go
update  学生
set  毕业时间='尚未毕业'
where 学生编号=2006002
go

19、添加约束

use  school
go
--在家长表添加带约束的列
alter  table parents
add  salary/*工资*/ money  check (salary>0)
go
--修改家长表中薪水列
update parents
set  salary=100000
where  id=2001
go

update  parents
set  salary=-200000
where  id=2002
go
--为学生表添加限制生源地的约束
alter table  学生
add  city  char(10)
go
alter  table 学生
add constraint ck_学生_city  check
(city  in('北京','天津','上海','广州')) 
go
--修改学生表中的信息
update 学生
set  city='北京'
where  学生编号=2006001
go
update 学生
set  city='昆明'
where  学生编号=2006002
go
--两个相互矛盾的CHECK约束
alter  table teachers
add  salary money
go
--约束:限制其薪水>7000
alter  table teachers
add  constraint/*强制*/ ck_teachers_salary_1  check(salary>7000)
go
-- 约束:限制其薪水<6000 
alter  table teachers
add  constraint/*强制*/ ck_teachers_salary_2  check(salary<6000)
go
--更改老师编号为101的薪水
update  teachers
set  salary=4000
where id=101
go

update  teachers
set  salary=8000
where id=102
go
/*从中可以看出:SQL  SERVER上不会校验出约束的限制是否正确。约束的作用是叠加的,如果一个列中有多个约束,则
录入的数值就要满足所在列上的所有约束。*/
--DEFAULT约束
--为student表city列定一个默认值约束
alter  table student
add  constraint df_student_city
default('北京') for city
go
--录入记录
insert into student
(id,[name],gender,age,grade,class,teacher_id,parents_id,graduation,city)
values
(2006001,'Alice','女',23,1,1,101,2001,'2005年毕业','北京')
go
insert into student
(id,[name],gender,age,grade,class,teacher_id,parents_id,graduation,city)
values
(2006002,'Rose','女',24,1,2,102,2001,'尚未毕业','天津')
go
insert into student
(id,[name],gender,age,grade,class,teacher_id,parents_id,graduation,city)
values
(2006008,'MR.wang','男',24,1,1,101,2003,'2006年毕业',default)
go
/*一个DEFAULT只能约束一列,不能用于TIMESTAMP,IDENTITY的列*/
--select  * from student
--UNIQUE约束
--在student表中添加cardno列
alter table  student
add  cardno  char(20)
go
--添加身份证号
update student
set cardno='220200030304304033'
where id=2006001
go
update student
set cardno='220200030304304034'
where id=2006002
go
update student
set cardno='220200030304304035'
where id=2006008
go
-- 添加唯一约束
alter table  student
add constraint uk_student_cardno  unique(cardno)
go
insert into student
(id,[name],gender,age,grade,class,teacher_id,parents_id,graduation,city,cardno)
values
(2006009,'Tank','男',25,2,2,103,2004,'2006年毕业','上海','220200030304304033')
go
--primary key和foreign key约束
--创建图书和作者表
create table author/*作者*/
(
  id  int,
  [name]  char(20)
)
go
create table titles
(
  title_no  char(10),
  title_name  char(10),
  author_id  int
)
go
--主键约束
alter table  author
alter  column  id  int  not  null
go
alter table author
add  constraint pk_author_id  primary key(id)
go
--外键约束
alter  table titles
add  constraint fk_titles_author_id  foreign key(author_id)
references  author(id)
go
--========================================================
/*禁用/启用约束*/
--查看约束信息
use  school
go
exec  sp_helpconstraint  student
go
--禁用city列上的约束
alter  table  student
nocheck  constraint ck_student_city
go
--录入一条来自新疆学生的信息
insert  into  student
(id,[name],gender,age,grade,class,teacher_id,parents_id,graduation,city,cardno)
values
(2006009,'Kook','男',20,1,3,102,2004,'尚未毕业','新疆','220200030304304040')
go
--启用city列上的约束
alter  table  student
check  constraint  ck_student_city
go
--录入一条来自新疆学生的信息
insert  into  student
(id,[name],gender,age,grade,class,teacher_id,parents_id,graduation,city,cardno)
values
(2006010,'Took','男',22,1,2,101,2001,'尚未毕业','新疆','220200030304304040')
go
/*对表原始数据不校验添加约束*/
--不校验原始数据的情况下添加约束
alter table  teachers
with  nocheck add  constraint
ck_teacher_teaching_age  check(teaching_age>5)
go
-- 录入教学年龄为6年的教师
insert into  teachers
(id,[name],gender,age,subject,teaching_age,position,salary)
values
(105,'张月','女','28','语文',6,'初级教师',null)
go
-- 录入教学年龄为4年的教师
insert into  teachers
(id,[name],gender,age,subject,teaching_age,position,salary)
values
(106,'张凡','男','28','计算机',4,'初级教师',null)
go
/*CHECK为添加约束时的默认选项,代表的是对原始数据进行校验,NOCHECK代表的是添加新的约束时,对原始数据
不进行校验*/
/*使用级联CASCADE*/
--删除ID为101的老师的信息
delete from  teachers
where  id=101
go
--修改ID为101的老师的信息
update teachers
set  id=110  where  id=101
go
/*通过上面的实验可以看出,编号为101的老师信息,由于被学生表所引用,所以无论删除或修改这个关键
字都会报错,因为违反了信息的完整性。*/
/*为了在更改老师表编号列时,实现在学生表中同步更改老师编号,需要重新维护学生表中的外键约束*/
--删除学生表上与老师表关联的外键约束
alter table  student
drop  constraint fk_student_tescher_id_teacher_id
go
exec  sp_helpconstraint student
go
--在学生表上重新创建带级联关系的外键约束
alter  table  student
add  constraint  fk_student_teacher_id_teacher_id
foreign  key(teacher_id)  references  teachers(id)
on  delete  cascade
go
--;删除老师101的信息
delete  from  teachers
where  id=101
go
select  * from  student
go
select  *  from  teachers
go
/*从上面可以看出,和101有关的信息都被删除了*/
/*创建/使用规则*/
--创建年龄规则
create  rule age_rule
as  @age>0
go
--将规则与学生表列绑定
exec sp_bindrule  age_rule,'student.age'
go
--录入一个学生的信息/
insert into  student
(id,[name],gender,age,class,teacher_id,parents_id,graduation,city,cardno)
values
(2006011,'小明','男',-9,2,103,2004,'尚未毕业','北京',220200030304304342)
go
--将规则从列上解除绑定/删除规则
drop  rule  age_rule
go
/*可以看到运行出错*/
--解除帮定
exec  sp_unbindrule  'student.age'
go
--录入一个学生的信息/
insert into  student
(id,[name],gender,age,class,teacher_id,parents_id,graduation,city,cardno)
values
(2006011,'小海','男',-9,2,103,2004,'尚未毕业','北京',220200030304304342)
go
--删除规则
drop  rule  age_rule
go
/*可以看出,要删除,必须先解除*/
/*创建使用DEFAULT对象*/
--创建默认值对象
create default df_age
as  23
go
--绑定
exec  sp_bindefault  df_age,'student.age'
go
--录入一个学生的信息
insert into  student
(id,[name],gender,age,class,teacher_id,parents_id,graduation,city,cardno)
values
(2006012,'小刚','男',default,2,102,2001,'尚未毕业','天津',220200030304304343)
go
--解除绑定
exec  sp_unbindefault 'student.age'
go
--删除DEFAULT对象
drop  default  df_age
go

20、创建、使用、查询视图

--创建名称为v_student_teacher的视图
create  view  v_student_teachers
as
select  s.id  as  'student_id',
s.[name]  as  'student_name',
s.gender  as  'student_gender',
s.age  as  'student_age',
s.grade,
s.class,
s.teacher_id  as  's_teacher_id',
s.parents_id,
s.graduation,
s.city,
s.cardno,
t.id  as  'teacher_id',
t.[name]  as  'teacher_name',
t.gender  as  'teacher_gender',
t.age  as  'teacher_age',
t.subject,
t.teaching_age,
t.position,
t.salary
from  student  as  s
inner  join
teachers  as  t 
on  s.teacher_id=t.id
go
--使用视图
--select  *  from  v_student_teachers
--go
/*创建视图:定义视图的查询不可以包含ORDER  BY、COMPUTE 或 COMPUTE BY句子或INTO关键字。*/
--查询视图
select  *  from  v_student_teachers
go
--创建视图
create  view  v_student  as 
select  *  from  student
go
--访问视图
select  * from v_student
go
/*对表student进行INSERT,UPDATE操作*/ select * from student go select * from v_student go --对id为2006011的学生信息进行UPATE更新操作 update student set city='大连' where id='2006011' go select * from student go select * from v_student go /*对表student进行INSERT,UPDATE操作*/ select * from student go select * from v_student go
--进行INSERT插入操作 insert into student(id,[name],gender,age,graduation) values(2006014,'小萌','男','23','已经毕业') go
--对id为2006011的学生信息进行UPATE更新操作 update student set city='天津' where id='2006011' go select * from student go select * from v_student go --对id为2006013的学生信息进行delete删除操作 delete from student where id='2006013' go select * from student go select * from v_student go --查询学生表与学生老师信息视图 select id,[name],age from student go select student_id,student_name,student_age from v_student_teachers go
--通过视图student_teacher向表student中插入一条数据 insert into v_student_teachers (student_id,student_name,student_age,graduation) values ('2006013','小萌','24','已毕业') go select id,[name],age from student go select student_id,student_name,student_age from v_student_teachers*/ --where student_id='2006013' --通过视图更改数据 select id,[name],age from student go select student_id,student_name,student_age from v_student_teachers go --通过视图student_teacher更改表student中,学生"小萌"的年龄 update v_student_teachers set student_age='23' where student_name='小萌' go select id,[name],age from student go select student_id,student_name,student_age from v_student_teachers go
--通过视图删除数据 delete v_student_teachers where student_name='小萌' go /*说明当一个视图由两个或两个 以上基表构成时,不允许通过视图删除基表中的数据, 即只能通过单基表视图删除数据*/ --分区视图 /*创建三个数据库,并分别在三个数据库上建立表*/ create database jan1998 on primary ( name=jan1998_data, filename='D:/SQL 2005/DATABASE/DATA/jan1998_data.mdf', size=10, maxsize=50, filegrowth=1 ) log on ( name=jan1998_log, filename='D:/SQL 2005/DATABASE/Log/jan1998_log.ldf', size=10, maxsize=15, filegrowth=1 ) go create database feb1998 on primary ( name=feb998_data, filename='D:/SQL 2005/DATABASE/DATA/feb1998_data.mdf', size=10, maxsize=50, filegrowth=1 ) log on ( name=feb1998_log, filename='D:/SQL 2005/DATABASE/Log/feb1998_log.ldf', size=10, maxsize=15, filegrowth=1 ) go create database mar1998 on primary ( name=mar1998_data, filename='D:/SQL 2005/DATABASE/DATA/mar1998_data.mdf', size=10, maxsize=50, filegrowth=1 ) log on ( name=mar1998_log, filename='D:/SQL 2005/DATABASE/Log/mar1998_log.ldf', size=10, maxsize=15, filegrowth=1 ) go --建立1~3月份的销售表 use jan1998 go create table jan1998sales ( orderid int, customerid int not null, orderdate datetime null, check(datepart(yy,orderdate)=1998), ordermonth int check(ordermonth=1), deliverydate datetime null, check(datepart(mm,deliverydate)=1), constraint OrderIDMonth primary key(orderid,ordermonth) ) go use feb1998 go create table feb1998sales ( orderid int, customerid int not null, orderdate datetime null, check(datepart(yy,orderdate)=1998), ordermonth int check(ordermonth=2), deliverydate datetime null, check(datepart(mm,deliverydate)=2), constraint OrderIDMonth primary key(orderid,ordermonth) ) go use mar1998 go create table mar1998sales ( orderid int, customerid int not null, orderdate datetime null, check(datepart(yy,orderdate)=1998), ordermonth int check(ordermonth=3), deliverydate datetime null, check(datepart(mm,deliverydate)=3), constraint OrderIDMonth primary key(orderid,ordermonth) ) go
--插入数据记录 use jan1998 go insert into jan1998sales values(1,101,convert(datetime,'01/15/1998',101),'1',convert(datetime,'01/15/1998')) go insert into jan1998sales values(2,101,convert(datetime,'01/11/1998',101),'1',convert(datetime,'01/17/1998')) go use feb1998 go insert into feb1998sales values(3,103,convert(datetime,'02/21/1998',101),'2',convert(datetime,'02/11/1998')) go use mar1998 go insert into mar1998sales values(6,108,convert(datetime,'03/07/1998',101),'3',convert(datetime,'03/13/1998')) go insert into mar1998sales values(7,108,convert(datetime,'03/09/1998',101),'3',convert(datetime,'03/13/1998')) go insert into mar1998sales values(8,108,convert(datetime,'03/10/1998',101),'3',convert(datetime,'03/13/1998')) go use jan1998 go select * from jan1998sales go use feb1998 go select * from feb1998sales go use mar1998 go select * from mar1998sales go
/*建立1~3月份的分区视图*/ use jan1998/*怎么用多个数据库??*/
go create view year1998sales as select * from jan1998sales union all select * from feb1998sales union all select * from mar1998sales go /*查询1~3月份的分区视图*/ use jan1988/*怎么用多个数据库??*/
go --建立索引视图基表,将ANSI_NULLS设置为ON use school go select * from year1998sales where ordermonth in (1,3) go set ansi_nulls on create table student_idx ( id int not null primary key, [name] char(30) , age char(10) ) go
--向基表插入数据 insert into student_idx values (2006012,'小辉','27') go
--建立索引视图将ANSI_NULLS,QUOTED_IDENTIFIER设置为ON set ansi_nulls on go set quoted_identifier on go create view dbo.v_student_idx with schemabinding /*架构绑定将视图绑定到基础基表的架构*/ as select s.id as id,s.name as [name],s.age as age from dbo.student_idx as s go
/*在视图建立索引,将ANSI_NULLS,ANSI_PADDING,ANSI_WARNING,CONCAT_NULL_YIELDS_NULL,QUOTED_IDENTIFIER设置为ON, 将NUMERIC_ROUNDABORT设置为OFF*/ set ansi_nulls,ansi_padding,ansi_warnings,concat_null_yields_null,quoted_identifier on; set numeric_roundabort off create unique clustered index idx_v_student_idx on v_student_idx(id) go /*修改/删除视图*/ --修改视图v_student_teachers alter view v_student_teachers as select s.id as 'student_id', s.[name] as 'student_name', s.gender as 'student_gender', s.age as 'student_age', s.grade as 'student_grade', s.class, s.teacher_id as 's_teacher_id', s.parents_id, s.graduation, s.city, s.cardno, t.id as 'teacher_id', t.[name] as 'teacher_name', t.gender as 'teacher_gender', t.age as 'teacher_age', t.subject, t.teaching_age, t.position, t.salary from student as s inner join teachers as t on s.teacher_id=t.id go /*通过上面的操作,视图就被修改为代码包含SELECT语句结构*/ --重命名视图 use school go exec sp_rename 'v_student_teachers' , 'student_teachers' go /*新名字就是student_teachers*/ --删除视图 --drop view v_student_teachers --go /*视图与DEFAULT的使用*/ --创建一个具有DEFAULT属性的表 create table student_default ( id int, [name] char(20), gender char(2), age char(10), grade int default 1 /*使用DEFAULT属性创建的列*/ ) go --插入数据 INSERT into student_default values (1,'小刚','男','20',2) --查询 select * from student_default go --创建以具有DEFAULT属性列的表为基表的视图 create view v_student_default as select * from student_default go --通过视图向基表中插入数据,但DEFAULT列不进行插入数值 insert into v_student_default(id,[name],gender,age) values(1,'小萌','男','22') go --查询 select * from student_default go select * from v_student_default go

  

 

­

posted @ 2012-05-10 11:23  细品人生  阅读(1486)  评论(0编辑  收藏  举报