前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >数据蒋堂 | SQL是描述性语言?

数据蒋堂 | SQL是描述性语言?

作者头像
数据派THU
发布2019-06-05 16:30:33
1K0
发布2019-06-05 16:30:33
举报
文章被收录于专栏:数据派THU数据派THU

作者:蒋步星

来源:数据蒋堂

本文共1200字,建议阅读8分钟。 用SQL写代码时一般不用再关心变量、循环的具体动作,但要操心表、字段这些概念上的计算过程。

我们在学习SQL时,常常会看到这样的论调:SQL是一种描述性语言,你只需要告诉它要做什么,而不需要告诉它怎么做,它会自己找到实现方法。也就是说,你要只用它描述任务目标,而不需要说明计算过程,这和传统的过程式语言有本质的差别。

真是这样的吗?

试一个例子,我们用SQL来查询员工中中国男性的数量,写出来是这样:

代码语言:javascript
复制
SELECT COUNT(*) FROM 员工表 WHERE 国籍='中国' AND 性别='男'

看起来是这样,我们不需要关心具体的计算过程(遍历员工表中每一条记录,碰到符合条件的则计数加1,不符合条件者略过,最后看计数),只要说清要查询的目标就可以了。

再举一例,按部门统计女员工的平均工资:

代码语言:javascript
复制
SELECT 部门,AVERAGE(工资) FROM 员工表 WHERE 性别='女' GROUP BY 部门

也不错,在这里我们确实不必关心到底如何分组和计算平均。

尽管SQL仍然是一种严格语法,我们经过一定的学习才能写出正确的语句,但如果能不关心计算过程,那还是会省很多事的。


我们再看一个例子:找出销售额贡献度在前一半的大客户。如果设计一下计算过程,那么很容易想到这样的流程:

  1. 计算所有客户的总销售额,记为S;
  2. 把客户按销售倒排序,即大的在前小的在后;
  3. 按2的列表从0开始累加客户的销售额,超过S/2时停止,则已经遍历过后客户则是目标客户。

那么,用SQL写出来是什么样的呢?

代码语言:javascript
复制
SELECT 客户,销售额,销售额累计FROM ( SELECT 客户,销售额,SUM(销售额) OVER (ORDER BY 销售额 DESC) 销售额累计 FROM 订单统计表)WHERE 2*销售额累计 < (SELECT SUM(销售额) FROM 订单统计表)

仔细看一下这个SQL(我没想出更简单的写法了),它几乎是在严格地描述上述过程,所不同的只是书写次序(SQL把开始计算总销售额写在了后面),和微小的逻辑差异(要把所有的累计销售额计算出来,再找出前面的)。

说好的只要描述任务目标而不必关心计算过程呢?


再看简单一些的例子:查询销售额贡献最多的10名客户。

某些SQL写出来是这样:

代码语言:javascript
复制
SELECT TOP 10 客户 FROM 订单统计表 ORDER BY 销售额 DESC

如果用某著名数据库来做,还得用子查询:

代码语言:javascript
复制
SELECT 客户 FROM ( SELECT rownumber rn,客户 FROM 订单统计表 ORDER BY 销售额 DESC )WHERE rn<=10

这两个SQL都明白无误地告诉我们计算过程:按销售额倒排序之后取前面10个。


如果再找个数百行的SQL(存储过程)来看,则可以更清楚地看到SQL照样在解释计算过程,而且不同的计算过程还会带来截然不同的计算性能甚至计算结果。

其实。任何程序设计语言都可以说在某种程度下的描述性语言:只需要关心目标而不必关心过程。如用Java写程序,你只要关心变量如何变化,而不必关心CPU中寄存器的动作,但用汇编语言就要关心;同样,而用汇编语言时,虽然你要关心寄存器的取值,但却不必关心CPU里与非门是如何动作的;用SQL写代码时一般不用再关心变量、循环的具体动作,但要操心表、字段这些概念上的计算过程。SQL和其它程序设计语言在描述问题的解决方法上只是抽象层次不同,对于过程的说明并没有任何本质的不同。

前面那两个例子之所以让我们感觉SQL象是所谓描述性语言,只是因为情况非常简单,恰好只是SQL抽象层次内的基本运算。而SQL因为长得又很象英语,在简单情况时易读易写,更容易给人这种错觉。

SQL是非常成功的程序语言,但说它是一种与众不同的描述性语言,却是一句鬼话。拿一些简单问题举例,能蒙骗住暂时没有深入思考的人。其实,只要把问题稍复杂化一点,这个说法就会露馅。可惜,很多人都不会去做哪怕一点点地深入求证,而只是人云亦云。SQL不比其它语言有更多的“描述性”,这并不减少SQL的成功程度。

专栏作者简介

润乾软件创始人、首席科学家

清华大学计算机硕士,中国大数据产业生态联盟专家委员,著有《非线性报表模型原理》等,1989年,中国首个国际奥林匹克数学竞赛团体冠军成员,个人金牌;2000年,创立润乾公司;2004年,首次在润乾报表中提出非线性报表模型,完美解决了中国式复杂报表制表难题,目前该模型已经成为报表行业的标准;2014年,经过7年开发,润乾软件发布不依赖关系代数模型的计算引擎——集算器,有效地提高了复杂结构化大数据计算的开发和运算效率;2015年,润乾软件被福布斯中文网站评为“2015福布斯中国非上市潜力企业100强”;2016、2017年,荣获中国电子信息产业发展研究院评选的“中国软件和信息服务业十大领军人物”;2017年度中国数据大工匠、数据领域专业技术讲堂《数据蒋堂》创办者。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-06-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据派THU 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
大数据
全栈大数据产品,面向海量数据场景,帮助您 “智理无数,心中有数”!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档