不知道你们在开发中有没有看到过这样的sql: .. where 1=1、count(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