a.任何一种数据库应用系统,不管是层次的、网状的、还是关系的,都会遇到如何构造合适的数据模式即逻辑结构的问题。由于关系模型有严格的书数学理论基础,并且可以向别的数据模型转换。因此,人们以关系模型为背景,形成了数据库逻辑设计的有力工具——关系数据库规范化理论。
b.不规范的关系模式常出现的四个问题
数据冗余:(Sno,Sdept,Mname,Cno,Grade) 每个系的系主任名字重复出现
更新异常:(Sno,Sdept,Mname,Cno,Grade) 某个系更换系主任后相关的每个学生元组都要变更
插入异常:(Sno,Sdept,Mname,Cno,Grade) 某个系新成立但没有招生,添加系和系主任信息失败
删除异常:(Sno,Sdept,Mname,Cno,Grade) 某个系学生全部毕业,学生信息需要删除时系信息也被影响
a.函数依赖:X函数确定Y 或 Y函数依赖于X,记作 X->Y。如 name->age,年龄函数依赖于姓名
对于关系 (Sno,Sdept,Cno,Grade)
b.完全函数依赖:如果X->Y,并且对于任意一个真子集X',都有X'-/>Y,则称Y对X完全函数依赖。如 (Sno,Cno)->Grade
c.部分函数依赖:如果X->Y,并且存在一个真子集X',使得X'->Y,则称Y对X部分函数依赖。如(Sno,Cno)->Sdept
1NF:数据库的每一列都是不可分割的基本数据项
2NF:满足第一范式,且非主属性必须完全依赖于候选码。
3NF:满足第二范式,且非主属性都不传递依赖于任一候选码。
BCNF:满足第三范式,且每个字段都不传递依赖于任一候选码。
Armstrong公理系统
既要保持函数依赖,又要具有无损连接
标准SQL是非过程化的查询语言,具有操作统一、面向集合、功能丰富、使用简单等多项优点。但和程序设计语言相比,高度非过程化的优点也造成了它的一个弱点:缺少流程控制能力,难以实现应用业务中的逻辑控制。SQL编程技术可以有效克服SQL语言实现复杂应用方面的不足,提高应用系统和数据库管理系统间的互操作性。
在应用系统中使用SQL编程来访问和管理数据库中数据的方式主要有:
游标:SQL是面向集合的,一条SQL语句可以产生或处理多条记录;而主语言是面向记录的,一组主变量一次只能存放一条记录。所以仅使用主变量并不能完全满足SQL语句向应用程序输出数据的要求,因此嵌入式SQL引入游标的概念。
游标是系统为用户开设的一个数据缓冲区,存放SQL语句的执行结果,每个游标区都有一个名字。用户可以通过游标逐一获取记录并赋给主变量,交由主语言进一步处理。
游标示例:
begin
declare temp_user_id int default null;
declare stop int default 0;
#声明游标
declare temp_cur cursor for select f_user_id from table_test where f_user_id=1;
#声明游标的异常处理
declare continue handler for NOT FOUND set stop=1;
open temp_cur;
fetch temp_cur into temp_user_id;
#判断游标是否到达最后
while stop<>1 do
#各种判断
#读取下一行的数据
fetch temp_cur into temp_user_id;
#循环结束
end while;
#关闭游标
close temp_cur;
end
1.声明游标
DECLARE cursor_name CURSOR FOR select_statement
这个语句声明一个游标。也可以在子程序中定义多个游标,但是一个块中的每一个游标必须有唯一的名字。
2. 游标OPEN语句
OPEN cursor_name
这个语句打开先前声明的游标。
3. 游标FETCH语句
FETCH cursor_name INTO var_name [, var_name] ...
这个语句用指定的打开游标读取下一行(如果有下一行的话),并且前进游标指针。
4. 游标CLOSE语句
CLOSE cursor_name
这个语句关闭先前打开的游标。
过程化SQL是对SQL的扩展,使其增加了过程化语句功能。过程化SQL程序的基本结构是块。所有的过程化SQL程序都是由块组成的。这些块之间可以相互嵌套,每个块完成一个逻辑操作。
a.存储过程是由过程化SQL语句书写的过程,这个过程经过编译和优化后存储在数据库服务器中,因此称为存储过程,使用时调用即可。
b.存储过程的优点:
(1)运行效率高;(2)降低了客户机和服务器之间的通信量;(3)方便实施企业规则。
c.存储过程示例:
//创建存储过程的语法形式:
CREATE PROC[ EDURE ] 存储过程名[;number]
[ { @参数名 数据类型 } [ = default ] [OUTPUT]
] [ , ... n ]
AS
SQL语句 [ ... n ]
number:可选整数,用来对同名的过程分组,方便删除
default:表示参数的默认值。如果定义了默认值,则在执行存储过程时,可以不必指定该参数的值。
OUTPUT:表明参数是输出参数。使用 OUTPUT 参数可将信息返回给调用者。
//存储过程的调用形式:
[ EXEC [ UTE ] ] 存储过程名
[实参 [, OUTPUT] [, … n] ]
//实例
//带有输入参数的存储过程:查询某个指定系学生的考试情况,列出学生的姓名、所在系、课程名和考试成绩。
CREATE PROCEDURE p_grade2
@dept varchar(20)
AS
SELECT Sname, Sdept,Cname, Grade
FROM Student s,sc, course c
WHERE s.sno = sc.sno AND c.cno = sc.cno
AND Sdept = @dept
//查询信息系学生的修课情况:
EXEC[UTE] p_grade2 ‘is'
a.本章讲解的函数是自定义函数,这是由用户自己使用过程化SQL设计定义的。函数和存储过程类似,都是持久性存储模块。函数的定义和存储过程也类似,不同之处是函数必须指定返回的类型。
b.函数使用示例:
//创建自定义标量函数TOTAL()用来计算任意两数之和。标量函数(返回值为基本数据类型)
CREATE FUNCTION TOTAL(@expr1 int,@expr2 int)
RETURNS int
BEGIN
DECLARE @my_total int
SELECT @my_total=@expr1+@expr2
RETURN @my_total
END
GO
//用命令行调用TOTAL()函数:
SELECT dbo.TOTAL(10,20) AS 两数之和
//创建表值函数的应用举例 (返回基本表)(不使用begin……end函数体)
//创建函数fun_table( )返回一组查询的结果。
USE student
GO
CREATE FUNCTION fun_table (@sno char(9),@grade int)
RETURNS TABLE
AS
RETURN (SELECT * FROM sc WHERE sno=@sno
union SELECT * FROM sc WHERE grade>@grade)
//调用
SELECT * FROM dbo. fun_table('200515001',80)
微软推出的接口标准。
ODBC连接数据库实例:
JDBC是由java编程语言编写的类及接口组成,同时它为程序开发人员提供了一组用于实现对数据库访问的JDBC API,并支持SQL语言。利用JDBC可以将JAVA代码连接到oracle、DB2、SQLServer、MYSQL等数据库,从而实现对数据库中的数据操作的目的。
JDBC连接数据库实例:
JDBC中常用类和接口: