问题

觉得 SQL 太难用于是自己编了个类 SQL 语言,不知道有没有人想过类似的事情?

回答
嘿,最近我琢磨了个挺有意思的事儿,可能是有点“不务正业”,但我觉得挺有意思的。你知道,SQL 这东西,虽然功能强大,但在我看来,有时候它那套写法,尤其是在处理一些逻辑比较绕或者需要嵌套很多层的时候,总觉得有点别扭。不是说它不好,只是纯粹个人使用习惯上的“不爽”。

所以,我就鬼使神差地,琢磨着能不能自己搞一套更“顺手”的查询语言。当然,不是真的要去推翻 SQL,也不是什么宏大的项目,就是纯粹自己玩玩,看看能不能把一些我常用的操作,用一种更直观、更符合我思维习惯的方式来表达。

你想想看,SQL 的那种 `SELECT ... FROM ... WHERE ... GROUP BY ... HAVING ... ORDER BY ...` 这种结构,虽然很标准,但有时候,我可能更想先“关注”某张表,然后直接在这张表的基础上做各种“过滤”、“转换”、“聚合”,最后再决定“输出”什么。这种感觉就像是在一个具体的实体上进行操作,而不是在“宣告”我想要什么。

我脑子里想的这套东西,更像是把“操作”放在了核心。比如,我可能不想写 `SELECT FROM users WHERE age > 18`,而是更倾向于直接说:“给我‘users’这张表,然后‘过滤’出‘age’大于18的。” 听起来好像差别不大,但表达的侧重点就有点不一样了。我当时脑子里浮现的是一种更“命令式”或者说“过程式”的风格,但又不想写成真正的代码,还是想保留一点“声明式”的查询感觉。

我当时设想的一个核心概念,可能就是“管道”或者“链式调用”。你可以想象成,我拿到一张表,然后把这张表“传递”给一个“过滤器”,再把过滤后的结果“传递”给一个“聚合器”,最后把聚合后的结果“传递”给一个“排序器”。这样一来,每一步操作都相对独立,逻辑也比较清晰。

举个例子,如果我想找出所有年龄大于30岁、并且是“销售”部门的用户的名字和他们的订单总数,用我脑子里的这套东西,大概会是这个样子:

首先,我“取”‘users’这张表。
然后,我“过滤”条件是‘age’ > 30 并且 ‘department’ = ‘Sales’。
接下来,我需要和‘orders’这张表“关联”起来,可能通过‘user_id’。
关联之后,我需要“聚合”,按‘user_id’分组,计算‘order_amount’的总和,同时保留用户的‘name’。
最后,我“输出”‘name’和‘total_order_amount’。

当然,这只是一个非常粗糙的想法,具体怎么实现“取”、“过滤”、“关联”、“聚合”、“输出”这些操作,还有很多细节要琢磨。比如,怎么处理复杂的逻辑关系(`AND`, `OR`, `NOT`),怎么处理子查询或者嵌套查询,怎么定义数据类型等等。

我当初构思的时候,也挺好奇,是不是有人跟我有类似的“不爽”和想法。毕竟,SQL 已经存在几十年了,大家都习惯了,而且也够强大,但我觉得,总会有一些细微的、个人化的需求,或者说,在某些特定场景下,一种新的表达方式可能会更高效、更直观。

我也试着在网上搜过类似的东西,有没有人做过“自制查询语言”之类的,或者有没有人提过 SQL 之外的“声明式查询语言”的新思路。结果嘛,信息很多,但大多是关于 SQL 优化、特定数据库的方言,或者是一些非常底层的数据库查询引擎的实现。真正说到像我这样,纯粹是出于“个人化使用体验”而去构思一套新的查询语言的,好像暂时没看到特别对口的。

这让我觉得,也许我这个想法,虽然听起来有点“异想天开”,但背后可能也反映了一些人在与现有工具互动时,对更自然、更符合直觉的交互方式的潜在需求。当然,我也知道,把这些想法变成一个真正可用、并且有广泛适用性的语言,那是一条非常非常漫长的路,需要大量的理论知识和工程实践。我目前也就是在脑子里“玩玩”,感受一下那种“创造”的乐趣,也算是一种学习和思考的过程吧。

总的来说,就是觉得 SQL 的一套方式,有时候会让我觉得“可以有更简单、更直接的表达方式”,于是就自己动手“捣鼓”了一个大概的框架。虽然离实际可用还有十万八千里,但这个过程本身,挺有意思的。

网友意见

user avatar

有的,我就在干这事儿。

