上篇文章对《机房收费系统--数据库设计》对数据库设计中提到,要想自己的数据库既满足设计三范式,又能够满足需求,存储过程和视图是两个不错的选择。那什么是存储过程?什么是视图?两者又存在什么样的微妙关系?通过本次机房收费系统的操作,有了一个模糊性的认识。
【简介】
存储过程是一组能够能完成特定功能的SQL语句集,只要一次编译便能够反复利用,说白了就是保存在SQL中的一个函数,通过传递参数来实现不同的功能,但它又不同于函数,在特定情况下不必有返回值。
视图是SQL中动态生成的虚拟表,其内容由查询定义,常用于多个表中查询数据的重组,这样不但促使了复杂查询的简单化,而且提高了数据的安全性。在组件视图的过程中,程序提供给用户的数据可以根据权限来适当提取和隐藏。
【机房收费中的应用】
上机与下机字段分别分配了两张表:
上机(卡号,电脑编号,上机时间,上机日期,备注)
下机(卡号,电脑编号,下机日期,下机时间,消费时间,消费金额,现有金额)
当查询一个卡号的上下机记录时就要应用到两张表,建立两个查询过程难免有些繁琐,还要考虑在代码实现端将两个表的内容组合在一起,此时就应考虑用视图的方法进行查询。
在SQL Sever的浏览器中选择创建的数据库--视图--右击新建视图,选择自己需要的表,通过主外键建立连接,选择字段,就生成了想要的视图:
组合查询基本逻辑相同,只是查询过程中使用的参数不同,因此考虑使用存储过程,只需要编译一次,重复利用,不仅减少了代码量,同时减轻了电脑运行负担。
在数据库下的可编程性--存储过程--右键新建存储过程,编写代码:
USE [Charge]
GO
/****** Object: StoredProcedure [dbo].[PROC_GroupQuiery] Script Date: 2015/4/26 20:00:51 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: <王海鹏>
-- Create date: <2015/4/26 20:00:51>
-- Description: <应用于组合查询>
-- =============================================
ALTER PROCEDURE [dbo].[PROC_GroupQuiery]
@field1 as char(30), --查询条件参量
@field2 as char(30),
@field3 as char(30),
@operate1 as char(30), --条件参量:<、>、=
@operate2 as char(30),
@operate3 as char(30),
@conent1 as char(30), --参量字段
@conent2 as char(30),
@conent3 as char(30),
@relate1 as char(30), --组合参量:与、或
@relate2 as char(30),
@getTable as varchar(50) --获得表名
AS
declare @tempSQL varchar(500) --接收select语句
BEGIN
--char(32)为空格,char(39)为单引号
SET @TempSql='SELECT * FROM '+@getTable +' WHERE ' +@field1 +@operate1+char(39) +@conent1 + char(39)
if @relate1 !='' --第一个组合不为空
begin --条件嵌套
SET @TempSql=@TempSql+@relate1+CHAR(32)+@field2 +@operate2+CHAR(39)+@conent2+CHAR(39)
if @relate2!= '' --第二个组合不为空
BEGIN
SET @TempSql=@TempSql+@relate2+CHAR(32)+@Field3+@operate3+CHAR(39)+@conent3+CHAR(39)
END
end
EXECUTE(@TempSql)
END
【对比学习】
1. 返回值不同:视图返回查询得到的虚拟表;存储过程返回一个数据集合;函数返回一个数值或者一张表。
2. 目的不同:存储过程主要用于处理数据;视图主要负责呈现数据,维护数据安全性。
3. 本质相同:都是一组SQL程序集合
【总结】
数据库设计三范式的使用说到底是为了对数据集的解耦,减少数据重复,但另一方面又提出如何保证数据的联系的问题。视图和存储过程正是应这些问题而生。对这些技术的使用很少,还很肤浅,期待在以后的学习过程中不断学习不断利用。