一、表
1.1创建表
语法格式:
CREATE TABLE <表名> (
<列名><数据类型>[列级完整性约束条件]
[,<列名><数据类型>[列级完整性约束条件]]…
[,<表级完整性约束条件>]
);
注:[ ]表示可选,< >表示必填。
实体完整性约束:
(1)在列后面加 PRIMARY KEY
(2)在最后加PRIMARY KEY(属性名1,属性名2) //主码为属性组(两个或以上属性的组合)只能 用这种方法
参照完整性约束:
(1)在列后面加 References 表名(属性名)
(2)在最后面加 ,有几个外码,就写几行下面的语句
Foreign Key (属性名) References 表名(属性名) [ON DELETE[CASCADE|SET NULL]]
ON DELETE CASCADE 表示删除被参照关系的元组时,同时删除参照关系中的元组;
ON DELETE SET NULL表示删除被参照关系的元组时,将参照关系的相应属性值置为空值。
属性值上的约束
(1)NULL:表示为空;NOT NULL表示不能为空;
(2)UNIQUE:表示取值唯一;
(3)NOT NULL UNIQUE:表示取值唯一且不为空,与属性列后面的PRIMARY KEY可互换;
(4)CHECK:限制列中值的取值范围。如:CHECK (Sex='男' OR Sex='女'),CHECK (余额>=0),CHECK (年龄>=18 AND 年龄<=60), CHECK (离职日期 > 入职日期)
USE of ALTER to ADD CHECK constraint in an already created table
在已创建的表中使用ALTER来添加CHECK约束
1) For single column
ALTER TABLE company ADD CHECK (E_Id>0);
2) For multiple columns
ALTER TABLE company ADD CONSTRAINT chk_emp CHECK (E_Id>0AND E_name='Bharti');
How to DROP CHECK constraint from a table?
ALTER TABLE company DROP CONSTRAINT chk_emp;
建表示例
Create Table SP (
Sno CHAR(5),
Pno CHAR(6),
Status CHAR(8),
Qty NUMERIC(9),
PRIMARY KEY(Sno,Pno), //如果主键为属性组合,只能用这种方法
FOREIGN KEY(Sno) REFERENCES S(Sno), //每一个外键写一个
FOREIGN KEY(Pno) REFERENCES P(Pno) //每一个外键写一个
);
例题(2011,试题二)
某法院要开发一个诉讼案件信息处理系统,该信息系统的部分关系模式如下:
职工(职工编号,姓名,岗位)
律师(律师编号,姓名)
被告(被告编号,姓名,地址)
案件(案件编号,案件类型,案件描述,被告,律师,主审法官,立案日期,状态,结案日期,结案摘要)
审理(审理编号,案件编号,审理日期,摘要)
有关关系模式的属性及相关说明如下:
(1)职工关系模式的岗位有“法官”、“书记员”和“其他”。
(2)诉讼立案后,即在案件关系中插入一条相应记录。案件关系模式的状态有“待处理”、“审理中”、“结案”和“撤销”,一个案件开始立案时其案件状态为“待处理”。
(3)案件关系模式的案件类型有“偷窃”、“纵火”等。
(4)一个案件自立案到结案的整个过程由一位法官和一位律师负责,一个案件通常经过一次到多次审理。
假设案件编号唯一标识一个案件,且立案日期小于等于结案日期。请将如下创建案件关系的SQL语句的空缺部分补充完整。
CREATE TABLE案件(
案件编号 CHAR(6) (a) , //PRIMARY KEY或NOT NULL UNIQUE
案件类型 VARCHAR(6),
案件描述 VARCHAR(6),
立案日期 DATE,
被告 VARCHAR(6) REFERENCES 被告(被告编号),
律师 VARCHAR(6) REFERENCES 律师(律师编号),
主审法官 VARCHAR(6) (b) , //REFERENCES 职工(职工编号)
状态 VARCHAR(6) (c) DEFAULT '待处理', //CHECK VALUES IN (“待处理”,“审理中”,“结案”,“撤销”)
结案日期 DATE,
结案摘要 VARCHAR(200),
(d) //CHECK(立案日期<=结案日期)
};
1.2 修改表
语句格式:
ALTER TABLE <表名>
[ADD <新列名><数据类型>[列级完整性约束条件]]
[DROP <完整性约束名>]
[Modify <列名><数据类型>]; 如:
ALTER TABLE S ADD Zap CHAR(6); //在表S中新增一列ZAP,该列的数据为空
ALTER TABLE S MODIFY Status INT; //将表S的Status属性的数据类型更改为INT
ALTER TABLE S ADD Constraint C_cno CHECK(......) //在表S中新增CHECK约束,取名为C_cno
ALTER TABLE S DROP Constraint C_cno; //在表S中删除CHECK约束
1.3删除表
语句格式:
DROP TABLE <表名>
如: DROP TABLE S; //表删除后,不再是数据库模式的一部分
数据操作
SQL中几个关键字的执行顺序为
FROM
WHERE
GROUP BY
HAVING
聚合函数
SELECT
ORDER BY
HAVING 在 select 前面,having后面不可以用在select里面的重命名
增
INSERT INTO 表名称 [(字段1,字段2,字段3,...)] VALUES(值1,值2,值3,...)
删
DELETE FROM 表名称 [WHERE 删除条件(s)];
改
UPDATE 表名称 SET 更新字段1=更新值1,更新字段2=更新值2,...[WHERE 更新条件(s)];
查
二、视图
2.1 概念
视图是由数据库中的一个表或多个表导出的虚拟表,其结构和数据是建立在对表的查询基础上的,其作用是方便用户对数据的操作。视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图也包括几个被定义的数据列和多个数据行,但从本质上讲,这些数据列和数据行来源于其所引用的表。因此视图不是真实存在的基本表,而是一个虚拟表。数据库中只存放了视图的定义,而并没有存放视图中的数据,这些数据存放在原来的表中。使用视图查询数据时,数据库系统会从原来的表中取出对应的数据。因此,视图中的数据是依赖于原来的表中的数据的。一旦表中的数据发生改变,显示在视图中的数据也会发生改变。同样对视图的更新,会影响到原来表的数据。使用视图的优点和作用如下:
2.2 视图的创建
语句格式:
CREATE VIEW 视图名(列表名)
AS SELECT 查询子句
[WITH CHECK OPTION];
注意:视图的创建中,必须遵循如下规定: (1)子查询可以是任意复杂的SELECT语句,但通常不允许含有ORDER BY子句和DISTINCT短语。 (2)WITH CHECK OPTION表示对UPDATE,INSERT,DELETE操作时保证更新、插入或删除的行满足视图 定义中的谓词条件(即子查询中的条件表达式) (3)组成视图的属性列名或者全部省略或者全部指定。如果省略属性列名,则隐含该视图由SELECT 子查询目标列的主属性组成。
CREATE VIEW CS_STUDENT //创建视图CS_STUDENT
AS SELECT Sno,Sname,Sage,Sex //选择学号、姓名、年龄、性别列
FROM Student //从学生表中查询
Where SD='CS' //选择系名等于“CS”的行
WITH CHECK OPTION;
//以后对该视图进行修改、插入操作时DBMS会自动加上SD='CS'的条件,保证视图中只有计算机系的学生
2.3视图的删除
语句格式:
DROP VIEW 视图名
如:DROP VIEW CS_STUDENT //删除视图CS_STUDENT
三、触发器
3.1 概念
触发器是与表有关的数据库对象,在满足定义条件时触发,并执行触发器中定义的语句集合。触发器的这种特性可以协助应用在数据库端确保数据的完整性。
触发器主要有以下三方面的特点: (1)当数据库程序员声明的事件发生时,触发器被激活。声明的事件可以是对某个特定关系的插入、删除或更 新。 (2)当触发器被事件激活时,不是立即执行,而是首先由触发器测试触发条件,如果事件不成立,响应该事件 的触发器什么都不做。 (3)如果触发器声明的条件满足,则与该触发器相连的动作由DBMS执行。动作可以阻止事件发生,可以撤销事 件。
创建触发器时需指定: (1)触发器名称 (2)在其上定义触发器的表 (3)触发事件:触发器将何时激发 (3)触发条件:满足什么条件时执行触发动作 (4)触发动作:指明触发器执行时应做的动作
• 触发器可以引用当前数据库以外的对象,但只能在当前数据库中创建触发器。
• 不能在临时表或系统表上创建触发器,但触发器可以引用临时表
3.2 创建触发器
CREATE TRIGGER 触发器名称 [BEFORE | AFTER] [DELETE | INSERT | UPDATE OF 列名] //触发事件
ON 表名
[REFERENCING <临时视图名>]
[FOR EACH ROW | FOR EACH STATEMENT]
[WHEN <触发条件>] //WHEN后面跟触发条件,指明当什么条件满足时,执行下面的触发动作
BEGIN
<触发动作> //BEGIN...END 中定义触发动作,即当触发条件满足时,需要数据库做什么
END [触发器名称]
BEFORE/AFTER:指明是在执行触发语句之前激发触发器还是执行触发语句之后激发触发器。
DELETE:当一个DELETE语句从表中删除行时激发触发器。
INSERT:当一个INSERT语句向表中插入行时激发触发器。
UPDATE/UPDATE OF(列名):当UPDATE修改表中的值时,激发触发器,也可加(OF 列名)指定是某一列的值被修改时激发触发器。
REFERENCING:触发器运行过程中,系统会生成两个临时视图,分别存放更新前和更新后的值,对于行级触发器,为OLD ROW 和NEW ROW,对于语句级触发器,为OLD TABLE和NEW TABLE。
REFERENCING new row AS nrow / REFERENCING old row AS orow
FOR EACH ROW:表示为行级触发器,对每一个被影响的元组(即每一行)执行一次触发过程。
FOR EACH STATEMENT:表示为语句级触发器,对整个事件只执行一次触发过程,为默认方式
3.3更改删除触发器
1、更改触发器 语句格式:
ALTER TRIGGER <触发器名> [BEFORE|AFTER]
DELETE|INSERT|UPDATE OF [列名]
ON 表名|视图名
AS
BEGIN
要执行的SQL语句
END
2、删除触发器 语句格式:
DROP TRIGGER <触发器名>
四、存储过程
4.1 概念
存储过程(Stored Procedure),是一组为了完成特定功能的SQL 语句,是一组为了完成特定功能的SQL语句集合,经编译后存储在数据 库中,用户通过指定存储过程的名称并给出参数来执行。 存储过程中可以包含逻辑控制语句和数据操纵语句,它可以接受参数、输出参数、返回 单个或多个结果集以及返回值。 存储过程的优点
存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度,效率要比T-SQL语句高。
当对数据库进行复杂操作时,可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。
一个存储过程在程序在网络中交互时可以替代大堆的T-SQL语句,所以也能降低网络的通信量,提高通信速率。
存储过程可以重复使用,可减少数据库开发人员的工作量。
安全性高,可设定只有某些用户才具有对指定存储过程的使用权
4.2 创建格式
CREATE PROCEDURE 存储过程名(IN|OUT|IN OUT 参数1 数据类型,IN|OUT|IN OUT 参数2 数据类…)
[AS] //参数的数据类型只需要指明类型名即可,不需要指定宽度。具体宽度由外部调用者决定
BEGIN
<SQL语句>
END
IN:为默认值,表示该参数为输入型参数,在过程体中值一般不变。 OUT:表示该参数为输出参数,可以作为存储过程的输出结果,供外部调用者使用。 IN OUT: 既可作为输入参数,也可作为输出参数。
4.3 触发器和存储过程的区别
存储过程可以采用输入参数,而触发器不可以;
存储过程可以返回零或n值,而触发器无法返回值;
存储过程中可以使用事务,而触发器不允许;
存储过程通常用于执行用户指定的任务,触发器通常用于审计工作
五、游标
5.1 概念
SQL语言是面向集合的,一条SQL语句可产生或处理多条纪录。而主语言是面向记录的,一组主变量一次只能放一条记录,所以,引入游标,通过移动游标指针来决定获取哪一条记录。
5.2 游标的使用方法
定义游标-->打开游标-->推进游标-->关闭游标
定义游标
EXEC SQL DECLARE <游标名> CURSOR FOR
<SELECT 语句>
END_EXEC
这是一条说明性语句,定义中的SELECT语句并不立即执行。
打开游标
EXEC SQL OPEN <游标名> END_EXEC
推进游标
EXEC SQL FETCH <游标名> INTO <变量表> END_EXEC
关闭游标
EXEC SQL CLOSE <游标名> END_EXEC
5.3 使用示例
六、 流程控制语句
分类:
顺序结构:程序从上往下依次执行
分支结构:程序从两条或多条路径中选择一条执行
循环结构:程序在满足一定条件的基础上,重复执行一段代码
IF…THEN语句
IF…THEN语句是选择语句中最简单的一种形式,它只做一种情况或条件的判断,其语法格式如下:
if <condition_expression> then
plsql_sentence
endif;
CASE语句
CASE 语句也是用来进行条件判断的,它提供了多个条件进行选择,可以实现比 IF 语句更复杂的条件判断。CASE 语句的基本形式如下:
CASE case_value
WHEN when_value THEN statement_list
[WHEN when_value THEN statement_list]...
[ELSE statement_list]
END CASE
情况1:类似于java中的switch语句,一般用于实现的等值判断
语法:
case 变量|表达式|字段
when 要判断的值 then 返回的值1或语句1;
when 要判断的值 then 返回的值2或语句2;
...
else 返回的值n或语句n;
end case;
情况2:类似于java中的多重if语句,一般用于实现区间判断
语法:
case
when 要判断的条件1 then 返回的值1或语句1;
when 要判断的条件2 then 返回的值2或语句2;
...
else 返回的值n或语句n;
end case;
其中:
case_value 参数表示条件判断的变量,决定了哪一个 WHEN 子句会被执行;
when_value 参数表示变量的取值,如果某个 when_value 表达式与 case_value 变量的值相同,则执行对应的 THEN 关键字后的 statement_list 中的语句;
statement_list 参数表示 when_value 值没有与 case_value 相同值时的执行语句。
CASE 语句都要使用 END CASE 结束。
LOOP 语句
LOOP 语句可以使某些特定的语句重复执行。与 IF 和 CASE 语句相比,LOOP 只实现了一个简单的循环,并不进行条件判断。
LOOP 语句本身没有停止循环的语句,必须使用 LEAVE 语句等才能停止循环,跳出循环过程。LOOP 语句的基本形式如下:
[begin_label:]LOOP
statement_list
END LOOP [end_label]
其中,begin_label 参数和 end_label 参数分别表示循环开始和结束的标志,这两个标志必须相同,而且都可以省略;statement_list 参数表示需要循环执行的语句。
WHILE 语句
WHILE 语句也是有条件控制的循环语句。WHILE 语句和 REPEAT 语句不同的是,WHILE 语句是当满足条件时,执行循环内的语句,否则退出循环。WHILE 语句的基本语法形式如下:
[begin_label:] WHILE search_condition DO
statement list
END WHILE [end label]
其中,search_condition 参数表示循环执行的条件,满足该条件时循环执行;statement_list 参数表示循环的执行语句。WHILE 循环需要使用 END WHILE 来结束。