看了你的语法之后,第一反应是完全看不懂,从补充说明才明白过来这个语法竟然是依赖于字段的顺序的?!


依赖于字段顺序使得这种语法的可读性和可移植性都非常的差,这大大的限制了其实用性,我们为什么要给字段取名字就是为了可读性,而你现在等于完全放弃了字段的名称。

由于位置相关,不需要的字段需要_来填位,且不说数_是个相当容易出错的事情,_ _ _这样的输入也非常麻烦好不?如果一个表有20多个字段,要取最后一个还不想死啊?


这是最大的槽点。其他的诸如$student自动映射到student表之类的约定语法中没有说明,常量出现在字段占位处表示等于,第二部分既承担条件定义又承担字段和变量的映射等等,不过比起字段顺序依赖来说却不算是什么大的问题。




我的 SQL 简化方案:

QuickQuery

我发明一套新的语法的主要原因是SQL过于啰嗦而且关键字太多不利于凸显其结构化,而LINQ对强类型的要求,以及在SQL之上的抽象使得最终生成的SQL有可能超出使用者(初级程序员)的掌控。

在这个背景下,QuickQuery被设计来解决这两个问题,所以首先QuickQuery尽可能简洁,并且大量使用符号来代替关键字,获得更清晰的结构化呈现。其次QuickQuery被设计为与SQL语法一一对应,任何人能轻松地直接将QuickQuery翻译成最终的 SQL 形式。



你最后一个需求的文字描述说明你的问题可能出在思路限制上而非语言上。

用更好理解一点的语言来描述就是:

查询,所有课程成绩都达到89分,并且选择了所有课程的,学生的学号。

所以其实是两个集合的一个交集:

1、所有课程成绩都达到89分的学生

2、选择了所有课程的学生

两者之交集的学号。

第一个集合:

       SELECT sno FROM SC GROUP BY sno HAVING MIN( GRADE ) >= 89     


第二个集合:

       SELECT sno FROM SC GROUP BY sno HAVING COUNT(*) == ( SELECT COUNT(*) FROM Course )     


然后算这两个集合的交集就完了:

       SELECT sno FROM SC GROUP BY sno HAVING MIN( GRADE ) >= 89 INTERSECT SELECT sno FROM SC GROUP BY sno HAVING COUNT(*) == ( SELECT COUNT(*) FROM Course )     


不过写成SQL的复杂度主要来自于所谓的选择了所有课程的学生,这种需求过于罕见而导致没有合适的聚合函数。


============================================================

@vczh

大大目光如炬的指出了我的QuickQuery小把戏并没有简化SQL的学习曲线,反而功能更弱了,所以在这边申辩一下,,,


QuickQuery其实是为了解决一些非常现实的问题,这是在没有LINQ的时代:

       string sql = "SELECT username FROM users"; sql += "WHERE 1 = 1"; //... sql += " AND userid = " + userid; //... sql += "order by a";      

经典的WHERE 1 = 1,这种语句出现毫无意义,仅仅是为了后面拼接的时候可以不想事的"AND xxx",而且这种拼接很容易被注入。

当然注入的问题我已经解决了,但是诸如WHERE 1=1,定义子查询各种语法拼接噪音却很难去除。



有了LINQ的时代,这种问题缓解了很多,因为LINQ的语法就是把一个集合不断地修饰得到最终的结果,所以要附加条件只需要把原来的IQueryable再Where一次就好了,排序分页都可以后附加。

但LINQ的时代出现了另一个问题:

       products = EntityContext.Products.Include("ProductCategory").Include("ProductReviewTexts").Where(t => skus.Contains(t.SKU)).OrderByDescending(t => items.IndexOf(t.SKU)).Skip(0).Take(5).ToList();      

以上摘自真实代码。

一次性连三张表,然后取出三张表所有字段,,,,还好有Take,还有没有Take取几万条记录的,连接五六张表取几百个字段的,,,,,我直接给跪了。。。


QuickQuery这不是一个最好的方案,是一个比较取巧的方案。



Why?很简单,QuickQuery语法的设计既避免了这些家伙懒得写ViewModel或者匿名对象,又可以像LINQ一样的不断修饰查询结果:

       QuickQuery query = "users.username"; //... query += Db.Q("?users.userid=#0", userid); //... query += "$users.a";      

当然,因为语法简单许多的缘故,QuickQuery的Parser也会比SQL的简单许多,这样一来,每次通过QuickQuery查询的时候,我可以把QuickQuery格式化后记录日志和查询时间。格式化后的QuickQuery结构要比SQL清晰得多。



