SQL 像英语是个善意的错误

我们知道,SQL 很像英语,简单的 SQL 语句直接可以作为英语读。除了 SQL 外,其它主要程序设计语言都没有这样,语法中就算有英语单词也仅仅是作为某些概念或操作的助记符而已,写出来的是形式化的程序语句 (statement) 而不是英语句子(sentence)。而 SQL 不同,它会把整个句子写成符合英语习惯的形式,还会补充很多不必要的介词,比如 FROM 作为语句的运算主体却被写到后面,GROUP 后面要写一个多余的 BY。
为什么会这样?很容易想到的理由是希望非程序设计人员也能使用。用户只要会读写英语,就可以写出 SQL 来查询数据。这显然是个善意的初衷,但结果却不尽如人意。绝大多数业务人员只会用 SQL 写非常简单的查询,而对于这类查询,现在有强大的 BI 软件能提供更为便捷直观的可视化界面来协助,并不需要直接手写语句,这个设计初衷就失去意义。反过来, 经常使用 SQL 做运算的仍然是程序员,SQL 还是一种编程语言,像不像英语对于程序员理解并没有多大差别,反而会带来不小的困难。
事实上,SQL 是一种语法非常严格的语言,语句中任何一点不合规的地方就会被数据库拒绝,使用者必须认真学习并遵守其语法规则,这和其它程序设计语言并没什么两样。而自然语言真正的优势在于具有模糊性,可以一定程度接受不严格的语法,但 SQL 并没有支持这一点,在发明 SQL 那个年代也实现不了这个特性。

像英语的好处体现不了,反而有不少坏处,将语法设计得像自然语言,看起来容易掌握,其实恰恰相反。
贴近自然语言带来的主要坏处是非过程性。程序逻辑一般是分步执行的,用变量记录中间结果,供后面的步骤使用。但自然语言不是这样,两句话之间的引用关系靠少量几个固定的代词维系,不精确也不方便。所以会把针对同一个主语的动作尽量拼到一句话中,这样就不必借助代词了。在 SQL 中的对应表现就是在一条语句中配有多个动作,SELECT、WHERE、GROUP 这些本来是无关的动作,在其它程序语言中通常会设计成多个函数,但在 SQL 中都会设计成语句的子句。还有,像 WHERE 和 HAVING 根本是一个意思,只对针对的对象不同,在拼到一个句子中就要采用两个词以示区别,让人费解(很多初学者会对 HAVING 很晕)。
实在一句话无法描述的复杂情况,在自然语言中就会使用从句了。这在 SQL 中的表现就是子查询,还可能出现多层嵌套的子查询,这种现象在其它程序设计语言中是不常见的。而且,子查询也要像自然语言,每次都要有个 SELECT…FROM,就会让人觉得非常啰嗦,代码变得长。

分步是降低理解和执行难度的有效办法。本来挺简单分几步能做到的事情,如果不分步就会很绕。可以想象,如果老师要求小学生做应用题时只能列一个算式完成,小朋友们会多么苦恼(当然,不乏一些聪明孩子搞得定)。
比如我们要找出销售额超过平均值两倍的客户,自然思维方式就是先计算出销售额的平均值,再找出销售额超这个值两倍的客户,两个语句完成。而 SQL 的写法就需要用子查询写成更长的一句。这个例子还算好懂,只有两层,一般自然语言的从句用来描述两层关系的理解难度还可以接受,但实际复杂的查询涉及到三五层的比比皆是,严重增加理解难度。
不提倡分步,就会导致单句 SQL 很长。程序员面临的复杂 SQL 语句,很少以行计,经常是以 K 计。而同样的 100 行代码,分成 100 个语句还是只有 1 个语句,其复杂度完全不是一个级别的。这种代码理解起来非常困难,好不容易写出来,过两个月后自己都读不懂,而且太长不分步的单句非常难以调试,开发周期也更长。

关于过程性,业界有个说法,SQL 是声明式语言,用户只要关心要什么,而不必关心怎么做,数据库会自动找解决方案,这档的语言不需要支持过程性。我们在前面已经批判过这个说法。
数据库厂商应该是也发现了 SQL 缺乏过程性的问题,所以后来增加了 CTE 语法来弥补,相当于提供了可以命名的中间变量。存储过程也相当于可以分步执行 SQL,有了分支循环甚至子程序。结果还是要回到过程式语言的老路,那还不如直接就设计成这样。
对于程序语言来说,好的分步计算机制带来的易用性要远远超过长得像自然语言。

更多问题前往乾学院探讨交流!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/58780.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Vue3.js】计算属性监视属性的深度解析

🧑‍💼 一名茫茫大海中沉浮的小小程序员🍬 👉 你的一键四连 (关注 点赞收藏评论)是我更新的最大动力❤️! 📑 目录 🔽 前言1️⃣ 计算属性概述2️⃣ 监视属性概述3️⃣ 计算属性与监视属性的对比…

PHP反序列化原生类字符串逃逸框架反序列化利用

PHP反序列化 概念 序列化的原因:为了解决开发中数据传输和数据解析的一个情况(类似于要发送一个椅子快递,不可能整个椅子打包发送,这是非常不方便的,所以就要对椅子进行序列化处理,让椅子分成很多部分在一起打包发送…

CentOS 文件系统扩容与缩容

一、 概述 理解Linux文件系统的管理,需要了解以下的一张图: 一般使用LVM (Logical Volume Manager) 管理磁盘存储,该工具允许用户更灵活地分配和管理存储空间。主要有以下几个概念: PV(Physical Volume,物…

windows环境下,使用docker搭建redis集群

参考: https://blog.csdn.net/weixin_46594796/article/details/137864842 https://www.cnblogs.com/niceyoo/p/14118146.html 史上最详细Docker搭建Redis Cluster集群环境 值得收藏 每步都有图,不用担心学不会-腾讯云开发者社区-腾讯云 一、基础环境描述 宿主机:192.168…

大模型面试题全面总结:每一道都是硬核挑战

节前,我们组织了一场算法岗技术&面试讨论会,邀请了一些互联网大厂同学、参加社招和校招面试的同学,针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。 今天分享…

arcgis坐标系问题

2000数据框的工程只能打开2000坐标系的矢量数据和栅格数据(影像图),如果打开80的数据则会投影错误,出现较大偏差。 解决方案:80数据框打开80数据,2000数据库打开2000数据。

六西格玛项目助力,手术机器人零部件国产化稳中求胜——张驰咨询

项目背景 XR-1000型腔镜手术机器人是某头部手术机器人企业推出的高端手术设备,专注于微创手术领域,具有高度的精确性和稳定性。而XR-1000型机器人使用的部分核心零部件长期依赖进口,特别是高精度电机、关节执行机构和视觉系统等,…

模型拆解(三):EGNet、FMFINet、MJRBM

文章目录 一、EGNet1.1编码器:VGG16的扩展网络 二、EMFINet2.1编码器:三分支并行卷积编码器2.2CFFM:级联特征融合模块2.3Edge Module:突出边缘提取模块2.4Bridge Module:桥接器2.5解码器:深度特征融合解码器…

【传知代码】图像处理解决种子计数方法

文章目录 一、背景及意义介绍研究背景农业考种需求传统计数方法的局限性人工计数仪器设备计数 研究意义提高育种效率提高计数准确性广泛的适用性数据存档与分析便利 二、概述三、材料与数据准备以及方法介绍整体流程图像采集图像预处理形态学操作腐蚀运算开运算 图像二值化种子…

【酒店管理与推荐系统】Python+Django网页界面平台+推荐算法+管理系统网站

一、介绍 酒店管理系统。基于Python开发,前端使用HTML、CSS、BootStrap等技术搭建页面,后端使用Django框架处理用户响应请求,主要功能如下: 分为普通用户和管理员两个角色普通用户:登录、注册、查看房间详情、收藏、…

List 列表基础用法

List 列表基础用法 列表可以完成大多数集合类的数据结构实现。列表中元素的类型可以不相同,它支持数字,字符串甚至可以包含列表(所谓嵌套)。 列表是写在方括号 [] 之间、用逗号分隔开的元素列表。 和字符串一样,列表…

UDP组播测试

支持组播的接口: ip a | grep MULTICAST 环回接口虽然显示不支持组播,实际也可以用于本地测试。 添加路由(非必须?): ip route add 239.0.0.0/24 via 10.10.10.206 dev eth0 开放防火墙: 查…

大人能不能抱孩子坐在副驾

‌大人不能抱孩子坐在副驾驶位置‌。虽然交通法规没有明确规定抱孩子坐副驾驶是违法行为,但这种行为存在严重的安全隐患,因此不建议这样做。 安全隐患 ‌安全气囊的危害‌:在车辆发生碰撞时,安全气囊会瞬间弹出,可能会…

C#/.NET/.NET Core技术前沿周刊 | 第 11 期(2024年10.21-10.31)

前言 C#/.NET/.NET Core技术前沿周刊,你的每周技术指南针!记录、追踪C#/.NET/.NET Core领域、生态的每周最新、最实用、最有价值的技术文章、社区动态、优质项目和学习资源等。让你时刻站在技术前沿,助力技术成长与视野拓宽。 欢迎投稿、推荐…

redis7学习笔记

文章目录 1. 简介1.1 功能介绍1.1.1 分布式缓存1.1.2 内存存储和持久化(RDBAOF)1.1.3 高可用架构搭配1.1.4 缓存穿透、击穿、雪崩1.1.5 分布式锁1.1.6 队列 1.2 数据类型StringListHashSetZSetGEOHyperLogLogBitmapBitfieldStream 2. 命令2.1 通用命令copydeldumpexistsexpire …

动态规划-回文串系列——516.最长回文子序列

1.题目解析 题目来源:516.最长回文子序列——力扣 测试用例 2.算法原理 1.状态表示 求某段字符的最长回文子序列长度需要知道原来的长度以及判断后续的值是否能与之前的回文子序列构成新的回文子序列,因此一维dp表显然无法满足要求,那么就需…

css, 文字超出用省略号,包含单行文本省略号,多行文本省略号

在 CSS 中,可以使用 text-overflow: ellipsis 属性来实现文字超出时显示省略号。该效果通常应用于单行或多行文本。以下是单行和多行文本超出显示省略号的实现方法。 1. 单行文本省略号 使用以下 CSS 样式让单行文本超出容器宽度时显示省略号: .singl…

基于STM32的智能门锁控制系统设计

引言 本项目基于STM32微控制器设计了一个智能门锁控制系统,用户可以通过密码输入或指纹识别来控制门锁的开关。该系统集成了键盘、指纹传感器、舵机等外设,实现了门锁的安全、便捷控制,同时也具备了较强的扩展性。该项目展示了STM32在安防领…

基于 FMEA软件的智能制造质量控制策略_SunFMEA软件

【大家好,我是唐Sun,唐Sun的唐,唐Sun的Sun。一站式数智工厂解决方案服务商】 在智能制造的大背景下,制造业正经历着深刻的变革,质量控制也面临着新的挑战和机遇。FMEA(失效模式与影响分析)作为一…

躺平成长-运营日记-第三天

开源竞争: (自己没有办法完全掌握技术的时候就开源掉,培养出更多的技术依赖,让更多的人完善你的技术,那么这不就是在砸罐子吗?一个行业里面你不去砸罐子,其他人就会砸罐子,你不如先砸…