zoukankan      html  css  js  c++  java
  • 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

      

    ­

  • 相关阅读:
    数据库结构中的"树"
    Jquery学习
    cms系统也不复杂
    让你的博客园变灰
    IList对象排序方法
    计算机简介(二)
    在同一台电脑上使用U盘时快时慢的解决方法
    计算机简介
    合并排序
    javascript小结
  • 原文地址:https://www.cnblogs.com/ganqiyin/p/2494000.html
Copyright © 2011-2022 走看看