SQL-Server数据库学习笔记-表

1. 表及其属性

表(Table):也称实体,是存储同类型数据的集合。

列(Field):也称字段、域或属性,它构成表的架构,具体表示为一条信息中的一个属性。

行(Row):也称元组(Tuple),存储具体的条数据。

码(Key):也称主键,就像人的身份证号码,是一个独一无二的字符,代表当前这条数据的标识。

外键(FK):这就是关系,代表一条信息与其他信息之间的关联。

2. 表的特点

    表在数据库中体现是一张由行和列组成的二维表格。行在很多时候也称记录,列则成为字段或者域。

    表中的每一个字段都对应一个实体的描述。没有多余的,也不能方多余的字段进去。当然这句话也不绝对,有时候考虑到系统的二次开发或者系统需求改变,也可能会特意留下一两个备用字段。

    在表中,每一行数据的顺序是可以随意变换的,一般都是按照插入数据的先后顺序排列。也可以按照索引对数据进行排序,总之,这里的数据行排列不影响以后编程过程中的排序。

    但是行之间的数据也精良不要重复,这个是由主键控制的,因为主键规定了在一张表中不允许重复。

    如同行的顺序一样,列的顺序也是可以随意排列的,用户最多可以为一张表定义1024个列。在同一张表中,列名必须唯一,多张表之间则不受此限制。每一列必须在定义的时候同时定义数据类型。这些都是由SQL Server系统来控制得。

    在同一数据库中,表名不允许重复。这是默认情况,如果你一定要重复也不是没有办法,新建一个架构,然后让两张同名的数据表在不同的架构下面就行了。默认表都在dbo架构下。

3. 表的类型

    在SQL Server2008中,按照表的作用,可以将表分为以下4中类型。

    1)普通表

    普通表又称为标准表,就是通常用来在数据库中存储数据的表,是最常用的对象,也是最进本、最重要的表。所以我们日常所说的表大多值普通表,而其他表都有自己的特殊用途。

    2)分区表

    分区表将数据水平划分为多个单元的表,这些单元可以分布到数据库中的多个文件组中,实现对单元中数据的并行访问。若表的数据量非常庞大,并且这些数据经常被以不同的方式访问,则可以考虑建立分区表。简言之,分区表主要用于方便地管理大型表,提高对这些表中数据的使用率。

    3)临时表

    临时表顾名思义,临时表就是被临时创建,不能永久保存的表。临时表又分为本地临时表和全局临时表。临时表被创建之后如果不主动删除的话会一直存在到SQL Server实例断开连接为止。另外一个区别在于本地临时表支队创建者可见,而全局临时表则对所有用户和连接可见。

    4)系统表

    系统表的作用就显而易见了,主要用于存储有关SQL Server服务器的配置,数据库的设置,用户、架构等信息。一般只能由数据库管理员(DBA)来使用。

4. 创建和修改表

    1)创建普通表

最简单的创建表语法如下:

CREATE TABL 表名
(
    列    数据类型    约束或者默认值,
    列    数据类型    约束或者默认值,
    ………
)

    2)创建临时表

    创建临时表非常简单。前面说临时表分为本地临时表和全局临时表,和创建普通表唯一的区别在于多家了“#”号,本地临时表加了一个“#”号,如#Student。全局临时表加了两个“#”号,如##Student。

演示创建临时表的方法-利用查询创建表:

select ID,STOCK into #order from orders
go
select *from #order
go

    注意:尽量不要使用临时表,除非你必须这样做.一般使用子查询可以代替临时表。使用临时表会带来系统开销,如果你是用COM+进行编程,它还会给你带来很大的麻烦,因为COM+使用数据库连接池而临时表却自始至终都存在,前面已经提到过,除非手动删除,否则临时表将一直存在到断开连接为止。SQL Server提供了一些替代方案,比如Table数据类型。

    3)创建分区表

什么是分区?为了改善大型表以及具有各种访问模式的表的可伸缩性和可管理性。

