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

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大数据求学路

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

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

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

打赏作者

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

抵扣说明:

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

余额充值