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

 

 

你可能感兴趣的:(常用函数分析,sql,数据库,java)