数据蒋堂 | SQL是描述性语言?
作者:蒋步星
来源:数据蒋堂
本文共1200字,建议阅读8分钟。
用SQL写代码时一般不用再关心变量、循环的具体动作,但要操心表、字段这些概念上的计算过程。
我们在学习SQL时,常常会看到这样的论调:SQL是一种描述性语言,你只需要告诉它要做什么,而不需要告诉它怎么做,它会自己找到实现方法。也就是说,你要只用它描述任务目标,而不需要说明计算过程,这和传统的过程式语言有本质的差别。
真是这样的吗?
试一个例子,我们用SQL来查询员工中中国男性的数量,写出来是这样:
SELECT COUNT(*) FROM 员工表 WHERE 国籍='中国' AND 性别='男'
看起来是这样,我们不需要关心具体的计算过程(遍历员工表中每一条记录,碰到符合条件的则计数加1,不符合条件者略过,最后看计数),只要说清要查询的目标就可以了。
再举一例,按部门统计女员工的平均工资:
SELECT 部门,AVERAGE(工资) FROM 员工表 WHERE 性别='女' GROUP BY 部门
也不错,在这里我们确实不必关心到底如何分组和计算平均。
尽管SQL仍然是一种严格语法,我们经过一定的学习才能写出正确的语句,但如果能不关心计算过程,那还是会省很多事的。
我们再看一个例子:找出销售额贡献度在前一半的大客户。如果设计一下计算过程,那么很容易想到这样的流程:
计算所有客户的总销售额,记为S;
把客户按销售倒排序,即大的在前小的在后;
按2的列表从0开始累加客户的销售额,超过S/2时停止,则已经遍历过后客户则是目标客户。
那么,用SQL写出来是什么样的呢?
SELECT 客户,销售额,销售额累计FROM ( SELECT 客户,销售额,SUM(销售额) OVER (ORDER BY 销售额 DESC) 销售额累计 FROM 订单统计表)WHERE 2*销售额累计 < (SELECT SUM(销售额) FROM 订单统计表)
仔细看一下这个SQL(我没想出更简单的写法了),它几乎是在严格地描述上述过程,所不同的只是书写次序(SQL把开始计算总销售额写在了后面),和微小的逻辑差异(要把所有的累计销售额计算出来,再找出前面的)。
说好的只要描述任务目标而不必关心计算过程呢?
再看简单一些的例子:查询销售额贡献最多的10名客户。
某些SQL写出来是这样:
SELECT TOP 10 客户 FROM 订单统计表 ORDER BY 销售额 DESC
如果用某著名数据库来做,还得用子查询:
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年度中国数据大工匠、数据领域专业技术讲堂《数据蒋堂》创办者。
数据蒋堂
《数据蒋堂》的作者蒋步星,从事信息系统建设和数据处理长达20多年的时间。他丰富的工程经验与深厚的理论功底相互融合、创新思想与传统观念的相互碰撞,虚拟与现实的相互交织,产生出了一篇篇的沥血之作。此连载的内容涉及从数据呈现、采集到加工计算再到存储以及挖掘等各个方面。大可观数据世界之远景、小可看技术疑难之细节。针对数据领域一些技术难点,站在研发人员的角度从浅入深,进行全方位、360度无死角深度剖析;对于一些业内观点,站在技术人员角度阐述自己的思考和理解。蒋步星还会对大数据的发展,站在业内专家角度给予预测和推断。静下心来认真研读你会发现,《数据蒋堂》的文章,有的会让用户避免重复前人走过的弯路,有的会让攻城狮面对扎心的难题茅塞顿开,有的会为初入行业的读者提供一把开启数据世界的钥匙,有的甚至会让业内专家大跌眼镜,产生思想交锋。
数据蒋堂第二年往期回顾:
数据蒋堂 | 存储和计算技术的选择
数据蒋堂 | 人工智能中的“人工”
数据蒋堂 | 中国报表漫谈
数据蒋堂 | 内存数据集产生的隐性成本
数据蒋堂 | 多维分析预汇总的功能盲区
数据蒋堂 | 多维分析预汇总的存储容量
数据蒋堂 | 多维分析预汇总的方案探讨
数据蒋堂 | 数据库的封闭性
数据蒋堂 | 内存数据集产生的隐性成本
数据蒋堂 | 前半有序的大数据排序
数据蒋堂 | “后半”有序的分组
数据蒋堂 | 时序数据从分表到分库
数据蒋堂 | BI系统的前置计算
数据蒋堂 | SQL是描述性语言?相关推荐
- sql中如何统计各种零件的总数量_数据蒋堂 | SQL是描述性语言?
作者:蒋步星 来源:数据蒋堂 本文共1200字,建议阅读8分钟.用SQL写代码时一般不用再关心变量.循环的具体动作,但要操心表.字段这些概念上的计算过程. 我们在学习SQL时,常常会看到这样的论调:S ...
- 数据蒋堂 | 报表工具的SQL植入风险
作者:蒋步星 来源:数据蒋堂 本文共2600字,建议阅读10分钟. 报表开发人员如何规避安全漏洞问题? 所有的报表工具都会提供参数功能,主要都是用于根据用户输入的查询条件来选取合适的数据.比如希望查询 ...
- 数据蒋堂 | BI系统中容易被忽视的数据源功能
作者:蒋步星 来源:数据蒋堂 本文共1100字,建议阅读8分钟. 关注BI系统数据源有关的后台功能点. 用户在选购BI解决方案的时候,常常会更关注界面环节的功能指标,比如美观性.操作的流畅性.移动端支 ...
- 数据蒋堂 | 做基础软件要投入很多钱?
作者:蒋步星 来源:数据蒋堂 本文共1100字,建议阅读8分钟. 看起来还真是,似乎还要再加大投入才行? 现在有个说法,国家对基础软硬件的投入太少,经常会说微软.Oracle.Intel这些巨头每年的 ...
- 数据蒋堂 | 大数据技术的4个E
作者:蒋步星 来源:数据蒋堂 本文共1100字,建议阅读8分钟. 本文将大数据特点总结成4个E,可作为选择大数据技术解决方案的参考. 大数据的4个V说法在业界已经尽人皆知,这是指的大数据本身的特征.现 ...
- 数据蒋堂 | 大清单报表的打印?
作者:蒋步星 来源:数据蒋堂 本文共900字,建议阅读5分钟. 报表打印也需要做一个缓存机制吗? 上一期文章<大清单报表应当怎么做?>中,我们谈了大清单报表的呈现方法,其实有时候这些报表还 ...
- 数据蒋堂 | 数据压缩手段
作者:蒋步星 来源:数据蒋堂 本文共2600字,建议阅读9分钟.如果能物理地减少数据存储量,也就自然而然地减少了外存访问量. 我们知道,外存(硬盘)的性能远远低于内存,即使是同样复杂度的运算(CPU计 ...
- 数据蒋堂 | 怎样生成有关联的测试数据
作者:蒋步星 来源:数据蒋堂 本文共1500字,建议阅读7分钟. 如何在多表情况下生成大规模测试数据时还能保证合理的关联性呢? 在向用户推荐新的数据处理技术,特别是涉及性能优化的场景时,经常会碰到生成 ...
- 数据蒋堂 | 内置的数据无法实现高性能
作者:蒋步星 来源:数据蒋堂 本文共1400字,建议阅读7分钟. 获得了数据库的方便性就得不到高性能,要数据外置的高性能就要牺牲方便性. 这里说的"内", 是指数据库之内. 当数据 ...
最新文章
- python 文件和目录操作
- Linux有趣小工具命令,终端中的乐趣:6个有趣的Linux命令行工具
- 关于nginx配置的不完全总结
- Http 请求处理流程(转)
- POJ-3067 Japan---树状数组逆序对变形
- Unreal Engine 4 中的 UI 优化技巧
- 【报告分享】2021年中国互联网保险消费者洞察报告.pdf(附下载链接)
- AcWing 1209. 带分数(排列型枚举)
- apache 版本_Apache官宣!ShardingSphere首个Apache版本发布
- linux(ubuntu) 查看系统设备信息
- 在VS中查看文件是谁签出的
- Dialog是逻辑字体,实际绘制时会选择不同字体
- python调用QT界面使用方法
- 公司计算机程序员英语怎么说,程序员英语怎么说
- 欢迎来到Wagtail的文档
- 【新星计划】Matlab pid参数调节工具箱
- leetcode-739.每日温度-单调栈
- 您的滴滴2020年度出行报告,请查收!
- python图表_使用Python绘制图表大全总结
- 51单片机生成二维码
热门文章
- 剑指_数组中出现次数超过一半的数字
- node上传资源到又拍云
- Fiddler小技巧-测试上传文件接口多参数并传情况
- [转]在C#中使用API回调函数的方法
- devexpress chart 线形图
- 弃用notepad++
- 惠普鼠标g260_惠普g260鼠标怎么样 惠普鼠标怎么样?
- ztree树封装 json实例_小白7天入门PHP Web开发 - Day 6[下](综合)个人博客实例讲解用户数据的存储...
- add-apt-repository命令详解_Dcr_Hs的博客-CSDN博客_add-apt-repository
- 深入理解pandas读取excel,txt,csv文件等命令