【IT168 评论】SQL语言,同常见的编程语言C、C++、Java、Python一样,是一种编程语言。在每月由Tiobe公布的编程语言排行榜上可看到与SQL相关的语言上榜。同时,SQL又是一种标准,每个数据库厂商都提供了对标准SQL的支持,此外SQL语言还扩展了每个数据库特有的SQL语法。
SQL编程是指通过SQL语言来完成对于数据库的逻辑操作。这个逻辑操作可能比较简单,只需一个很简单的SQL语句来完成;这个逻辑也可能非常复杂,需要联接多张表或子查询等来完成;还有可能是这样的情况,即一条SQL语句并不能马上完成这个逻辑操作,需要建立一个存储过程,通过封装在存储过程中的各种操作来最终得到结果。
由于工作的缘故,笔者的很大一部分时间是对开发人员进行数据库方面的沟通和培训。在这个过程中,笔者发现SQL编程已成为广大程序员日常工作中不可或缺的关键技术之一。学会SQL并不难,要成为优秀的SQL程序员却绝非易事。
大多数程序员都会接触各种不同的项目,每个项目所使用的数据库可能并不相同,因此,很多程序员往往惯性地认为数据库的SQL编程就是SELECT、INSERT、UPDATE、DELETE加上一些控制语句。同时,有些程序员在学习并从事了过程化或面向对象编程之后才转到SQL编程上,因此他们的SQL编程往往带有强烈的程序员特性(后面介绍的SQL编程第一阶段的特性)。在国内,通常很少有公司会聘请面向SQL开发的程序员,在国外却有SQL开发程序员的职位,工作内容是从事与SQL编程相关的开发工作。对于一些数据库方面的考试,如在Oracle的OCP考试分类中,特别区分了面向数据库的管理和面向数据库的开发。
而在国内,大部分SQL程序员就是C、C++或者Java程序员兼的,他们既负责应用程序的开发,也包揽了SQL编程的工作,这样往往会导致在数据库中大量使用或者说滥用非关系模型的思想。这里以笔者在一家网游公司遇到的情况为例进行介绍。通常会因为各种原因需要对运营中的游戏大区进行合并,如将华东一区和华东二区合并,底层所做的操作就是将两个数据库中的数据进行合并,而两个数据库的表结构都是一样的。并区的脚本通常使用SQL来完成,当然复杂一点的可能需要借助一下脚本语言。但是不管怎么说,SQL编程的好坏往往会影响并区时间长短。一个好的并区程序可以在四五个小时内完成几千万数据量的表,而有问题的SQL并区程序一个星期可能都不能完成任务。时间对一个网络游戏意味着很多,可能是玩家的回归,也可能是玩家最终的流失,更不用说那些在并区过程中收入的损失。
请原谅笔者在这里研究程序员的SQL习惯问题,对笔者来说SQL是一个具有重要哲学特征的领域。在这里,我把SQL编程分为三个阶段,当然不是每个人都必须同意笔者的观点。
第一阶段是面向过程化的SQL编程阶段。这是SQL程序员刚开始使用数据库的阶段,此时他们没有多少处理关系模型的经验和基于集合的思想。在这一阶段,经常会有滥用各种工具(如游标、临时表、动态SQL语句等)的情况,而程序员自己通常意识不到他们正在引起破坏。
第二阶段是面向集合的SQL编程阶段。这个阶段SQL程序员开始意识到SQL编程与面向过程和对象编程的不同之处,知道运用SQL编程需要更多的东西,慢慢发现SQL不再是妨碍编程的令人讨厌的东西,而是建立在基于关系模型集合理论的强大基础上的产物。从这一阶段开始,程序员开始相信那些说游标、临时表、动态SQL有害而永远不应该使用的“专家”。
第三阶段是融合的SQL编程阶段。这个阶段SQL程序员已经具有了丰富的知识并对SQL有了深入理解,他们对自己的代码非常自信,但是这并不意味着他们会停止钻研更深入的知识以及提高关键性的技术。在这一阶段,SQL程序员不再迷恋所谓的专家,他们可能意识到即使是游标,也并不是在所有情况下都是无用和有害的。
第三阶段的SQL程序员已经具备了判断什么时候使用纯静态的SQL编程方法不能完成某些任务的能力。尽管纯静态SQL编程是一种非常典型的方法,但是它只在大部分情况下适用。有时候,使用临时表可以显著地改善性能,使用动态SQL可以解决复杂的问题,适当地使用游标可以提高程序运行的效率,使用C、C++这样的过程语言可以带来更大的灵活性,而且不会与关系模型发生冲突。