具体表现为如下四个方面:
- 计算不分步:SQL要求计算在一个语句内写出,必须采用存储过程才能实施分步计算。不分步不仅造成思维困难,而且难以利用中间结果;
- 集合无序:SQL不直接提供使用位置引用集合成员的机制,与次序和定位相关的计算都需要转换才能实施;
- 集合化不彻底:SQL的集合功能简单,只用于表示查询的结果集,而不能作为作为基本数据类型广泛应用;
- 缺乏对象引用:SQL不支持记录引用,数据表间的关联采用同值外键方案,多表联合计算时需要做连接,不仅理解困难而且效率低下;
基于一种计算体系实现数据计算过程,事实上就是将业务问题翻译成形式化计算语法的过程(类似小学生解应用题,将题目翻译成形式化的四则运算)。而由于SQL的上述四个问题,其模型体系在处理复杂运算时不符合人们的自然思维习惯,造成问题翻译的极大障碍,导致将问题解法形式化成计算语法的难度要远远大于解决问题本身。
下面分别举例说明这四个方面的问题。
为了让例子中的SQL尽量简捷,这里大量使用了SQL2003标准的窗口函数,故而采用了对SQL2003标准的支持做得较好的ORACLE数据库语法,采用其它数据库的语法编写这些SQL一般将会更复杂。
一.计算不分步
把复杂的计算分步可以在很大程度地降低问题的难度,反过来,把多步计算汇成一步完成则会提高问题的复杂度。
任务1 销售部的人数,其中北京籍人数,再其中女员工人数?
销售部的人数
1 select count(*) from 员工表 where 部门=‘销售部’
其中北京籍的人数
1 select count(*) from 员工表 where 部门=‘销售部’and 籍贯=‘北京’
在其中的女员工人数
1 select countT(*) from 员工表
2 where 部门=‘销售部’and 籍贯=‘北京’and 性别=‘女’
常规的想法:选出销售部人员计数,再在其中找出其中北京籍人员计数,然后再递进地找出