暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

SQL 语句中 where 条件后 写上 1=1 是什么意思?有必要吗?

SQL数据库运维 2023-02-01
1536

点击蓝色字关注“SQL数据库运维”,回复“SQL”获取2TB学习资源!

前几天在逛知乎时,偶然看到了这么一个问题,个人觉得是一个非常好的问题,回答者也很多,大家是各抒己见,贴出部分回答给大家看看:

估计很多刚接触SQL的小伙伴们也会有同样的疑问吧,精选几个比较好的回答,分享小伙伴们品读下:


真香:好看,且好用,特别香!

作者:刘有劲
链接:https://www.zhihu.com/question/569862891/answer/2784958783
来源:知乎

一、好看

下面2个SQL,可以对比下:

    where 1 = 1
    and a.id = b.parentid
    and b.id = c.parentid
      where a.id = b.parentid
      and b.id = c.parentid

      二、好用

      1、SQL拼接更方便

      程序的查询界面,都是通过用户选择的不同查询条件,拼接不同的SQL,呈现结果,如果用户不选择任何查询条件,则显示所有。

      在基础SQL增加上where 1 = 1,后面不论用户选择了几个查询条件,只需要一直and下去就行了,而不用判断“有条件”还是“没条件”。

      2、查询调试更方便

      很多时候,我们写好SQL后,需要变换不同的查询条件进行数据查询,例如有多个and的情况下:

      —— 如果要把后面几个and失效,只需要在and前增加注释符号即可;

      —— 但如果要把where后紧接着的条件失效,只增加注释是不行的,还需要把紧挨着的and删掉。

      这样的操作过于繁琐,不如where后面先1 = 1,再后面的条件就可以随便注释了。


      习惯:1=1是恒等于的意思:开发人员使用习惯问题。

      作者:十年外包
      链接:https://www.zhihu.com/question/569862891/answer/2808635348
      来源:知乎

      1=1是恒等于的意思:开发人员使用习惯问题。

      1=2是恒不等于的意思:一般用于语法测试等。

      写了1=1,后面条件就都是一样的格式了,排查问题直接注释掉条件就好了;如果没加,排查问题,where后面条件就要屡次加删and了。平时觉得没啥,但问题复杂度一上来,一根稻草就能压死一只骆驼!!!


      易受攻击:如果应用程序在构建 SQL 查询时使用了 1=1 的条件,那么攻击者可能会利用这个条件来插入非法的 SQL 代码。

      作者:KonwBot
      链接:https://www.zhihu.com/question/569862891/answer/2851874523
      来源:知乎

      在 SQL 语句中,如果在 WHERE 条件后面写上 1=1 意味着该语句将返回整张表中的所有记录。这是因为 1=1 是一个始终为真的条件,所以不论其他条件是什么,都会返回整张表。这种做法常常用在动态查询中,当用户并不需要输入查询条件时,可以通过这种方式返回整张表的所有数据。

      如果应用程序在构建 SQL 查询时使用了 1=1 的条件,那么攻击者可能会利用这个条件来插入非法的 SQL 代码。

      例如,假设应用程序使用了如下的 SQL 查询来检索用户名和密码:

        SELECT username, password FROM 
        users WHERE 
        username = '$username' 
        AND 1=1

        攻击者可能会尝试将其用户名输入为:

          ' OR '1'='1'

          这样就会变成:

            SELECT username, password FROM 
            users WHERE
            username = '' 
            OR '1'='1' AND 1=1

            这样就会把所有的用户都查询出来,可能会导致敏感信息泄露。

            所以应该避免在程序中使用1=1条件,而应该使用参数化查询或预处理语句来防止 SQL 注入攻击。


            新手:装逼用的
            作者:哪吒学Java
            链接:https://www.zhihu.com/question/569862891/answer/2860914766
            来源:知乎

            1、统一代码风格;

            2、防止在mybatis动态拼接where条件时,没有任何条件时去掉and,提高容错率,确保sql不会报错;

            3、5.6版本之后,where 1 = 1 不会有任何性能问题,查询分析器会直接将其优化掉;

            4、再说其他用处?装逼用的?新手看到了这个,哇哦,sql还可以这样写,此中定有玄机;

            参考资料:https://www.zhihu.com/question/569862891

            此文章仅列举部分精选内容,还有很多观点,感兴趣的可以通过以上链接进行学习,也可通过以下方式,欢迎进群探讨☟☟☟

            点击关注“SQL数据库运维”,后台或浏览至公众号文章底部点击“发消息”回复关键字:进群,带你进入高手如云的技术交流群。后台回复关键字:SQL,获取学习资料。


            动动小手点击加关注呦☟☟☟

            文章转载自SQL数据库运维,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

            评论