从算法入手讲解SQL Server的典型示例
本文从算法入手同时通过实例来讲解如何在SQL Server数据库中实现最优最简的整个过程。
算法是计算机科学中一个重要的研究方向,是解决复杂问题的关键。在计算机世界中,算法无处不在。数据库是存储数据和执行大批量计算的场所,在数据库中使用一些简单的SQL命令,进行存储、查询、统计、以解决现实世界中的问题已经是屡见不鲜。随着数据量的大幅度增加和业务规则的日益复杂,越来越需要一种专门的方法来满足效率和准确性方面的要求。如何把解决问题的复杂算法转换为数据库能够执行的命令,也是数据库应用技术研究的一个方面。本文以MSSQL中的命令来阐述例子。
数据库中可以存储实体的数据集合,在进行运算时,数据库使用批量计算的方法来处理数据,批量的从存储设备上读取数据,处理之后又批量的写回存储设备。有的数据库提供了游标,游标可以读取出表中一行的数据中的每一个字段,对这些字段进行复杂的业务规则计算,然后再写回数据库中。与使用批量的方法比较,批量计算的方法消耗的资源相对比较少,而使用游标则占用太多的资源,速度比较慢,效率较低并且还有加锁条件等许多的限制。
比如对于数据库中存储了学生成绩student_Score(sno,cno,score,level),成绩从0分到100分不等,如果需要在分数的后面存储一个字段字level来说明成绩的优劣,90分以上的A,80-90分为B,60-80分的为C,60分以下的为D,以下有几种算法都可以达到同样的目标:
1.定义一个游标,选择student_Score表中所有的成绩记录,定义一个存储成绩的变量@cur_score,存储当前纪录的分数,定义一个存储当前分数所在成绩级别的变量@cur_level,用以存储成绩好坏的标记。算法如下:如果游标中的纪录不为空,从游标中取出当前纪录的成绩,判断成绩所在的分数段,把结果存储在变量@cur_level中,以@cur_level中的值更新当前纪录中的level字段。整个过程需要至少读取数据库两次,一次为获得纪录,一次需要写入数据库,每条记录都需要经过这个过程,效率相对低。
2.依次批量更新数据库,把所有的level字段的值设置为D,再次更新数据库,把成绩大于等于60的纪录的Level字段更新为C,依次更新B、A。这样做的一个缺点是有些纪录的Level字段被更新多次,比如一个记录最后的Level字段的值是A,则它首先被更新为D,依次被更新为C、B、A。这些重复的更新是可以被消除的,把算法改进一下就可以省去重复更新的花费。更新后的算法是这样的,把成绩介于0和60分的纪录的Level字段更新为D,依次更新各个分数段的成绩。实现的这种算法的SQL语句并不难写出,使用Between…and…表达式即可以表达例如介于80到90之间纪录的选择条件。
3.鉴于第二种方法最后的分析,使用between…and…表达式同时参照一个表来更新纪录,则可以方便表达分数段与相应的level信息,把这些信息存储到一个表level_about中,在更新student_score表的过程中可以参照这个表。计算的过程中,需要把level_about表的内容读出来,然后进行计算。对于整个计算过程来说,牺牲空间和部分效率来换来操作方便,,由于现在计算机的速度相当快,level_about表占用的空间又很小,这方面的损失可以忽略不记。Level_about表中的信息至少包含3个字段:start_score,记录起始分数,end_score记录终止分数,level记录介于起始分数和终止分数之间的分数应该得到的成绩。表中的数据应该类似于这样:
Start_score End_score level
0 59 D
60 79 C
80 89 B
90 100 A
更新student_Score表中的纪录需要依据Start_score和End_score来判断当前记录中成绩所在的Level,在MSSQL中实现的SQL语句:
Update student_score set
student_score.level=level_about.level from
level_about where student.score
between level_about.start_score and level_about.end_score
比较以上3种方法,实现同一个目的采用不同的算法实现的效果是不同的。
一些简单的算法不需要经过修改就可以直接应用到数据库中,比如业务需要每天晚上都需要结算一天的情况,一周两次自动结算奖金,结算奖金时间在每周再周一和周四的晚上0点。为了实现系统的自动结算,需要使用系统的任务,给系统制订一个作业,指定每天晚上0点结算就可以实现系统的自动结算(由于结算的时间间隔可能是会变化,不能使用作业中的定时功能)。为了可以在周一和周四结算,在数据库中设置一个表misc,其中的字段相当于全局变量,表中只有一条纪录,使用其中的一个字段(days)来记录当前结算的次数,也就是以系统开始运行为标准经过的天数。系统执行任务同时更新misc表中的days使其增长update misc set days=days+1。
业务需求是每周一和周四结算奖金,不难发现奇数次结算依次相差7天,偶数次结算依次相差7天,相邻奇数次和偶数此结算相差3天,可以使用求余的方式来统一这个问题。如果当前天数(days)与7求余结果为0或者当前天数(days)减去3之后求余的结果为0,则当前天数是结算的日期。具体的实现的算法是:
1、提取当前的天数到一个变量中declare @days int set @days=(select days from misc)。
2、判断是否满足结算条件if @days%7=0 or (@days-3)%7=0 begin…end。
类似于这样简单的算法可以直接的应用到数据库中而不会发生问题。
复杂的业务规则需要复杂的算法,复杂的规则对于一个有具体数字的变量来说,实现起来已经比较复杂,如果应用到数据库中存储的杂乱无章的一大批数字,并且实现批量的计算,则需要对算法进行大幅度的调整。
比如业务规则需要在员工每4000元的奖金中扣除400元作为重复消费,并且在扣除最后的400元,重复消费一次奖励一件产品,需要在数据库中使用一个表(award_repeat)记录产生的重复消费。如果一次扣除的奖金不足400元,在下次结算的时候接着扣除,直到扣除的奖金够400元,然后奖励一件产品,进入下次的循环,比如现在奖金总数达到了3600元,则不会扣除,如果达到了3700元,则要扣除100元,如果达到了7700元,则要扣除410元,并且产生一个重复消费。
为了实现这个规则,在员工表(member)中记录每个员工奖金的总数([total_award]),同时记录重复消费的次数([repeat_num]),在另外的过渡表(award_day)中记录每次的奖金和每次扣除重复消费的奖金,最后在奖金表(award)中综合当次奖金和当次结算需要扣除的重复消费就得到了当次结算实际发放的奖金。采用批量的计算方法,实现的算法是:在计算奖金之后,扣除重复消费之前把当前奖金累加到员工的([total_award])字段([total_award]),记录没有扣除重复消费的所有的奖金总和。实现重复消费计算的的算法是,设定条件(F1)为在member表中存在奖金总数大于等于重复消费次数加1后乘以4000,如果有满足条件F1的记录,则选择满足条件的纪录中主键和当前的日期(days)插入到重复消费表(award_repeat)中,然后更新member表中满足条件F1的repeat_num使其增加1,重复检查条件F1,直到member表中没有满足条件F1纪录。
结论:在数据库中研究和实现算法有着相当大的困难,同时也是一种挑战。随着现实世界中业务规则的日益复杂,相应的数据库应用软件实现业务规则需要的算法也日益复杂,把复杂的算法应用在数据库中需要找到一个统一的方式,在熟悉业务规则的前提下,根据数据库的特点和相应的执行命令的能力,找到一种适合数据库批量计算的步骤是解决问题的关键。
分享到:
相关推荐
数据库设计是IT领域中的核心部分,特别是在关系型数据库如SQL Server中,良好的设计能确保系统的高效性和数据的一致性。以下是对"sqlserver 数据库设计模板"的详细说明: 1. **引言** - **编写目的**:设计模板...
### 基于SQL Server 2000下的数据挖掘算法研究 #### 一、引言 随着信息技术的发展,数据库的规模不断扩大,如何从海量的数据中提取有价值的信息成为了一个重要的研究课题。数据挖掘(Data Mining)就是从大量数据...
Microsoft SQL Server Compact 4.0 for VB /MFC SQL Server Compact 4是微软WebMatlab的默认数据库,它是一个Web技术的堆栈,用于在Windows平台上轻松地构建和部署网站。 为了增强开发和调试能力,包括设计...
它实现了JDBC API的核心类,如`java.sql.DriverManager`,`java.sql.Connection`等,使得Java应用程序可以建立到SQL Server的连接,执行SQL语句并处理结果集。 2. mssqlserver.jar:此JAR文件是SQL Server特定的,...
本篇文章将详细介绍如何在SQL Server 2005环境下轻松实现这三种算法的函数,帮助你有效地进行数据处理。 一、Base64编码 Base64是一种用于在网络上传输二进制数据的编码方式,它可以将任意二进制数据转换为可打印的...
本文将详细讲解如何在SQL Server 2005中实现Base64的加密和解密功能。 一、Base64编码原理 Base64编码基于64个可打印字符,包括大小写字母、数字以及"+"和"/",还有一个特殊字符"="用于填充。它将每3个字节的二进制...
SQL Server本身并未提供直接支持MD5加密算法的内置函数,但可以通过自定义函数的方式实现这一功能。本文将详细介绍如何在SQL Server环境中创建并使用MD5加密函数,以及相关的辅助函数。 #### 二、MD5加密原理简介 ...
SQL Server引擎原理主要涉及到SQL Server的设计思想、发展历程以及在关系数据库中的核心算法和优化策略。首先,SQL Server的设计目标是成为性能最优、最可靠、最可扩展和最易使用的数据库管理系统。为了达到这些目标...
3. **msutil.jar**: 这个JAR文件包含了SQL Server的实用工具类,用于辅助数据库操作,如日期时间处理、字符串操作、加密算法等。这些工具类可以提高开发效率,使得开发人员不必自行编写这些常见但又复杂的函数。 ...
本书全面深入地介绍了Microsoft SQL Server 2008中高级T-SQL查询、性能优化等方面的内容,以及SQL Server 2008新增加的一些特性。主要内容包括SQL的基础理论、查询优化、查询算法及复杂度,以及在使用子查询、表...
3. SQL Server海量算法优化: 针对大数据量的处理,Sql Server提供了多种优化策略,包括索引优化、查询优化、存储过程使用、分区表、并行查询等。理解如何编写高效的SQL语句,利用索引提升查询速度,以及通过执行...
SQL Server 2005的Data Mining功能提供了多种预定义的挖掘算法,如决策树、聚类、序列挖掘等,帮助企业发现隐藏的模式和趋势。数据挖掘模型可以通过SQL查询或者在Excel中直接使用,使得非技术人员也能进行预测分析。...
下面将详细介绍如何使用SQL Server 2005编写一个简单的脚本来找出从m到n之间的所有素数: #### 步骤一:定义变量 首先,我们需要定义两个整型变量`@a`和`@b`。其中`@a`用于循环遍历m到n之间的每一个数,而`@b`用于...
SQL Server 2008 R2是微软公司推出的一款企业级数据库管理系统,是SQL Server 2008的增强版,提供了更为丰富的功能和更高的性能。这个版本在数据存储、查询处理、安全性、可用性以及商业智能方面都有显著提升,为...
### SQLServer基础篇知识点梳理 #### 一、SQL Server 简介 1. **SQL Server 定义**: - SQL Server 是由微软...从SQL Server的基本概念、发展历程到具体的表管理、T-SQL操作、数据库对象等各个方面进行了全面的介绍。
【标题】"基于sqlserver+python-tkinter的数据库课程设计"揭示了这个项目的核心技术栈,即使用SQL Server作为数据库管理系统,结合Python的Tkinter库进行图形用户界面(GUI)开发,完成一个课程设计任务。...
本示例主要展示了如何利用SQL Server的排序规则和自定义函数来实现这一功能。 首先,我们要理解SQL Server的排序规则(Collation)。排序规则决定了字符的比较方式,包括字符集(Charset)和排序顺序(Collation)...