您的当前位置:首页正文

数据库基础知识(二)

2024-11-07 来源:个人技术集锦




第六章 关系数据理论

6.1 问题的提出

a.任何一种数据库应用系统,不管是层次的、网状的、还是关系的,都会遇到如何构造合适的数据模式即逻辑结构的问题。由于关系模型有严格的书数学理论基础,并且可以向别的数据模型转换。因此,人们以关系模型为背景,形成了数据库逻辑设计的有力工具——关系数据库规范化理论。

b.不规范的关系模式常出现的四个问题

        数据冗余:(Sno,Sdept,Mname,Cno,Grade) 每个系的系主任名字重复出现

        更新异常:(Sno,Sdept,Mname,Cno,Grade) 某个系更换系主任后相关的每个学生元组都要变更

        插入异常:(Sno,Sdept,Mname,Cno,Grade) 某个系新成立但没有招生,添加系和系主任信息失败

        删除异常:(Sno,Sdept,Mname,Cno,Grade) 某个系学生全部毕业,学生信息需要删除时系信息也被影响

6.2 规范化

6.2.1 函数依赖

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

6.2.2 范式

1NF:数据库的每一列都是不可分割的基本数据项

2NF:满足第一范式,且非主属性必须完全依赖于候选码。

3NF:满足第二范式,且非主属性都不传递依赖于任一候选码。

BCNF:满足第三范式,且每个字段都不传递依赖于任一候选码。

6.2.3 多值依赖

 

6.3 数据依赖的公理系统

Armstrong公理系统

6.4 模式的分解

既要保持函数依赖,又要具有无损连接

第七章 数据库设计

7.1 需求分析阶段

 

7.2 概念结构设计阶段

 

7.3 逻辑结构设计阶段

 

7.4 物理结构设计阶段

 

7.5 数据库实施阶段

 

7.6 数据库运行和维护阶段

 

第八章 数据库编程

8.1 概论

标准SQL是非过程化的查询语言,具有操作统一、面向集合、功能丰富、使用简单等多项优点。但和程序设计语言相比,高度非过程化的优点也造成了它的一个弱点:缺少流程控制能力,难以实现应用业务中的逻辑控制。SQL编程技术可以有效克服SQL语言实现复杂应用方面的不足,提高应用系统和数据库管理系统间的互操作性。

在应用系统中使用SQL编程来访问和管理数据库中数据的方式主要有:

8.2 嵌入式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
这个语句关闭先前打开的游标。

8.3 过程化SQL

过程化SQL是对SQL的扩展,使其增加了过程化语句功能。过程化SQL程序的基本结构是块。所有的过程化SQL程序都是由块组成的。这些块之间可以相互嵌套,每个块完成一个逻辑操作。

 

8.4 存储过程和函数

8.4.1 存储过程

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'

8.4.2 函数

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)

8.5 ODBC和JDBC编程

8.5.1 ODBC编程

微软推出的接口标准。

ODBC连接数据库实例:

 

8.5.2 JDBC编程

JDBC是由java编程语言编写的类及接口组成,同时它为程序开发人员提供了一组用于实现对数据库访问的JDBC API,并支持SQL语言。利用JDBC可以将JAVA代码连接到oracle、DB2、SQLServer、MYSQL等数据库,从而实现对数据库中的数据操作的目的。

JDBC连接数据库实例:

JDBC中常用类和接口:

 


Top