db2 表、视图、索引

时间:2022-10-09 11:00:56

一、表

1、概述

所有数据都存储在数据库的表中,表由不同数据类型的一列或多列做成
数据存储在行(或称为记录)中
表使用create teble语句定义的

2、创建表

create table employee(
id INTEGER,
name VARCHAR(10),
gender CHAR(10)
)
db2 describe table employee

创建与另一张表结构相同的表
create table employee1 like employee
db2 describe table employee1

表存储在数据库的表空间中,表空间为表的存储提供物理空间
在创建表之前必须先创建表空间
在创建表时,表放在默认的表空间中,也可以指定表存储在特定的表空间中
db2 list tablespaces
create table employee2(id integer) in userspace1
db2 "select tabname,tbspace from syscat.tables where tabname='employee2'"

3、修改表

修改表结构或者列中的数据类型可以使用alter table语句

为表添加新的一列
alter table employee add depart_id integer
db2 describe table employee
修改表某列的数据类型
alter table employee alter name set data type varchar(20) alter gender set not null
db2 describe table employee

4、删除表

删除表使用drop table语句
表从数据库中删除后,表中的数据和表定义都被删除,如果为表定义了索引或者约束,也会同时被删除
drop table employee

5、约束

DB2可以限制存储在列中的数据的属性,这些特性被称为约束(constraint)或规则(rule)
数据库管理器就会强制一到多个列遵守这些约束
db2提供了三种类型的约束
-惟一性约束、参照完整性约束和表检查约束

惟一性约束用于确保列中的值是唯一的,可以针对一个或多个列定义唯一性约束
惟一性约束中包括的每个列都必须定义为NOT NULL
惟一性约束可以定义为PRIMARY KEY或UNIQUE约束,这些可以在创建表时作为create table sql语句的一部分定义
或者在创建表后使用alter table语句添加

二、视图

1、概述

视图允许不同的用户或应用程序以不同的方式查看同一张表中的数据
对于用户来说,视图看起来就像表一样。除视图定义外,视图在数据库内并不占用空间,视图中显示的数据来自另一个表。
可以根据现有的一个表(或多个表)、另一个视图或者表和视图的任意组合创建一个视图
在另一个视图的基础上定义的视图被称为嵌套视图

2、创建视图

创建视图可以使用create view语句,select语句用于指定将在视图中显示的哪些行与列
create view_common as select emp_id,name,gender from employee
create view_manager as select * from employee

3、删除视图

删除视图可以使用drop view语句
如果删除一个视图所基于的表或另一个视图。那么这个视图依然在数据库中被定义,但不会起作用
syscat.views的valid列表明视图是有效的('Y')还是无效的('X'
select viewname,valid from syscat.views where viewname='VIEW_MANAGER'
即使重新创建基表,无效的视图仍然是无效的,必须也重新创建它

4、修改视图

视图不能修改,要更改视图定义,必须删除视图,然后重新创建它
DB2提供的alter view语句只用于修改引用类型

5、只读视图和可更新视图

在创建一个视图时。可以将它定义为只读视图或者可更新视图
视图的select语句决定视图是只读还是可以更新的,一般情况下,如果视图中的行可以映射到基表中的行,那么该视图就是可更新的
例如,前面示例中定义的view_common和view_manager视图就是可以更新的
创建可更新视图的规则很复杂,它们取决于查询的定义,例如,使用values、distinct或jion特性的视图是不可更新的
通过查看syscat.views的readonly列很容易就能确定视图是不是可更新的,Y表示只读,N表示非只读

三、索引

1、概述

索引是表的一个或多个列的键值的有序列表
如果没有索引:
--对表添加数据时,该数据将被追加到表的最后,不存在固有的数据顺序,搜索特定数据行时,必须检查从第一行到最后一行的所有行
创建索引的原因有两个:
--确保一个或多个列中值的惟一性
--提高表查询的性能,DB2优化器使用索引提高执行查询时的性能,或者以索引的顺序显示查询结果

2、索引定义

索引可以定义为惟一的或非惟一的
--非惟一的索引允许重复的键值
--惟一的索引只允许一个键值在列表中出现一次,惟一的索引允许出现单个空值,然而,第二个空值会导致重复现象,因此不允许
创建索引可以使用create index语句
为表中的列指定primary key或unique约束,会隐式地创建索引
索引可以创建为升序、降序或双向,选择哪个选项取决于应用程序如何访问数据

例:
create index iemployee on employee(id)
create index iemployee2 on employee(id desc,name asc)
升序索引利于min列函数的结果,降序索引利于max列函数的结果
如果应用程序还需要数据按与索引相反的顺序排序,那么DB2允许创建双向索引
create index iemployee3 on employee(id) allow reverse scans

在创建索引时,可以选择包含额外的列数据,这些额外的列数据将于键存储在一起,但实际上它们不是键本身的一部分,所以不被排序
在索引中包含额外列的主要原因是为了提高某些查询的性能,因为索引页面中已经提供了数据值,
DB2就不需要访问数据页面,只能为惟一索引定义包含的列
select id,name from employee order by id
create unique index iemployeeid on employee(id) include(name)

创建一个索引花费的时间比较长,DB2必须读取每一行来提取键,对这些键进行排序,然后将键值列表写到数据库中
如果表比较大,那么将使用临时表空间对键进行排序
索引存储在表空间中,如果表驻留在数据库管理的表空间中,就可以选择将索引放在不同的表空间中
在创建表时,可以使用indexes in语句指定索引放置的表空间
索引是值的额外副本,所以当表中的数据被更新时,他们也必须被更新,如果表数据经常被更新,就要考虑额外的索引会对更新性能产生什么样的影响

3、索引的分类

--惟一索引和非惟一索引
--集群索引和非集群索引
--分区索引和非分区索引
--双向索引
--基于表达式的索引