DB2的特性
完全Web使能的:可以利用HTTP来发送询问给服务器。
高度可缩放和可靠:高负荷时可利用多处理器和大内存,可以跨服务器地分布数据库和数据负荷;能够以最小的数据丢失快速地恢复,提供多种备份策略。
DB2数据库启停
启动数据库:db2start
停止数据库:db2stop
检查存在的数据库
LIST DATABASE DIRECTORY
数据库连接、断开
CONNECT TO databasename
CONNECT RESET
创建、删除数据库
CREATE DB databasename
注:如果已经连着一个数据库的话,就创建不了数据库,会报“应用程序已经与一个数据库相连”的错
DROP DB databasename
第二节表
数据类型
可分为数值型(numeric)、字符串型(character string)、图形字符串(graphic string)、二进制字符串型(binary string)或日期时间型(datetime)。还有一种叫做DATALINK的特殊数据类型。DATALINK值包含了对存储在数据库以外的文件的逻辑引用。
数值型数据类型包括:
小整型,SMALLINT:两字节整数,精度为5位。范围从-32,768到32,767。
大整型,INTEGER或INT:四字节整数,精度为10位。范围从-2,147,483,648到2,147,483,647。
巨整型,BIGINT:八字节整数,精度为19位。范围从-9,223,372,036,854,775,808到9,223,372,036,854,775,807。
小数型,DECIMAL(p,s)、DEC(p,s)、NUMBERIC(p,s)或NUM(p,s):小数型的值是一种压缩十进制数,它有一个隐含的小数点。压缩十进制数将以二-十进制编码(binary-coded decimal,BCD)记数法的变体来存储。小数点的位置取决于数字的精度(p)和小数位(s)。小数位是指数字的小数部分的位数,它不可以是负数,也不能大于精度。最大精度是31位。小数型的范围从-10**31+1到10^**31-1。
单精度浮点数,REAL:单精度浮点数是实数的32位近似值。数字可以为零,或者在从-3.402E+38到-1.175E-37或从1.175E-37到3.402E+38的范围内。
双精度浮点数,DOUBLE或FLOAT:双精度浮点数是实数的64位近似值。数字可以为零,或者在从-1.79769E+308到-2.225E-307或从2.225E-307到1.79769E+308的范围内。
字符串包括:
定长字符串,CHARACTER(n)或CHAR(n):长度介于1到254字节之间。如果没有指定长度,那么就认为是1个字节。
变长字符串,VARCHAR(n)、CHARACTER VARYING(n)或CHAR VARYING(n):最长可达32,672字节。LONG VARCHAR最长可达32,700字节。
字符大对象字符串,CLOB(n):最长可以达到2,147,483,647字节
定长图形字符串,GRAPHIC(n):长度介于1到127个双字节字符之间。如果没有指定长度,就认为是1个双字节字符。
变长图形字符串,VARGRAPHIC(n)、LONG VARGRAPHIC:最大长度可达16,336个双字节字符。
双字节字符大对象字符串,DBCLOB(n):最长可达1,073,741,823个字符。用于容纳非传统型的数据,诸如图片、语音或混合媒体等,还可以容纳用户定义的类型及用户定义的函数的结构化数据。
二进制大对象,BLOB(n):二进制大对象是变长字符串,最长可达2,147,483,647字节。
日期时间型数据类型
DATE:DATE是一个由三部分组成的值(年、月和日)。年份部分的范围是从0001到9999。月份部分的范围是从1到12。日部分的范围是从1到n,其中n的值取决于月份。DATE列长10个字节。
TIME:TIME是一个由三部分组成的值(小时、分钟和秒)。小时部分的范围是从0到24。分钟和秒部分的范围都是从0到59。如果小时为24,分钟和秒的值都是0。TIME列长8个字节。
TIMESTAMP:TIMESTAMP是一个由七部分组成的值(年、月、日、小时、分钟、秒和微秒)。年份部分的范围是从0001到9999。月份部分的范围是从1到12。日部分的范围是从1到n,其中n的值取决于月份。小时部分的范围是从0到24。分钟和秒部分的范围都是从0到59。微秒部分的范围是从000000到999999。如果小时是 24,那么分钟值、秒的值和微秒的值都是0。TIMESTAMP列长26个字节。
字段名称 | 数据类型 | 字段长度 | 约束 | 说明 |
hospital_ID | INTEGER |
| 主键 | 医院ID |
hospital_Code | VarChar | 30 | 索引 | 医院代码 |
hospital_Name | VarChar | 30 | 索引 | 医院名称 |
hospital_Describe | VarChar | 60 |
| 医院描述 |
hospital_IsActive | Char | 1 | 默认值(Y) | 有效(Y)无效(N) |
字段名称 | 数据类型 | 字段长度 | 约束 | 说明 |
department_ID | INTEGER |
| 主键 | 科室ID |
department_Code | VarChar | 30 | 索引 | 科室代码 |
department_Name | VarChar | 30 | 索引 | 科室名称 |
department_Describe | VarChar | 60 |
| 科室描述 |
department_Parent | INTEGER |
| 索引 | 上级科室 |
department_IsLast | Char | 1 | 默认值(Y) | 末端标志 |
hospital_ID | INTEGER |
| 外键、索引 | 医院ID |
Department_IsVirtual | Char | 1 |
| 是否虚拟科室 |
department_IsActive | Char | 1 | 默认值(Y) | 有效(Y)无效(N) |
表的创建
表字段添加、主键、外键、约束
插入行
INSERT [INTO] {table_name} [(column_list)]
VALUES {DEFAULT | value_list | select_statement}
例如:insert into xxx(id,name) values(1,limingzhong);
更新行
UPDATE table_name
SET column_name = value [, column_name = value]
[FROM table_name]
[WHERE condition]
删除行
DELETE [FROM table(s)]
[WHERE condition]
查询
SELECT * FROM table_name WHERE condition(s)
例如:SELECT * FROM XU.HOSPITAL where hospital_name like '_西一%'
UNION运算符
SELECT * FROM XU.AAA union SELECT * FROM XU.BBB;
表连接(join)
SELECT * FROM XU.CCC a inner join XU.AAA b on a.idid=b.id where b.id=1001
视图
视图是一个虚表,它可以访问来自一个或多个表的列的子集,是从一个或多个表中派生出数据的对象,派生数据的表称为基表或底层表。它是作为数据库中对象存储的一种询问。
视图提供一种安全机制。它保证用户只能检索和修改他们看得到的数据。基表中其余的数据既不能看到也不能被存取。复杂的询问的使用也可以通过视图来简化。复杂询问可以以视图的形式存储,视图中的数据可使用简单询问来抽取。
定义视图后,它可以象数据库中任何其它的表一样被引用。虽然视图与表相似,但它并没有存储在数据库中。它从基表中派生出它的值集合。
创建视图
CREATE VIEW view_name
[(column_name [, column_name]…)]
AS select_statement
在视图中,ORDER BY子句不能在SELECT语句中使用。
删除视图
DROP VIEW view_name [,view_name]…
通过视图修改数据
可以通过修改视图中的数据来修改基表数据。数据的修改不能影响到一个以上的基表,即每次的修改只能影响一个表。
索引
索引是一种内部表结构,它基于表中一个或多个列的值,提供对表中行的快速存取。
索引的优点
索引的主要目标是提高存取数据页的速度。服务器并非对所需的数据扫描每一页,而是扫描索引,获得数据存储单元的地址,并直接地存取信息。
l 提高询问执行的速度
l 实施数据唯一性
l 加速了表之间的连接
索引的缺点
为表中的每一列创建索引是不明智的。
l 创建索引要花时间
l 索引也需要空间来存储数据
l 每次修改数据时索引都需要更新
簇索引
l 数据被物理排序
l 应该在具有高百分比唯一值和不经常被修改的属性上构建索引。
非簇索引
l 行的物理顺序不同于索引的顺序
l 一般在用于连接和WHERE子句的列上创建,且它的值可能被经常地修改。
l 当给出CREATE INDEX命令时,缺省创建非簇索引。
索引的特性
l 索引加速了连接表的询问、执行排序和分组
l 索引可用来实施行的唯一性
l 索引对数据大多数是唯一的列很有用。索引对具有大量重复数据的列没有多大用处
l 当你修改索引列的数据时,相关索引会被自动更新
l 你需要时间和资源来维护索引。你不应该创建不被经常性使用的索引
l 簇索引应在非簇索引之前被创建。簇索引改变了行的顺序。如果非簇索引在簇索引之前被创建,那么它需要被重新构造
l 典型地,非簇索引在外键上创建
第三节实现存储过程
存储过程是SQL语句和控制流语句的一个集合或批量,它在一个名称下存储,按独立单元方式执行。它能帮助提高查询的性能。
存储过程的好处
存储过程是存储在数据库中的一个预编译对象。这意味着过程是预编译的,可提供给各种应用执行。发送查询到服务器、分析和编译过程再不需要花费时间。
l 提高性能:应用不必重复地编译此过程。
l 减轻网络拥塞:为进行处理,应用不需要向服务器提交多个SQL语句。
l 一致性较好:由于过程作为单一控制点,在过程中定义的编码逻辑和SQL语句在所有应用中被一致地实现。
l 改善安全机制:用户可以被授予许可权来执行存储过程,尽管他们并不拥有这个过程。
执行存储过程语句
call proc_name(param,…)
向过程传递参数
参数:是查询中的一个占位符或是一个存储过程,只要查询或存储过程被执行,该过程就接受用户定义的值。
参数的类型:
l 输入参数:允许调用者向过程传递数据值。
l 输出参数:允许存储过程向调用者返回数据值。
RETURN关键字
允许存储过程把整型值返回给调用者。如果没有指定值,那么存储过程返回缺省值0或1,这依赖于存储过程的成功执行与否。
RETURN value
嵌套过程
可以执行或调用来自另一个过程的过程。
create procedure pr1() language sql p1:begin declare id integer;decla name VARCHAR(60);set id=10;set name='abc';return 0;end p1
DROP PROCEDURE语句
DROP PROCEDURE proc_name
不能撤销一个正被另一个过程调用的过程。
第四节触发器
触发器的定义和特征
一个触发器是由SQL语句集组成的代码块,在响应某些动作时激活该语句集。一个触发器也可被解释为特定类型的存储过程,每当动作发生时执行该过程。
每当基础表中数据受到数据操纵语言(DML)语句——INSERT、UPDATE或DELETE的影响时,触发器就被激发。
触发器帮助维持表中数据的一致、可靠和正确。
触发器的特征
l 当任何数据修改语句被发出时,它就被自动激发。
l 在存储过程的情况下,它不被显式地调用和执行。
l 它防止了对数据的不正确、未授权的和不一致的改变。
l 它不能返回数据给用户。
触发器可最多嵌套。当一个触发器执行对另一个触发器初始化动作时触发器的嵌套就产生了。
创建触发器
CREATE TRIGGER XU.T1 AFTER UPDATE OF NAME ON XU.AAA FOR EACH ROW MODE DB2SQL insert into BBB (id1,name1) values(1005,'国家')
INSERT触发器
当试图插入一行到触发器表中时,INSERT触发器被激发。当INSERT语句被发出时,一个新行被加到触发器和inserted表中。
DELETE触发器
当试图从触发器表中删除一行时,DELETE触发器被激发。
使用DELETE触发器来实现引用完整性有三种途径:
l 串联方法——每当从主表中删除记录时,删除依赖表中的记录。
l 限制方法——如果相关记录出现在依赖表中,则限制从主表中删除记录。
l 无效方法——每当一个记录从主表中删除时,把依赖表中所指列的值变为无效。
UPDATE触发器
ALTER TRIGGER命令
l 撤销触发器且重新创建它
l 使用ALTER TRIGGER
DROP TRIGGER命令
可用DROP TRIGGER和DROP TABLE命令删除触发器。
触发器和数据完整性
触发器可用来确保和加强业务规则和数据完整性。业务规则是指确保业务平稳运转的组织政策。数据完整性是指数据的精确性和可靠性。
l 如果某种改变违反了引用完整性,那么所有这样的改变都被拒绝,因此所有试图改变数据库中的数据都被取消。
l 允许实施非常复杂的限制。
l 它可执行依赖于对表所作修改的结果的特定的动作。
第五节实现处理事务和游标
事务
一个事务是可以被定义为作为单个的逻辑单元工作的一串操作。单个的工作单元必须具有称为ACID(原子性、一致性、独立性和持久性)的四个性质。
l 原子性:这规定或者所有的数据修改都执行或者所有的都不执行。
l 一致性:在事务处理成功地完成后,所有的数据都处于一致的状态。在关系数据库中所有的规则必须应用到事务修改中来维持完全的数据完整性。
l 独立性:一个事物或者在并发事务修改它之前的状态下访问数据,或者在第二个事务完成后访问数据。没有机会可看到事物的中间状态。
l 持久性:规定了一个已完成的事务对数据任何改动在系统中永久有效。因此,一个已完成事务对数据的任何改变即使在系统故障的事件中也是有效的。这是通过备份和恢复事务日志的概念来保证的。(日志)
显式事务
就是事物的开始和结束都被显示地定义的事务。显式事务是用BEGIN TRANSACTION和COMMIT TRANSACTION语句说明。
BEGIN TRANSACTION
BEGIN TRAN[SACTION] [transaction_name | @tran_name_variable]
COMMIT TRANSACTION或COMMIT WORK
标志显式事务的结束点。这个语句用来结束事务处理时没有遇到错误的事务。
COMMIT [TRAN[SACTION] [transaction_name | @tran_name_variable]]
COMMIT WORK语句与COMMIT TRANSACTION语句作用相同。这两个语句之间的唯一的区别是COMMIT WORK语句不接受事务名。
Autocommit事务
Autocommit模式是SQL Server的缺省事务管理模式。在每一个T-SQL语句结束时,事务被自动提交或者回滚。BEGIN TRANSACTION语句重设缺省的自动提交模式。当显示事务被提交或回滚,或当隐式事务模式关闭时,SQL Server返回自动提交模式。
ROLLBACK TRANSACTION或ROLLBACK WORK
把显式的或隐式的事务回滚到事务的开始,或者回滚到事务内的保存点。
ROLLBACK [TRAN[SACTION] [transaction_name | @tran_name_variable | savepoint_name | @savepoint_variable]]
ROLLBACK TRANSACTION语句和ROLLBACK WORK语句功能相同。两者间的唯一区别就是ROLLBACK WORK语句不接受事务名。
保存事务
SAVE TRANSACTION语句在事务内设置保存点。保存点把事务分成几个逻辑单元,如果事务的一部分是有条件地被取消,这样事务可以返回到保存点。
SAVE TRAN[SACTION] {savepoint_name | @savepoint_variable}
上锁
SQL Server用上锁的概念确保事务的完整性和数据库的一致性。上锁,在功能上避免用户访问正在被其它用户改变的信息。在SQL Server中,上锁是自动实施的。
事务的并发性
SQL Server提供了乐观的和悲观的并发性控件。它用悲观并发性控件作为缺省控件,而乐观并发性控件可通过游标来完成。
乐观并发性
乐观并发性控件建立在多用户间资源冲突大概是不可能的假设基础上。乐观并发性允许事务执行不用锁定任何资源。只有在提交事务时才进行资源检查,以决定冲突是否发生。如果冲突发生,事务重新开始。
悲观并发性
悲观并发性控件在事务处理期间锁定资源。除非出现死锁,事务总能保证成功地完成。
丢失更新
丢失更新问题发生在当两个或多个事务基于原先所选值试图修改同一行的时候。在这种情况下,每一个事物意识不到其它的事务。事务对列中最后的更新会重写前面事务所作的更新。
自由依赖性(无效读入)
自由依赖性(uncommitted dependency)也称为无效读入(dirty read)。
不一致性分析
不一致性分析问题又称为不可重复问题。
幻象读取
幻象读取又称为幻象问题。
理解DB2中的上锁
SQL Server实现了多粒度上锁,这允许事务以不同级别对不同类型的资源上锁。为了最小化上锁的工作量,SQL Server在一个合适的事务的级别上自动地锁定资源。为了增强并发性,SQL Server以一个较小的粒度实现上锁(如行),但增加了开销,因为多行上锁必须设置许多的锁。在表级上锁时,粒度越大并发性越低,因为它拒绝其它事务对表任何部分的访问。粒度越大数据库服务器的开销就越小,因为维持的锁较少。
锁项
下表列出以粒度递增次序锁定的资源:
项 | 描述 |
RID | 分别锁定表中行的行标识符 |
Key | 索引内的行锁。在串行化事务中用它来保护键范围 |
Page | 是一个8K页或者一个索引页 |
Extent | 是一个连续的8K数据页或索引页的组 |
Table | 是一个完整表,包括所有数据和索引 |
Database | 是完整的数据库 |
SQL Server锁模型
对于访问资源的事务,SQL Server通过用锁模式解决并发事务间的冲突。SQL Server使用资源锁模型列表如下:
锁模式 | 描述 |
Shared(S) | 用作不改变或更新数据的操作(只读操作)。 |
Update(U) | 用在可被更新的资源上。这个模式防止了多事务在读取、上锁及往后潜在的更新资源时发生的常见形式的死锁。 |
Exclusive(X) | 用于数据修改工作。这个模式确保多个更新不会同时作用到同一资源上。 |
Intent(I) | 用于建立锁的层次结构。 |
Schema | 当执行依赖于表模式的操作时使用使用。SQL Server支持两种类型的锁模式:模式稳定(Sch-S)和模式修改(Sch-M)。 |
共享锁
允许并发事务来读取资源。如果一个资源上有任何共享锁的话,其它的事务都不能修改该资源上的数据。一个共享锁在数据已被事务读取后释放资源。
更新锁
更新(U)锁,在功能上避免了常见形式的死锁发生。
互斥型锁
排它型锁(X),在功能上唯一地限制并发事务访问一个资源。用排它锁时没有任何其它的事务可以读取或者修改已上锁的数据。
意向锁
意向锁(I),指示SQL Server要在层次结构较低的某个资源上获得一个共享或排它锁。
带有各种特性的意向锁包括意向共享(IS),意向排它(IX)和带有意向排它的共享锁(SIX)
锁模式 | 描述 |
Intent Shared(IS) | 通过在个别资源上设置共享锁(S),指示了一个事物的意图是读取一些(但不是全部)低层次的资源。 |
Intent Exclusive(IX) | 通过在个别资源上设置排它锁,指示了事务的意图是在层次结构中更新一些(但不是全部)低层次的资源。意向共享(IS)锁模式是意向排它(IX)锁模式的子集。 |
Shared with Intent Exclusive(SIX) | 通过在个别资源上设置意向排它(IX)锁,指示了事务的意图是允许并发读入层次结构中顶层资源和更新较低层一些(但不是全部)资源。在任何时刻,每个表不可能有一个以上共享意向锁(SIX)。这是因为表级共享锁(S)阻止对表的任何其它修改。共享意向排它锁(SIX)是共享锁(S)和意向排它锁(IX)的结合。 |
模式锁
当任何数据定义(DDL)操作在表上执行时,SQL Server考察模式修改(Sch-M)锁。当编译查询时,SQL Server考察模式稳定(Sch-S)锁。
可以用sp_lock存储过程查看锁信息。
死锁
为探测死锁的情况,SQL Server扫描在等待锁请求的会话。SQL Server在初始扫描时,标记所有在等待的会话。当SQL Server第二次扫描会话时,启动递归的死锁搜索。如果发现了锁请求的任何循环链,SQL Server于是取消代价最小的事务且标志此事务为死锁受害者。当回滚了死锁受害者的事务后,SQL Server通过返回错误消息1205通知用户的应用程序。
设置DEADLOCK_PRIORITY
DEADLOCK_PRIORITY命令可定制死锁。把某个会话的DEADLOCK_PRIORITY设置为LOW,使得要选的某个会话变成死锁受害者。
SET DEADLOCK_PRIORITY {LOW | NORMAL | @deadlock_var}
定制LOCK_TIMEOUT
可用来设置等待被阻塞资源的最长时间。当语句等待超过设置的时间后,SQL Server自动地取消此等待事务。
SET LOCK_TIMEOUT [timeout_period]
timeout_period:以微秒为单位。
游标
游标是一个在给定结果集中帮助访问和操纵数据的数据库对象。游标的主要好处是你可以逐行的处理数据。结果集被定义为从SELECT语句中获得的行的集合。
游标能以下列方式处理结果集中的行:
l 允许从结果集中检索指定的行
l 允许结果集中当前行被修改
l 帮助从结果集中当前行导航到不同行
l 允许被其它用户修改的数据在结果集中是可见的
游标的结构
当在SQL Server中使用游标时,需要执行下面任务:
l 定义游标和设置它的属性
l 打开游标
l 从结果集中取(Fetch)得检索行
l 如果需要,游标当前行中的数据是可以被修改的
l 关闭游标
l 释放游标所使用的资源
声明游标
DECLARE cursor_name [INSENSITIVE] [SCROLL] CURSOR
FOR {select_statement}
[FOR {READ ONLY | UPDATE [OF column_list]}]
INSENSITIVE:使结果集存储在tempdb数据库中,且不允许修改游标的结果集。
SCROLL:指出游标可以向前或向后定位以读入数据。只要游标不是用INSENSITIVE选项声明,所有随后的取数显示基础表所作的修改。
READ ONLY:防止结果集中的修改。
UPDATE [OF column_list]:定义游标内可更新的列。如果使用OF column_list选项,只有列出可被更新的列;否则,除非游标被定义为READ ONLY,所有列都可更新。
打开游标
OPEN cursor_name
取数据
FETCH [[NEXT | PRIOR | FIRST | LAST | ABSOLUTE n | RELATIVE n]] FROM cursor_name [INTO @variable_name [,…n]]
当一个FETCH语句执行时,一般认为游标定位在已被取到行的位置。被取到的行被称为当前行。
@@fetch_status
返回最后执行的取数语句状态
l 0——成功执行了取数语句
l -1——执行取数语句不成功
l -2——被读取的行丢失
关闭游标
CLOSE cursor_name
除了游标再打开的情况外,不可以进行读取和修改。
解除分配游标
所有游标持有的资源都被释放。
DEALLOCATE cursor_name