不能理解1 1=2,为什么我们不在SQL中使用1=1呢?

 admin   2024-05-09 23:01   8 人阅读  0 条评论

一说到为什么我们不在SQL中使用1=1呢?或者和不能理解1 1=2相关的话题,总是能引起关注,小编为你带来解。


最近在几个老项目中看到SQL条件中使用了1=1后,感觉有点触动,因为我以为我以前写过这样的东西,所以特意提了一下。


编写SQL语句就像做饭一样。每个调料的使用都会影响菜肴的最终味道,每个SQL条件的添加也会影响查询的执行效率。那么1=1有什么题呢?为什么又要用它呢?


为什么用1=1?


当动态构建SQL查询时,查询条件通常是动态的,并且在最终执行期间可能会使用不同的条件。此时,通过使用“1=1”作为始终为真的条件,后续的所有条件都可以轻松地用“AND”连接起来,就像构建其他块时先打地基一样。在此基础上。


像这样


从表中选择WHERE1=1lt;iftest=34;gt;AND用户名=34;年龄gt;/ifgt;这样,您就不必在添加每个条件之前确定是否需要添加“AND”。


1=1引起的题


性能题?


首先,让我们了解数据库查询优化器是如何工作的。查询优化器就像一个聪明的图书管理员,知道如何尽快找到您需要的书籍。告诉我们您需要的书籍的特征,我们将根据该信息选择最快的搜索路径。比如要查询一本作者是“谭浩强”的书,不用费力地遍历所有书,而是先通过作者索引查找图书索引,然后再通过图书索引查找该书。


然而,说出诸如“我想要一本书。这是一本书”之类的无关信息可能会令人困惑,并且不会帮助经理更快地找到这本书。使用“1=1”的查询将导致数据库检查每条记录是否满足此条件,类似于图书馆员必须检查所有书籍以确保它们都是浪费的。


你可能会说数据库没那么蠢。是的?


事实上,这实际上可能不会造成题。这是因为现代数据库查询优化器已经非常智能,通常可以识别现实条件,例如1=1,并在执行查询计划时针对它们进行优化。很多情况下,在查询中包含1=1并不会对数据库性能产生重大影响,优化器在实际执行查询时会忽略它。


然而,优化器并不是万能的。在一些复杂的查询场景中,即使是简单的1=1也会对优化器的决策产生不必要的影响,例如导致全表扫描。


代码质量


另外,从代码质量的角度来看,您应该避免在查询中包含1=1。您应该考虑以下事项


代码清晰度即使您的数据库可以优化这样的条件,1=1也可能会让阅读SQL代码的人感到困惑。代码的可读性和清晰度至关重要,尤其是在团队协作环境中。


养成习惯即使1=1不会在您当前的数据库系统中导致性能题,但习惯于编写不必要的代码可能会在其他情况下导致真正的性能题。例如,更复杂和无用的条件可能不容易优化。


跨数据库兼容性不同的数据库管理系统可能有不同的优化功能。一个系统可以轻松优化为1=1,但另一个系统可能效率不高。编写不依赖于特定优化器行为的SQL语句是一个好主意。


编写尽可能高效、清晰和准确的SQL语句不仅有助于保持代码质量,而且还使您的代码更具可维护性和可扩展性。


比1=1更好的选择


现在开发者普遍使用ORM框架来操作数据库。仍然完全自己编写SQL的学生可能需要考虑两种方法来替换其他ORM框架中的1=1。


假设您有一个用户信息表,并且您希望根据传递给用户的参数动态过滤用户。


第一个是Mybatis。


lt;--MyBatis映射文件片段--gt;lt;selectid=34;结果类型=34;gt;从用户lt;wheregt;中选择->如果测试=39;34;>ANDusername=34;agegt;/ifgt;--附加条件--gt;在MyBatis中避免使用1=1的一种常见方法是使用动态SQL标签来编写条件查询。lt;哪里gt;标签在第一个条件之前自动处理AND或OR。lt;如果gt;或lt;wheregt;如果没有其他条件标签满足条件。标记内的任何内容都会被忽略,因此不会创建重复的AND或WHERE子句。


让我们看一下实体框架中的方法。


varquery=contextUserAsQueryable;if!stringIsNullOrEmptyusernameifagegt;0var用户=queryToList;这是一种函数式编程方法,最终生成SQL时,判断条件前是否加AND,而不是人为地加1=1。


总结


“1=1”在SQL语句中看似无害,但实际上是一种糟糕的编程实践,可能会导致性能不佳。正如做饭时要避免无缘无故添加调料一样,在编写SQL语句时也应避免添加无意义的条件。


每行代码都应该有一个存在的理由。阻止您的人员和数据库在不必要的任务上浪费时间。


本文地址:http://www.zszhiding.com/post/304503.html
版权声明:本文为原创文章,版权归 admin 所有,欢迎分享本文,转载请保留出处!

 发表评论


表情

还没有留言,还不快点抢沙发?