zoukankan      html  css  js  c++  java
  • 【SQL Server】 数据定义语言(定义基本表、完整性约束实现、索引)

    一:定义基本表和完整性约束的实现

    1、使用CREATE  TABLE 语句,用户可以创建一个表结构,还可以为某个域设定缺省值。
       定义基本表
           CREATE TABLE <表名>
              ( <列名><数据类型> [列级完整性约束条件] 
                  [ ,<列名><数据类型> [列级完整性约束条件]...]
                  [ ,<表级完整性约束条件>]   );
       语法说明:
         表名:所要定义的基本表的名字。
         列名:表由一个或多个属性(列)组成。建表时通常需要定义列信息及每列所使用的数据类型,列名在表内必须为唯一的,一个表至少包  含一个列。
         数据类型:定义表的各个列(属性)时需指明其数据类型和长度,不同的数据库管理系统支持的数据类型不完全相同,应根据实际使用 的DBMS来确定。
         列级完整性约束条件:只应用到一个列的完整性约束条件
         表级完整性约束条件:应用到多个列的完整性约束条件。
    2、语句
    --建立学生表student
     create table student
     (
        sno char(5) primary key,  /*设置主键*/
        sname char(20),           /*sname取唯一值*/
        ssex char(2),
        sage smallint,    /*smallint:4字节整数/2字节整数,8字节/4字节,存放货币类型,值为-2^63~2^63-1*/
        sdept char(15)
     )
    【在student表中,学号属性的列级完整性约束条件限制该列数据值不能为空(null),并且其值具有唯一性。该完整性约束是由RDBMS内部定义,性别属性的完整性约束由用户自己定义约束表达式,并对该约束命名为ssex。
        该题目描述的约束实际上可以在建立表的过程中直接实现,具体语法如下:
         create table student
        (
         sno char(5) not null unique,
         sname char(20),
         ssex char(2),
         sage smallint default 20,
         sdept char(15),
         constraint ssex  check( ssex in (‘男’,’女’))
         )】
     
     --查询student表
     select * from student
     
     --建立课程表course
     create table course
     (
        cno char(4) primary key,
        cname char(20),
        cpno char(4) foreign key references course(cno),   /*cpno(先修课)是外码,被参照表是course,被参照列是cno*/
       【 或者  cpno char(4),
                foreign key (cpno) references  course(cno)】
        ccredit smallint
     )
     
     select * from course
     
     --建立学生选课表1 sc
     create table sc
     (
       sno char(5),
       cno char(4),
       grade smallint,
       primary key(sno,cno)     /* 主码由两个属性构成,必须作为表级完整性进行定义*/
       foreign key (sno) references student(sno),   /* 表级完整性约束条件,Sno是外码,被参照表是Student */
       foreign key (cno) references course(cno)      /* 表级完整性约束条件, Cno是外码,被参照表是Course */ 
     )
     
     select * from sc
     
     --建立学生选课表2  sc2
     create table sc2
     (
        sno char(5),
        cno char(4),
        grade smallint,
        primary key(sno,cno),
        foreign key(sno) references student(sno),
        foreign key(cno) references course(cno)
     )
     select * from sc2
     <1>上述中建立的student表中,其中学号属性为主键(primary key),该完整性约束由用户自己定义约束名为PK_sno。实现语句如下:
           alter table student
              add constraint PK_sno primary key(sno)
      <2>建立的course表中,其中课程号属性为主键(primary key),该完整性约束由用户自己定义约束名为PK_cno,先修课号(cpno)必需是存在的课程号或者为空,所以可以建成外键约束,
    该完整性约束由用户自己定义约束名为FK_cpno。具体实现语句为:
    alter table course add constraint PK_cno primary key(cno), constraint PK_cpno foreign key(cpno) references course(cno) <3>建立的sc表上,(sno,cno)联合做主键。sno和cno单独做外键。如果建立表的过程中student表sno列已经建成主键,course表的cno已经建成主键则可以通过下列语句直接建表时实现
    题目要求。
    create table sc ( sno char(5) foreign key references student(sno), cno char(3) foreign key references course(cno), grade int, constraint PK_sc primary key (sno,cno) ) 如果sc表已经建立,可以通过下面语句实现题目要求: alter table sc add constraint PK_sc primary key (sno,cno) , constraint FK_sno foreign key(sno), references student(sno),constraint PK_cno roreign key(cno) references cource(cno) 需要保证Student(Sno)和Course(Cno)已经建成主键。】 --向student中添加列(stept)时,不用column alter table student add sdept1 char(20) --在student表中增加入学时间 alter table student add s_entrance datetime /*datetime为日期类型*/ --修改student表中的sage数据类型 alter table student alter column sage int --在course表中增加unique约束 alter table course add constraint c_cname unique(cname) --删除course表中的uniqu约束 alter table course drop constraint c_cname --向student表中插入一条数据 insert into student(sno,sname,ssex)values('2012','小一','') --向student表的sdept属性加 not null 约束 delete from student alter table student alter column sdept char(20) not null --增加default(默认)约束 alter table student add constraint c_sage default 20 for sage --check(核对) alter table student add constraint c_sstep check(ssex in('','')) insert into student(sno,sname,ssex)values('20121','小二','') insert into student(sno,sname)values('20100','小三') select * from student --在student中,sno属性为主键(primary key),该完整性约束由用户自己定义约束名为PK_sno.实现语句如下: alter table student alter column sno char(10) not null alter table student add constraint PK_sno primary key(sno)

    二:索引 

    1、概念
        索引是以表列为基础的数据库对象,它保存着表中排序的索引列,并且记录了索引列在数据表中的物理存储位置,实现了表中数据的逻辑排序,其主要目的是提高数据库管理系统的性能,加快
    数据的查询速度和减少系统的响应时间。
    2、作用 表的索引就是表中数据的目录。索引是建立在表上的,不能单独存在,如果删除表,则表上的索引将随之消失。 不使用索引,就需将数据文件分块,逐个读到内存中进行查找的比较操作。如果使用索引,则扫描索引文件,根据索引项找到元组的地址,然后再根据地址找到数据,由于索引文件很小,而且
    索引有顺序,可以极大地提高查询的速度。
    3、索引类型 (1)聚集索引聚簇索引是指数据表的物理顺序和索引表的顺序相同,它根据表中的一列或多列的值对表的物理数据页中的数据进行排序,然后再重新存储到磁盘上。每一个表只能有一个聚簇
    索引,因为一个表的记录只能以一种物理顺序存放,在通常情况下,使用的都是聚簇索引。 (2)非聚集索引,表的物理顺序与索引顺序不同,即表的数据并不是按照索引列排序的。索引是有序的,而表中的数据是无序的。一个表可以同时存在聚簇索引和非聚簇索引,而且一个表可以
    有多个非聚簇索引。 (3)唯一索引,唯一索引不允许两行具有相同的索引值。例如,如果在表中的“姓名”字段上建立了唯一索引,则以后输入的姓名将不能同名。
    4、建立索引原则 在最经常查询的列上建立聚簇索引以提高查询效率; 经常更新的列不宜建立聚簇索引; 大表应当建索引,小表不必建索引,不宜建较多索引; 根据查询要求建立索引。对于一些查询频度高,实时性高的数据一定要建立索引; 主键列默认自动建立聚簇索引; 很少在查询中被引用的列不要建立索引; 包含较少的唯一值的列不要建立索引。 5、 <1>建立索引 语句格式: CREATE [UNIQUE] [CLUSTERED] INDEX <索引名> ON <表名>(<列名>[<次序>][,<列名>[<次序>] ]…); 用<表名>指定要建索引的基本表名字 索引可以建立在该表的一列或多列上,各列名之间用逗号分隔 用<次序>指定索引值的排列次序,升序:ASC,降序:DESC。缺省值:ASC UNIQUE表明此索引的每一个索引值只对应唯一的数据记录 1唯一值索引对于已含重复值的属性列不能建UNIQUE索引,对某个列建立UNIQUE索引后,插入新记录时DBMS会自动检查新记录在该列上是否取了重复值,这相当于增加了一个UNIQUE约束。
    --为学生-课程数据库中的student,course,sc三个表建立索引。其中student表按学号升序建唯一索引,course表按课程号升序建唯一索引,sc表按学号升序和课程号降序建唯一索引。 
          create unique index stusno on student(sno),
          create unique index coucno on course(cno),
          create unique index scno on sc(sno ASC,cno DESC)  
        
        (2)聚簇索引,cluster表示要建立的索引是聚簇索引,建立聚簇索引后,基表中数据也需要按指定的聚簇属性值的升序或降序存放,也即聚簇索引的索引项顺序与表中记录的物理顺序一致。
       --在student表的姓名列上建立聚族索引
          create cluster index stusame on student(sname)
          在一个基本表上最多只能建立一个聚簇索引。聚簇索引的用途:对于某些类型的查询,可以提高查询效率;聚簇索引的适用范围:很少对基表进行增删操作、很少对其中的变长列进行修改操作。
       <2>删除索引
             DROP INDEX <索引名>
         索引一经建立,就由系统使用和维护它,不需用户干预。建立索引是为了减少查询操作的时间,但如果数据增删改频繁,系统会花费许多时间来维护索引。这时,可以删除一些不必要的索引。删除索引时,系统会同时从数据字典中删去有关该索引的描述。
    --删除student表的stusname索引
           drop index stusname

      --后记:我喜欢逻辑、系统性的学习知识,以上是我为自己总结的最基础、简单的SQL,分享下,也虚心接受各位的指教喽!@_@

  • 相关阅读:
    同余方程
    倒酒
    机器翻译
    vue 锚点定位
    解决vuex刷新页面数据丢失
    h5 input失去焦点软键盘把页面顶起
    js 监听ios手机键盘弹起和收起的事件
    js 将数组中的每一项安装奇偶重新组合成一个数组对象
    moment.js获取本周本月本年的开始日期和结束日期
    vue 所有的路由跳转加一个统一参数
  • 原文地址:https://www.cnblogs.com/kefira/p/SqlSever.html
Copyright © 2011-2022 走看看