zoukankan      html  css  js  c++  java
  • sql基础

    7  管理表

    教学目标

    l   理解表的特点、类型和创建表时需要考虑的因素

    l   熟练掌握创建和修改表技术

    l   不仅要理解标识符列的作用、特点和类型

    l   理解已分区表的特点和作用

    7.1  概述

    7.1.1 表的特点

    l   定义:

    表是用来组织和存储数据、具有行列结构的数据库对象。

    l   特点:

      代表实体,有唯一的名字

      由行和列组成

      行和列的顺序是不重要的

    Student:

     


     

    7.1.2 表的类型

    表分为4种类型,即普通表、已分区表、临时表和系统表。

    7.1.3 设计表时应该考虑的因素

    l     因素一,该表将要存储的数据对象,并且绘制出ER图。

    l     因素二,表中将要包含的列,这些列的数据类型、精度等属性是什么?

    l     因素三,哪些列允许空值,哪些列不允许空值?

    l     因素四,是否使用主键,在何处使用主键?

    l     因素五,是否使用约束、默认值、规则,以及在何处使用这些对象?

    l     因素六,是否使用外键,在何处使用外键?

    l     因素七,是否使用索引,在何处使用索引,使用什么样的索引?

    7.2               创建和修改表

     

     

    介绍:学校管理数据库

    Student:学生表

    列名

    类型

    特征

    备注

    sno

    Char(10)

    主键

    学号

     

     

     

     

    Class:班级表

    列名

    类型

    特征

    备注

    clsno

    Char(10)

    主键

    班级编号

     

     

     

     

     

    teacher:教师表

    列名

    类型

    特征

    备注

    tno

    Char(10)

    主键

    教师编号

     

     

     

     

    course:课程表

    列名

    类型

    特征

    备注

    cno

    Char(10)

    主键

    课程编号

     

     

     

     

    Score:成绩表

    列名

    类型

    特征

    备注

    Id

     

     

    编号

    sno

     

    外键

    学号

    Cno

     

    外键

    课程号

    score

     

     

    成绩

    Mk_score

     

     

    补考成绩

     

    Tcc:授课表

    列名

    类型

    特征

    备注

    Id

    int

    主键

    编号

    date

     

     

    时间

    tno

     

    外键

    教师编号

    clsno

     

    外键

    班级编号

    cno

     

    外键

    课程编号

    value

     

     

    评价

     

     

     

     

     

     

    7.2.1创建表

     

     

     

     

    l   1 MS中完成student表的创建。

     

     

     

     

     

     

     

     

     

     

    l   2 使用CREATE TABLE语句创建表。

    l   语法:

    create table 表名

    (

    列名1 类型  约束 ,

    列名2 类型  约束 ,

    列名3 类型  约束 ,

    列名n 类型  约束

    )

     

    --教师表

    if exists(select name from sysobjects

    where name='teacher' and type='u')

    drop table teacher

    --teacher

    create table teacher

    (

    tno char(10) primary key ,--教师编号

    tname varchar(20) not null, --教师姓名

    title varchar(20), --职位

    birthdate datetime ,--出生日期

    hirdate datetime ,--受聘日期

    quitdate datetime,--离职时间

    uptno char(10) ,--上级领导

    gender char(2),---性别

    photo image,--照片

    notes ntext --备注

    )

    --班级表

    if exists(select name from sysobjects

    where name='class' and type='u')

    drop table class

    --class 表格

    create table class

    (

    clsno char(10) primary key,--班级编号

    clsname char(20) ,--班级名称

    credate datetime,--创建日期

    leavedate datetime,--毕业时间

    teacher char(10),--班主任

    clstype varchar(20),--班级类型

    notes  text, --备注

    numbers int --班级人数

    )

    --学生表

    if exists(select name from sysobjects

    where name='student' and type='u')

    drop table student

    --student

    create table student

    (

      sno char(10) primary key ,--学号

      sname varchar(20) not null,--姓名

      idcard char(18) ,--身份证

      gender char(2) ,--性别

      birthdate datetime ,--出生日期

      homeaddress varchar(100),--出生地

      phone varchar(20),--联系电话

      email varchar(50),--电子邮箱

      qq   varchar(10) ,--qq号码

      hoby varchar(20),--爱好

      classid char(10) --班级

    )

    --课程表

    if exists(select name from sysobjects

    where name='course' and type='u')

    drop table course

    --course

    create table course

    (

        cno char(10) primary key,--课程编号

      cname varchar(50) ,--课程名称

        c1_times int ,--理论课时

        c2_times int ,--实践课时

        ctype char(10),--学历课还是技能课

      nots text --备份

    )

    --学生成绩表

    if exists(select name from sysobjects

    where name='score' and type='u')

    drop table score

    create table score

    (

      id int IDENTITY(1,1) NOT NULL,--编号

      sno char(10) ,--学号

      cno char(10),--课程编号

      score decimal(5, 2) ,--成绩

      mk_score decimal (5, 2)补考成绩

    )

    --教师授课表

    if exists(select name from sysobjects

    where name='tcc' and type='u')

    drop table tcc

    create table  tcc (

       id   nchar (10) ,--编号

       date   datetime ,--授课日期

       tno   char (10) ,--教师编号

       clsno   char (10) ,--班级编号

       cno   char (10) ,--课程编号

       evalue   varchar (50) --评价

    )

    --用户表

    CREATE TABLE users--用户表

    (

      id int IDENTITY(1,1) NOT NULL,--用户编号

      username varchar(50) ,--用户名

      password int NULL--密码

    )

     

    创建带有计算列的表格

    (1)           SSMS中完成

    (2)           代码完成

    CREATE TABLE  orders1 (

       ord_id   int  NULL,

       goodsname   varchar (50) ,

       price   money  NULL,

       num   int  NULL,

       total   AS ( price * num ) PERSISTED

    )

    创建自增列的表格

    (1)          SSMS中完成

    (2)          代码完成

    CREATE TABLE  orders2 (

       ord_id   int identity(1,2) not null,

       goodsname   varchar (50) ,

       price   money  NULL,

       num   int  NULL,

       total   AS ( price * num ) PERSISTED

    )

    创建临时表

    临时表的前面以#或者##开头

    (1)          SSMS中完成

    (2)          代码完成

    create table ##test

    (a int ,

     b int

    )

    对于约束的内容查看课本相关章节,后续会介绍。

    7.2.2修改表

    1.增加列

    表创建之后,用户可以根据需要使用ALTER TABLE语句来修改表的结构。

    语法:

    ALTER TABLE 表名

     ADD字段名 数据类型[(长度)][ null| not null] [ default ‘ 默认值’ ] [identity]

    注意:

    1)新增加字段时可以同时设置空值约束、默认值约束和标识列。

    2)表中的列名必须唯一

    3)若不允许为空时则必须给新增加的列指定默认值,否则语句执行错误。

    ALTER TABLE 只允许添加满足下述条件的列: 列可以包含空值;或者列具有指定的DEFAULT 定义;或者要添加的列是标识列或时间戳列;或者,如果前几个条件均未满足,则表必须为空以允许添加此列。不能将列"f"添加到非空表"test"中,因为它不满足上述条件。

    例题1:创建测试表test,包含一个整形列a

    --创建表test

    create table test

    (a int)

    --1)为表test添加新列b,类型为整形,可以为空

    alter table test

    add b int

    --2)为表test添加新列c,类型varchar(20),不允许空

    alter table test

    add c varchar(20) not null

    给表中插入一行数据后再执行此操作:

    insert into test values

    (1,2,'aaa');

    alter table test

    add d varchar(20) not null

    消息4901,级别16,状态1,第1

    出现错误,思考为什么?如何改正?

    alter table test

    add d varchar(20) not null default 'hehe'

     

    --3)为表test添加2ef,都是varchar(20)类型,允许空

    alter table test

    add e varchar(20),f varchar(20)

    --4)添加计算列,g=c+d+e。此处+的含义是字符串连接。

    alter table test

    add g as c+d+e

    --4)添加标识列

    alter table test

    add h int identity(1001,1)

    看下面代码

    alter table test

    add i int identity(1001,1) default 3

    消息1754,级别16,状态0,第1

    不能在具有IDENTITY 属性的列上创建默认值。表'test',列'i'

    消息1750,级别16,状态0,第1

    无法创建约束。请参阅前面的错误消息。

    为什么?

    2.删除列

    语法:

    alter table <表名>

    drop column 字段名 [ , …n ]

    如果要删除的列上建有约束,需要先删除约束

    删除约束的方法:

    1)通过sp_helpconstraint 表名找到要删除约束的名字

    2alter table 表名 drop 约束名

    --(1)删除列

    alter table test

    drop column f

    --(2)删除多列

    alter table test

    drop column d,e

    --(3)删除带有约束列

    alter table test

    drop column d

    消息5074,级别16,状态1,第1

    对象'DF__test__d__239E4DCF' 依赖于列'd'

    消息4922,级别16,状态9,第1

    由于一个或多个对象访问此列,ALTER TABLE DROP COLUMN d 失败

    --先删除d上的默认约束,找到约束名

    sp_helpconstraint test

    注意:约束名随机生成,不同机器名称不同。

     

    --删除约束

    alter table test

    drop DF__test__d__239E4DCF

     --删除列

    alter table test

    drop column d

    7.2.3 修改列

    使用alter column子句可修改字段的数据类型、长度、是否允许为空值等属性。

     

    语法:

     ALTER TABLE 表名

     alter column 字段名 数据类型[(长度)][null|not null]

    --(1)class表中班级名称的长度改为20

    alter table class

    alter column clsname varchar(20)

    --(2)将教师姓名长度改为,并且非空

    alter table teacher

    alter column tname varchar(20) not null

    注意:

    1)如果表中没有数据,对表中列的数据类型的更改是任意的。如果表中包含数据,更改后的类型必须同原类型兼容。

    2)将一个原来允许为空值的列改为不允许为空时,必须保证表中已有记录中该列没有空值。

    3)改变数据类型时,如果原来设置了默认值约束,一般应解除或删除约束后再修改

    --(3)student中简历改名为简介

    语法:

    sp_rename '表名.原列名','新列名'

    sp_rename 'student.简历','简介'

     

    7.2.4 表格重命名

    sp_rename [当前表名],  [新表名]

    sp_rename test,te

    7.2.5 查看表的信息

    --查看表格基本信息

    sp_help 表名

    sp_help student

    --查看表格占用空间信息

    sp_spaceused 表名

    sp_spaceused class

    --查看表格依赖关系

    sp_depends 表名

    sp_depends class

    7.2.6 删除表

    l   删除表就是将表中数据和表的结构从数据库中永久性地去除。表被删除之后,就不能再恢复该表的定义

    或者

    drop table test

    drop table tb

    7.3  已分区表

    l   如果一个表中包含了大量的、以多种不同方式使用的数据,且一般的查询不能按照预期的成本完成,则应该考虑使用已分区表。已分区表是指按照数据水平方式分区,将数据分布于一个数据库的多个不同的文件组中。在对数据进行查询或更新时,这些已分区表将被视为独立的逻辑单元。

    创建分区表的主要步骤

    创建分区表的主要步骤包括

    第一,创建分区函数,指定如何分区;

    第二,创建分区方案,指定分区函数的分区在文件组上的位置;

    第三,创建使用分区方案的表。

     

    l   可以使用CREATE PARTITION FUNCTION语句创建分区函数。

    l   可以使用CREATE PARTITION SCHEME语句创建分区方案。

    7.4  上机实验

    l   sales数据库中创建表下列表:

    1)在sales数据库中通过SSMS创建表departments.(部门表)

    列名

    类型

    是否为空

    说明

    备注

    dno

    Char(6)

    no

    主键

    编号

    dname

    Varchar(20)

    no

     

    部门名称

    dnum

    int

    yes

     

    人数

    locate

    Varchar(20)

    yes

     

    地址

     

    2)在sales数据库中通过SSMS创建表employees.(职工)

    列名

    类型

    是否为空

    说明

    备注

    Eno

    Char(6)

    no

    主键

    编号

    ename

    varChar(8)

    no

     

    姓名

    Sex

    Char(2)

    no

     

    性别

    Id

    Char(18)

    yes

     

    身份证

    deptno

    Char(4)

    yes

    外键

    部门号

    Up_eno

    Char(6)

    yes

    外键

    上级领

    导编号

    Tel

    Varchar(15)

    yes

     

    电话

    Addr

    Varchar(50)

    yes

     

    地址

    3)在sales中使用命令创建表goods(商品)表。

    列名

    类型

    是否为空

    说明

    备注

    Gno

    Char(10)

    no

    主键

    商品编号

    gname

    Varchar(20)

    no

     

    商品名称

    Type

    Varchar(20)

    yes

     

    规格型号

    Unite

    Char(4)

    yes

     

    单位

    avg_price

    money

    yes

     

    平均价格

    Tolal_num

    int

    yes

     

    总库存

    Note

    Varchar(200)

    yes

     

    备注

     

    4)在sales中使用命令创建表customer(客户)表。

    列名

    类型

    是否为空

    说明

    备注

    Cno

    Char(10)

    no

    主键

    编号

    cname

    Varchar(20)

    no

     

    名称

    person

    Varchar(20)

    yes

     

    联系人

    Tel

    Char(20)

    yes

     

    联系电话

    Addr

    Varchar(30)

    yes

     

    地址

    5)在sales中创建instock (进货)表。

    列名

    类型

    是否为空

    说明

    备注

    inno

    int

    no

    主键,自动增加

    编号

    indate

    datetime

    no

     

    进货日期

    gno

    Char(10)

    no

    外键

    商品编号

    price

    money

    yes

     

    进价

    Num

    int

    yes

     

    数量

    T_price

    money

    yes

    计算列

    总金额

    eno

    Char(6)

    yes

    外键

    进货人

    cno

    Char(10)

    yes

    外键

    客户

     

    6)在sales中创建outstock (销售)表。

    列名

    类型

    是否为空

    说明

    备注

    outno

    int

    no

    主键,自动增加

    编号

    outdate

    datetime

    no

     

    销售日期

    gno

    Char(10)

    no

    外键

    商品编号

    price

    money

    yes

     

    售价

    Num

    int

    yes

     

    数量

    T_price

    money

    yes

    计算列

    总金额

    eno

    Char(6)

    yes

    外键

    销售人

    cno

    Char(10)

    yes

    外键

    客户

     

     

    /Files/dajiang02/第7章__管理表.doc

  • 相关阅读:
    数据库多表查询,左连接(入门)
    让弹出层始终显示在屏幕正中间
    jq中的ajax合集总结
    ajax之$.getScript()
    Jquery遮罩ShowLoading组件
    jquery中prop()方法和attr()方法的区别
    Bootstrap 响应式实用工具
    VS使用技巧
    ubuntu下postgreSQL安装配置
    基础设施即代码(Infrastructure as Code)
  • 原文地址:https://www.cnblogs.com/dajiang02/p/1940028.html
Copyright © 2011-2022 走看看