1:创建数据库
CREATE DATABASE sam_1 AUTOMATIC STORAGE YES ON '/home/db2inst1/db2data' USING CODESET UTF-8 TERRITORY CN;
2:启动数据库
db2start
3:关闭数据库
db2stop
4:连接数据库
CONNECT TO sam_1 USER db2inst1 USING pwd;
5:断开数据库
DISCONNECT sam_1
6:查询某个实例下的所有数据库
list db directory
7:创建表空间
create tablespace <tablespace_name> pagesize <4k或8k或16k或32k>
8:查看数据库中存在的表空间
list tablespaces
9:查看表空间详细信息
list tablespaces show detail
10:查看表空间对应的容器信息
list tablespace containers for <tablespace_id>
11:在表空间中创建表
create table <table_name>(字段1 类型 状态,字段2类型 状态。。。) in <tablespace_name>
12:DB2支持的数据类型
» Data Types
» Numeric
» Integer
» SMALLINT -32768~32767(精度为5的两字节的整型)
» INTEGER -2147483648~2147483647(精度为10的4字节的整型)
» BIGINT -9223372036854775808~9223372036854775807(精度为19的8字节整型)
» DECIMAL
» DECIMAL (小数点的位置是由该DECIMAL数的精度和规模决定,规模是该数的小数部分个数,其不能为负数和大于精度;最大精度为31)
» FloatingPoint
» REAL -3.402E+38~-1.175E-37或10175E-37~3.402E+38(单精度浮点数是一个实数的32位近似值)
» DOUBLE/FLOAT (双精度浮点数是一个实数的64位近似值)
» String
» CharacterString
» SingleByte
» CHAR (字符串的长度是有序字节数;长度已分配好就固定了,其长度从1~254)
» VARCHAR (32672字节长)
» LONGVARCHAR (32700字节长)
» CLOB 2G字节长(2147483647字节长)
» DoubleByte
» GRAPHIC
» VARGRAPHIC
» LONGVARGRAPHIC
» DBCLOB
» BinaryString
» BLOB
» Datetime
» DATE
» TIME
» TIMESTAMP
» XML
13:在DB2数据库中如何将整型转换为字符型
在DB2中可以用函数char()来转换。
14:修改表结构,删除表
增加一列
alter table <table_name> add <字段><类型> <状态>
修改一列
alter table <table_name>alter COLUMN <字段> set data type <类型> <状态>
删除一列
alter table <table_name>drop COLUMN <字段>
删除表
drop table <table_name>
注:对表进行任何操作都不被允许,提示SQLSTATE=57016 SQLCODE=-668 ,原因码 "7"的错误:SQL0668N Operation not allowed for reason code "7" on table XXX.
解决方法为:执行命令:reorg table XXX;即可。
15:向表中添加数据
根据字段插入数据
insert into <table_name>(字段1,字段2,字段3…) values(value1,value2,value3…)
插入整张表的数据
insert into <table_name> values(value1,value2,value3…)
16:查询表中数据
查询表中所有数据
select * from <table_name>
根据条件查询
select * from <table_name>where 字段名=‘条件‘
例:select * from test_table where name=’zhangsan’
注:条件要是某一字段所包含的完整信息。
模糊查询
select * from <table_name>where 字段名=‘%%’
例:select * from test_table where name=’zhang’
注:模糊查询的条件,只要写明某一字段所包含内容的部分信息。
查询表中前10条记录
select * from <table_name>fetch friest 10 rows only
查询表中的某一字段
select 字段名 from <table_name>
对查询结果排序(asc升序,desc降序)
select * from class order by<asc或desc>
整型,日期类型的字段可以制定范围,用between
select * from <table_name>where born between ‘2009-05-04’and ‘2010-0608’
17:更新表中数据
update <table_name> set 字段名=‘新内容‘ where字段名=’条件‘
18:删除表中数据
删除表中所有数据
delete from <table_name>
根据条件删除表中的信息
delete from <table_name> where 字段名=‘条件‘
19:显示当前用户所有表
list tables
20:显示系统中所有表
list tables for system
21:查询表的结构信息
describe table <table_name>
22:查看表的详细信息
select * from syscat.tables where tabname=’<table_name>’
23:查看表的约束
select * from syscat.checkd wheretabname=<table_name>
24:查看表的引用完整约束
select * from syscat.referenecs where tabname=<tb_name>
25:索引(用于在查询数据时,加快查询速度)
创建唯一索引
create UNIQUE index <index_name> on <table_name>(字段)
注:在某个字段上创建唯一索引,即插入时,该字段不能重复。
删除索引
drop index <index_name>
26:索引使用技巧与数据库性能调优
查询语句中,对于字符串型的字段,一定要用单引号括起来,对于整型不要用引号,对于日期型的字段,目前暂无定论,是否会对性能有影响.可进一步跟踪。
尽量不要用in子句,那样的话无法使用索引,导致查询效率低下,可以改用UNION来连接多个查询.这样可以提高效率。
多个查询条件,应该将过滤多的带索引的字段的条件放在前面。
查询条件中尽量用等号,不要用大于,小于等,那样可能会用不上索引。
在全部查询出所有结果时,要求带上条件1=1,可以避免使用索引,提高效率。
27:创建视图,删除与使用
» 创建
» create view <view_name> as select <字段> from <table_name>
» 使用
» select * from <view_name>
» 删除
» drop view <view_name>
28:创建存储过程,删除与使用
» 创建存储过程
» CREATE PROCEDURE get_avage_age
--在存储过程中设置变量
@class_namechar(10),
@CheckDate[datetime]
AS
BEGIN
--在存储过程中添加方法
Select age fromstudent where class=@class_name and born<@CheckDate
END
» 执行存储过程
» DECLARE@return_value int
EXEC @return_value=get_avage_age
@class_name =’gaosan’
@CheckDate = ‘2009-01-01’
SELECT ‘Return Value’= @return_value
GO
» 删除存储过程
» Drop procedure get_avage_age
29:创建触发器,使用触发器,修改触发器,删除触发器
» CREATE TRIGGER trigger_1
ON class
AFTER DELETE
AS
BEGIN
--在触发器中创建方法
Delete from student where student.class not in (selectclass from class)
END
» 注:此触发器的功能是:当class表有删除操作时,同步student表中的记录,将不存在的班级的记录全部删除。
» 使用触发器
» 先要去掉class表中的约束
»alter table student drop CONSTRAINT FK_CLASS
» 根据条件查询student和class表。
»select * from student where class=’chuyi’
» select * from class where class=’chuyi’
» 根据条件删除class表中的信息。
»delete from class where class=’chuyi’
» 执行触发器之后,再次根据条件查询student和class表中的信息。
»select * from student where class=’chuyi’
»select * from class where class=’chuyi’
» 现在可以看到student表中的记录也被更新了。
» 修改触发器
» ALTER TRIGGER trigger_1
ON class
AS
BEGIN
Delect from student where student.class not in (selectclass from class)
END
» 删除触发器
» Drop trigger trigger_1
30:约束
» 约束是在修改一个表,或增加一个表记录时,规定表的各个字段之间必须满足的关系。
» ALTER TABLE student ADD CONSTRAINT age_negativeCHECK (student.age >= 0)
» 约束是表结构的一部分内容,此例的约束是检查年龄字段不要为负值。
» update student set age=-1 //将会报错
» 删除一个约束:
» alter table student dropconstraint age_negative
31:主键,外键
» 主键
» 表通常具有包含唯一标识表中每一行的值的一列或一组列。这样的一列或多列称为表的主键 (PK),用于强制表的实体完整性。在创建或修改表时,您可以通过定义 PRIMARYKEY 约束来创建主键。
» 一个表只能有一个 PRIMARY KEY 约束,并且 PRIMARY KEY 约束中的列不能接受空值。由于 PRIMARY KEY 约束可保证数据的唯一性,因此经常对标识列定义这种约束。
» create table test_table(number int DEFAULT 23PRIMARY KEY),name varchar(25) not null DEFAILT ‘abc’
» 先将原来主键删除,再建联合主键
» alter table test_table ADD CONSTRAINTconstraint_1 PRIMARY KEY(number,name) 在两个字段上建立联合主键
» 外键
» 外键 (FK) 是用于建立和加强两个表数据之间的链接的一列或多列。当创建或修改表时可通过定义FOREIGN KEY 约束来创建外键。
» 在外键引用中,当一个表的列被引用作为另一个表的主键值的列时,就在两表之间创建了链接。这个列就成为第二个表的外键。
» ALTER TABLE student ADD CONSTRAINT FK_classFOREIGN KEY(class) REFERENCES class(class)
» 删除外键
»alter table student dropCONSTRAINT FK_CLASS
» 建立外键时,要注意几点:外键在外表中要是主键或索引. 两个表的此字段名称最好一样.其他注意事项,项目参考相关数据库的联机帮助文档.例如:外键在外表中重新生成,或重新组织后,或外键的索引被删除后,引起的后果.需要仔细调试
32:事务
» 一个完整的事务就是其中的每个操作要么都完成,要么都不做.回到事务开始前的状态。
» begin TRANSACTION
» ALTER INDEX idx_class on class REBUILD
» select * from class
» dbcommit TRANSACTION
» 需要注意的是,不同的数据库,事务的开始,结束语法可能不一样.例如:在informix中是:begin work和commit。
33:锁
» 常见的情况是:分为表锁和行锁
» 加锁与解锁
» 排它锁(独占锁)与共享锁
» 锁加在一个事务中读取或修改的行,以防止各种事务并发使用资源。例,如果一个排它锁被一个事务加在某一表的某一行上,在这个锁被释放前,其他事务都不可修改这一行。
» 在事务内加锁。
»SET TRANSACTION ISOLATION LEVELREPEATABLE REAO
» BEGIN TRANSACTION
» select * from student with (rowlock) where id=1waitfor delay ’00:00:10’
» COMMIT TRANSACTION
» select * from student with (rowlock)where id=1
» update student set name=’efgh’ whereid=1
» 运行结果显示:两次查询的内容将会不同。而更新语句会等到事务结束时,才会得到提交。
» update student set name=’efgh’where id=4:此条更新语句会立即得到执行,因为被锁的行不是id=4的记录。
» 如果rowlock换成TABLOCK或HOLDLOCK,则第二条语句也会等待。TABLOCKX:是排它锁。
34:导出数据
» export to <文件名.类型> of <文件类型> select * from <table_name>
35:导入数据
» import from <文件名.类型> of <文件类型> insert into <table_name>
36:执行sql脚本
db2 -tvf <路径/文件名>