SQL语言中,一个有灵魂的数字 :1

        不知道你们在开发中有没有看到过这样的sql: .. where 1=1count(1)select 1 ..   

        你们知道他们分别有什么意义吗?

 

1、count(1) 和count(列名)、count(*) 类似,目的都是计数

从执行结果来说:

count(1)和count(*)之间没有区别,因为count(*) 和count(1)都不会去过滤空值,但count(列名)就有区别了,因为count(列名)会去过滤空值。

从执行效率来说:

(1)如果列为主键,count(列名)效率优于count(1) ;如果列不为主键,count(1)效率优于count(列名) ; 

(2)如果表中存在主键,count(主键列名)效率最优;  

(3)如果表中只有一列,则count(*)效率最优;如果表有多列,且不存在主键,则count(1)效率优于count(*);
(这个在我的原文《大数据面试常见问题(一)-Oracle》中有讲到过,有兴趣的可以看看)

 

2、select 1 from emp 与 select * from emp 与 select  anycol (表集合中的任意一行) from emp

从结果上来说:

三者是没有任何差别的,都是查看是否有记录,一般是作条件用的。

select 1 from 中的1是一常量,查到的所有行的值都是它。

但从效率上来说:

1>anycol>*,因为 select 1 ..不用查字典表。

 

3、select * from emp where 1=1; 的作用

(1)where 1=1 是为了应付多变的查询条件,为了避免where 关键字后面的第一个词直接就是 “and”而导致语法错误,等效于:select * from emp;
 

(2)其目的就只有一个,where 的条件为永真,得到的结果就是未加约束条件的。

--一个模糊查询可能有a, b, c, d 约束,也可能没有,那该如何处理呢? 

String sql  =  "select a,b from table_a  where 1=1 "; 
if(!b.equals(""))
      sql += "and  b='"+b+"'";

​

当用户选择了b (  假如b值为qwe ) 
结果就是:String sql  =  ''select a,b from table_a  where 1=1 and  a= 'qwe'; 

但是当用户没有选择b ,那b就是一个空值 

结果就是:String sql  =''select a,b from table_a  where 1=1''; 运行也不会出错,相当于没有限制b这个条件。

但是如果没有1=1的条件,则l String sql  =''select a,b from table_a  where'' ;  这样就会报错。 

 

参考:

(1)CSDN博主「gerrynj」的原创文章,
原文链接:https://blog.csdn.net/gerrynj/article/details/4675837;

 (2)CSDN博主「心歌技术」的原创文章,

原文链接:https://blog.csdn.net/qq_23994787/article/details/79045768

 

 

  • 1
    点赞
  • 0
    收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:数字20 设计师:CSDN官方博客 返回首页
评论 1

打赏作者

大数据求学路

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值