为什么要使用分区?通常,创建表是为了存储某种实体(例如客户或销售)的信息,并且每个表只具有描述该实体的属性信息。一个表对应一个实体是最容易设计和理解的,因此不需要优化这种表的性能、可伸缩性和可管理性,尤其是在表不是特别大的情况下。那么到底怎样才称为是大型表呢?超大型数据库(VLDB)的大小以数百GB计算,甚至以TB计算,但这个术语不一定能够反映数据库中各个表的大小。大型数据库是指无法按照预期方式运行的数据库,或者运行成本或维护成本超出预定维护要求或预算要求的数据库。这些要求也适用于表,如果其他用户的活动或维护操作限制了数据的可用性,则可以认为表非常大。例如,如果性能严重下降,或者每天、每周甚至每个月的维护期间有两个小时无法访问数据,则可以认为表非常大。有这些情况下,周期性的停机时间是可以接受的,但是通过更好的设计和分区实现,通常是可以避免或最大限度地减少这种情况的发生的。

除了大小之外,当表中的不同行集拥有不同的使用模式时,具有不同访问模式的表也可能会影响性能和可用性。尽管使用模式并非总是在变化(这也不是进行分区的必要条件),但在使用模式发生变化时,通过分区可以进一步改善挂历、性能和可用性。还以销售表为例,当前月份的数据可能是可读可写的,但以往月份的数据(通常占表数据的大部分)是制度的。在数据使用发生变化类似的情况下,或在维护成本随着在表中读写数据的次数增加而变得异常庞大的情况下,表响应用户请求的能力可能会受到影响。相应地,这也限制了服务器的可用性和可伸缩性。

此外,如果以不同的方式使用大量数据集,则需要经常对静态数据执行维护操作。这可能造成代价高昂的结果,例如性能问题、阻塞问题、备份(空间、时间和运营成本),还可能会对服务器的整体可伸缩性产生负面影响。

分区可以带来什么帮助?当表和索引变得非常大时,分区可以将数据分为更小、更容易管理的部分,从而提供一定的帮助。

此外,如果具有多个CPU的系统中存在一个大型表,则对该表进行分区可以通过并行操作获得更好的性能。通过对各个并行子集执行多项操作,可以改善在极大型数据集(例如数百万行)中执行大规模操作的性能。通过分区改善性能的例子可以从以前版本中的聚集看出。例如,除了聚集成一个大型表外,SQL Server还可以分别处理各个分区,然后将各个分区的聚集结果再聚集起来。在SQL Server2008中,连接大型数据集的查询可以通过分区直接受益;SQL Server2008中,已分区为相同分区键和相同分区函数的相关表(如Order和OrderDetails表)被称为已对齐。当优化程序检测到两个分区切已对齐的表连接在一起时,SQL Server2008可以先将统一分区中的数据连接起来,然后再将结果合并起来。这使得SQL Server2008可以更有效地使用具有多个CPU的计算机。

3)增加和删除列

ALTER TABLE 表名    --向表中添加列
ADD
列名1 数据类型 是否可空,
列名2 数据类型 是否可空
ALTER TABLE 表名
DROP COLUMN
列名1,列名2
EXEC sp_help 表名   --查看表信息

4)修改列

sp_rename '表名.列名','新列名'    --修改列名

 

4)约束

约束就是为了保证数据的完整性。

数据库三大约束:实体完整性(主键),参照完整性(外键),用户定义完整性

ALTER TABLE 表名    --添加主键方式之一(记得原先有主键的话要先删除在执行)
ADD 
CONSTRAINT 主键名 PRIMARY KEY(l列名)
CREATE TABLE 表名    
(
    外键列名 数据类型 REFERENCES 表名(主键名)    --指定外键关联(方式1)
    --方式2采用constraint关键字创建外键约束
   CONSTRAINT 外键约束名称 FOREIGN KEY (外键列名) REFERENCES 主表名(id)
)
ALTER TABLE 表名    --默认约束
ADD CONSTRAINT default_name DEFAULT '默认值' FOR 列名
--UNIQUE约束指定表中某一列或多个列不能有相同的两行或者两行以上的数据存在
CREATE TABLE 表名
(
    列名 数据类型 UNIQUE --方式1
    CONSTRAINT  约束名称 UNIQUE(列1,列2) --方式2
)
--关闭约束检测
NOCHECK CONSTRAINT 约束名
NOCHECK CONSTRAINT ALL
--开启约束检测
CHECK CONSTRAINT 约束名
CHECK CONSTRAINT ALL