您的位置:首页 > 数据库

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

2012-05-10 11:23 706 查看
约束 ­

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、查看数据库文件组的属性

exec sp_helpfilegroup
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


  

­
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