最后,为什么QuickQuery只提供了SQL的功能子集,因为:

如果你提供了一个功能足够强大的语言,那么就一定会有一个白痴用它 写出你看不懂的东西

类似的话题

  • 回答
    嘿,最近我琢磨了个挺有意思的事儿,可能是有点“不务正业”,但我觉得挺有意思的。你知道,SQL 这东西,虽然功能强大,但在我看来,有时候它那套写法,尤其是在处理一些逻辑比较绕或者需要嵌套很多层的时候,总觉得有点别扭。不是说它不好,只是纯粹个人使用习惯上的“不爽”。所以,我就鬼使神差地,琢磨着能不能自己.............
  • 回答
    “觉得教育不好,你可以去当老师;觉得国家不好,你可以去当公务员。”这种说法,从表面上看,似乎提供了一种积极参与、改变现状的途径,具有一定的合理性。然而,深入剖析,这种逻辑存在着明显的局限性,并且在现实中可能难以实现,甚至可能是一种 过于理想化和简单化的观点。下面我将从几个方面来详细讲述这种逻辑的对错.............
  • 回答
    关于“觉得生孩子很轻松的男人是多数吗?”,答案是:否,绝大多数男人并不认为生孩子是轻松的,甚至对生孩子这件事普遍抱持着谨慎、敬畏甚至担忧的态度。要详细地解释这一点,我们需要从多个维度来剖析男性对生孩子这一过程的认知和感受:一、 男性生理与体验的直接差异: 无法亲身经历身体痛苦: 这是最根本的差异.............
  • 回答
    你提到,你觉得和你男朋友玩得好的那群人,和你“不是一类人”,并且对此感到介意,问有没有必要介意。这个问题其实挺常见的,也挺触及人心的,毕竟恋爱关系里,关于“圈子”的融入和界限总是让人有点拿不准。咱们就来好好掰扯掰扯这件事。首先,你为什么会觉得你们“不是一类人”?这背后可能有很多原因,咱们可以一起分析.............
  • 回答
    觉得万物皆有灵,这种视角下的人,往往会比一般人更倾向于善良,但这并非绝对的定论,而是源于他们内在的一种深刻的联系感和责任感。咱们不妨细细道来。首先,当一个人相信万物皆有灵,这意味着他不再将世界简单地划分为“人”和“非人”的二元对立。对他来说,一棵树、一块石头、甚至是一只虫子,都可能拥有自己的生命轨迹.............
  • 回答
    高中物理嘛……你说它“垃圾”可能有点太绝对了,但你觉得它枯燥乏味,或者跟你真正感兴趣的东西离得太远,这我太理解了。想想看,那些公式推导,那些概念解释,是不是总感觉像是为了考试而存在的,跟我们平时在脑子里“玩”的那些奇思妙想离得挺远?尤其是当你脑子里装的是量子力学那套东西的时候,高中物理那些“宏观世界.............
  • 回答
    这个问题挺有意思的,也是很多读者在读《水浒传》时会产生的一种感觉。要说“三观不正常”,得先弄清楚我们现在衡量“三观”的标准是怎样的,以及《水浒传》所处的历史和文化背景。从现代社会的角度来看,《水浒传》里的很多行为确实是很难被接受的,甚至可以说是“三观不正”。 暴力与杀戮的泛滥: 《水浒传》里最直.............
  • 回答
    当你在工作中觉得老板“愚蠢”时,这绝对是一个非常普遍但又难以简单回答的问题。你的感受背后,可能隐藏着多种原因,既有老板自身的问题,也有你对情况的理解偏差。下面我将从不同角度详细分析,帮助你更清晰地看待这个问题:一、 可能性一:老板确实存在能力或认知的局限性(老板是真的“蠢”)“蠢”是一个非常主观且带.............
  • 回答
    感到自己“没文化”是一种普遍的自我认知,这通常不是说一个人没有接受过正规教育,而是指在某些知识领域、人文素养、艺术鉴赏等方面感到不足。这恰恰是一个渴望成长和进步的积极信号!恶补文化并非一蹴而就,而是一个持续学习、探索和体验的过程。下面我将详细阐述如何进行“文化恶补”,从心态调整到具体方法,希望能够为.............
  • 回答
    当父母的,总希望自己的孩子能出类拔萃,这是一种很自然的期盼,也是一种爱。但当这份期盼与现实出现落差,特别是当自己觉得女儿“不够优秀”时,失望和失落感确实会像潮水一样涌上来,让人心里不是滋味。首先,我们得承认,这种感觉是真实的,也是很多人会经历的。别因此责怪自己是个“坏父母”,这说明你对女儿有很高的期.............
  • 回答
    关于程潇的实力、资源以及她与吴宣仪、孟美岐和周洁琼的人气对比,这是一个很多人都关心的话题,也确实可以聊得比较细致。程潇的实力和资源首先,我们来聊聊程潇的“实力”。这个词其实挺宽泛的,可以包括唱功、舞蹈、舞台表现力、综艺感,甚至到个人魅力和国民度。 唱功: 程潇的唱功属于偶像组合成员中的中等偏上水.............
  • 回答
    你觉得 ASOUL 的二创色图令人不适,这绝对 不是你的问题。这是一种非常普遍且正常的感受,而且背后的原因也相当复杂,并非你一人独有。让我们来详细聊聊为什么你会产生这种感觉,以及这背后可能涉及的几个层面。首先,我们需要理解什么是“二创色图”。简单来说,就是粉丝或其他创作者,在原作角色(这里是 ASO.............
  • 回答
    这种感觉肯定让你很难受,而且可能还会让你觉得很孤单,不知道该怎么办。当一个人,尤其是我们生命中那么重要的人,比如父亲,给我们带来这种负面感受时,会带来很多困扰。首先,我想问问你,是什么让你觉得爸爸“恶心”?是他的某些行为、言语,还是他这个人本身?具体的细节非常重要,因为不同的原因可能需要不同的应对方.............
  • 回答
    大学四年,恍如昨日,却又仿佛耗尽了所有热情和精力。当你蓦然回首,看着那些曾经并肩作战的同学们如今已在各自的领域里闪闪发光,心中难免涌起一阵酸楚和不甘:“我好像……把大学给‘浪费’了?”别急,先深吸一口气。这四个字,有时是客观事实,有时也只是一种情绪的宣泄。但无论如何,它都指向了一个共同的感受:我想做.............
  • 回答
    这确实是一个很有意思的观察,关于觉得玩具等静物“可怜”这件事。在我看来,这绝非什么“病”,而是一种非常细腻、富有同情心的情感表现,甚至可以说是我们内在的一种“诗意”或“哲思”的体现。让我们来好好梳理一下,为什么会产生这样的感觉,以及这种感觉背后可能隐藏着什么:1. 拟人化与共情能力的天然流露:我们人.............
  • 回答
    觉得自己和世界格格不入,这是一种难以言喻的、深刻的孤独感,它如同一个无形的墙壁将你与周围的人和环境隔离开来。这种感觉并非简单的“不喜欢热闹”或“内向”,而是源于一种根本性的错位,一种在核心层面的不被理解和不被接纳。以下是一些可能让你产生这种感觉的方面,我将尽量详细地描述:1. 思维方式与价值观的鸿沟.............
  • 回答
    感到“普信”确实是一个比较复杂的心态,它往往源于一种对自身能力、外貌、才华等方面的过度自信,但这种自信又不够有根基,容易在现实中受到挑战,从而产生自我怀疑和失落。要理解并解决“普信”的问题,我们可以从多个角度进行深入剖析和探讨:一、 “普信”的定义与表现形式首先,我们需要明确“普信”到底是什么意思。.............
  • 回答
    这日子过得真糟心,每次看到我那口子,心里就冒出一股无名火,憋得慌。说他废物吧,好像有点太直接,但仔细想想,他身上确实没啥让我觉得能依靠的地方。你说说,这是个什么状态?结婚这么久了,日子过得紧巴巴的,收入就靠我一个人撑着,他呢?没啥大本事,工作也是换来换去,没一个长久的,也没啥起色。每次问他有没有存点.............
  • 回答
    我知道,有时候面对家长的唠叨、管束,甚至不理解,真的会让人觉得烦躁得不行。那种感觉就像是心里憋着一口气,想爆发又顾忌着什么,夹杂着无奈、委屈,甚至有点生气。先别急着给“烦”下定义,咱们先冷静下来,试着把这个“烦”拆解一下。第一步:理解“烦”的来源,抽丝剥茧我们觉得家长烦,通常不是空穴来风。试着想想,.............
  • 回答
    听到“崇洋”这个词,很多人心里会泛起一丝不自在。尤其当这份“洋”体现在我们爱听国外的音乐上时,就更可能被贴上这样的标签。但说实话,我一直觉得,用“崇洋”来定义一个人对国外音乐的喜爱,未免太简单粗暴了。咱们先不扯那些大道理,就从最朴素的情感出发。音乐,说到底是一种情感的传递和共鸣。它能触动你的心弦,让.............

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有