发明SQL的主要目的是为结构化数据提供一种屏弊数据物理存储方案的访问方法,因而在SQL中大量使用了和类英语的词汇和语法以降低其理解和书写困难。而且,作为SQL基础理论的关系代数是个完备的计算体系,原则上可以计算一切。这样看来,我们理所应当地用SQL完成各种数据计算需求。
但是,尽管关系数据库取得了巨大的成功,SQL却显然没有达到其发明初衷,除了极少数简单的查询可由终端用户采用SQL完成外,绝大多数的SQL使用者仍是技术人员,甚至许多复杂的查询对技术人员也不是件容易的事。
这是为什么呢?我们通过一个很简单的例子来考察SQL在计算方面的缺点。 设有一个由三个字段构成的销售业绩表(为了简化问题,省去日期信息):
现在我们想知道出空调和电视销售额都在在前10名的销售员名单。 这个问题相当简单,人们会很自然地设计出如下计算过程:
但是,尽管关系数据库取得了巨大的成功,SQL却显然没有达到其发明初衷,除了极少数简单的查询可由终端用户采用SQL完成外,绝大多数的SQL使用者仍是技术人员,甚至许多复杂的查询对技术人员也不是件容易的事。
这是为什么呢?我们通过一个很简单的例子来考察SQL在计算方面的缺点。 设有一个由三个字段构成的销售业绩表(为了简化问题,省去日期信息):
sales_amount | 销售业绩表 |
sales | 销售员姓名,假定无重名 |
product | 销售的产品 |
amount | 该销售员在该产品上的销售额 |
-
- 按空调销售额排序,找出前10名;
- 按电视销售额排序,找出前10名;
- 对1、2的结果取交集,得到答案;
-
- 找出空调销售额前10名。这很简单:
select top 10 sales from sales_amount where product='AC' order by amount desc - 找出电视销售额前10名。动作一样:
select top 10 sales from sales_amount where product='TV' order by amount desc - 求1、2的交集。这有点麻烦,SQL不支持步骤化,上两步的计算结果无法保存,只能再重抄一遍了:
select * from ( select top 10 sales from sales_amount where product='AC' order
- 找出空调销售额前10名。这很简单: