为什么说SQL看起来像英语是一个错误的设计?

在数据库领域,SQL是一门具有非常严格语法的编程语言,任何不符合规范的语句部分都会被数据库拒绝。

SQL是什么?

  虽然我们知道SQL和英语非常相似,简单的SQL语句可以直接阅读为英语,但除了SQL之外,其他主要的编程语言并没有这个特性。即使在语法中存在英语单词,也仅用作某些概念或操作的记忆方法,而实际写的是正式的程序语句,而不是英语句子。但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语句很少按行计算,通常是以千为单位。然而,对于相同的100行代码,无论将其分成100个语句还是只有1个语句,它们的复杂性完全不同。这种类型的代码很难理解,一旦最终编写完成,两个月后,程序员自己也无法理解。此外,没有逐步操作的单个长语句很难进行调试,开发周期也更长。

  关于过程性:行业中有一种说法,即SQL是一种声明性语言,用户只需关心他们想要什么,而不必关心如何做;数据库会自动找到解决方案,因此这种语言不需要支持过程性。我们之前已经批评了这种说法。

  数据库供应商可能也看到了SQL的缺乏过程性,所以后来添加了CTE语法以进行补偿,它相当于提供了可以命名的中间变量。存储过程也相当于能够按步骤执行SQL,具有分支循环甚至子程序。结果仍然是回到了过程性语言的老路上,所以从一开始就设计成这样并不好。

  对于编程语言来说,一个良好的逐步计算机制带来的易用性远远超过看起来像自然语言的优势。文章来源地址https://www.toymoban.com/diary/sql/654.html

到此这篇关于为什么说SQL看起来像英语是一个错误的设计?的文章就介绍到这了,更多相关内容可以在右上角搜索或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

原文地址:https://www.toymoban.com/diary/sql/654.html

如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请联系站长进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用
Python上下文管理器简化-深入理解并简化代码资源的分配与释放
上一篇 2024年01月01日 18:25
什么是突变测试?如何在Python中实施突变测试?
下一篇 2024年01月01日 18:43

相关文章

  • 关于为什么图像为BGR格式在窗口上看起来也是正常的颜色

    在OpenCV中, cv2.imshow() 函数会根据图像的通道顺序自动进行颜色通道的转换,以正确显示图像。 当使用BGR格式的图像作为输入时, cv2.imshow() 函数会自动将其转换为RGB格式进行显示。这样做的目的是为了与许多其他图像处理库和常见的图像显示方式保持一致,因为在这些情况

    2024年02月11日
    浏览(51)
  • 媲美ChatGPT的Bard你用了吗,看起来还不错!

    在这个技术日新月异的时代,人工智能已成为我们生活中不可或缺的一部分。聊天机器人,以其独特的表现形式,备受人们追捧。在这里,笔者要向大家推荐几个不错的聊天机器人网站,其中包括Google Bard。看看他自己怎么模仿某位小说家介绍的—— Google Bard:网络盲道的“

    2024年02月15日
    浏览(48)
  • 【vimsolo】让vim看起来像VSCode:颜色主题和状态栏的配置

    习惯了 VSCode 默认的配色:黑色主题,蓝色状态栏。偶尔使用 Vim 时想让 vim 伪装的像 VSCode,不考虑花里花哨的插件和动态效果, 静态效果上让 vim 看起来像 VSCode ,怎样实现呢? vimsolo = vim + solo,除了颜色主题可以用第三方插件, 其他配置都用 .vimrc 手工完成,不依赖库插件

    2024年02月05日
    浏览(55)
  • 玩转 PI 系列-看起来像服务器的 ARM 开发板矩阵-Firefly Cluster Server

    基于我个人的工作内容和兴趣,想要在家里搞一套服务器集群,用于容器/K8s 等方案的测试验证。 考虑过使用二手服务器,比如 Dell R730, 还搞了一套配置清单,如下: Dell R730 3.5 尺寸规格硬盘 CPU: 2686v4*2 内存:16g*8 存储:480Gintel ssd 系统盘 + 6tsas 希捷* 2 个数据盘 RAID 卡:h73

    2024年02月11日
    浏览(50)
  • Vue/Uni-app/微信小程序 v-if 设置出场/退出动画(页面交互不死板,看起来更流畅)

    天梦星服务平台 (tmxkj.top) https://tmxkj.top/#/ 在Vue.js中,使用 v-if 进行条件渲染时设置动画可以通过 transition 组件来实现。 具体操作步骤如下: 包裹条件渲染的元素 :您需要将要通过 v-if 控制显示隐藏的元素包裹在 transition 标签内。 命名过渡效果 :给 transition 标签添加 name 属

    2024年04月28日
    浏览(37)
  • 为什么网吧的电脑用起来不卡?

    因为自己的电脑不适合打游戏,但我又想打,所以我对网吧的电脑开始研究起来 之前我在自己的笔记本上打游戏的时候,会出现人物名字和人物的位置不匹配的情况,有一次打游戏正打的火热,电脑却突然蓝屏并嗡嗡的响,我顿时一脸懵逼,于是长按电源键10秒才关机。 我就

    2024年02月10日
    浏览(72)
  • 一起来看看元宇宙为什么有必要与IPFS进行精确组合?

    基本上,元宇宙的所有产品都将是NFT,但这将导致越来越多的NFT数据,这也是元宇宙寻求突破的地方。 重要的是,数据必须永久存储,数据不能被操作以确保唯一性。也许你已经猜到了,在区块链中有满足这些要求的,即IPFS分布式存储。 Filecoin是一个激励层,运行在IPFS和区

    2024年02月10日
    浏览(68)
  • SQL中为什么不要使用1=1?

    最近看几个老项目的SQL条件中使用了1=1,想想自己也曾经这样写过,略有感触,特别拿出来说道说道。 编写SQL语句就像炒菜,每一种调料的使用都会影响菜品的最终味道,每一个SQL条件的加入也会影响查询的执行效率。那么 1=1 存在什么样的问题呢?为什么又会使用呢? 在动

    2024年02月21日
    浏览(57)
  • 为什么SQL日志文件很大,该如何处理?

    SQL Server 日志文件是记录所有数据库事务和修改的事务日志文件。用 SQL 术语来说,此日志文件记录对数据库执行的所有 INSERT 、 UPDATE 和 DELETE查询操作。 如果数据库联机或恢复时日志已满,SQL Server 通常会发出 9002 错误。在这种情况下,数据库只能读取而不能更新。此篇文章

    2024年02月06日
    浏览(65)
  • 为什么一个矩阵乘以一个满秩矩阵后秩不变

    A为N阶方阵,r(A) =p ,其中p n. B为N阶方阵,r(B)=n. 证明: r(AB) = p. 定理1:矩阵B可逆,则存在有限个初等矩阵 P 1 , P 2 , P 3 . . . P n P_1,P_2,P_3...P_n P 1 ​ , P 2 ​ , P 3 ​ ... P n ​ ,使得 A = P 1 P 2 . . . . P n A=P_1P_2....P_n A = P 1 ​ P 2 ​ .... P n ​ 定理2:矩阵B满秩,则矩阵B可逆 定理3:进行

    2024年02月10日
    浏览(59)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包