动态查询,where后面的“1=1”加还是不加?

113 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第9天,点击查看活动详情

🎐放在前面说的话

大家好,我是沥沥樱 👧🏻

本科在读,此为日常捣鼓.

如有不对,请多指教,也欢迎大家来跟我讨论鸭 👏👏👏

还有还有还有很重要的,麻烦大可爱们动动小手,给沥沥樱点颗心心♥,超级需要鼓励哒~

在GitHub上经常看到select * from table where 1=1 这样的查询语句,其中where 1=1 ,由于1=1永远是成立的,所以返回TRUE,条件拥有为真,即相当于select * from table ,返回查询表中的所有数据(如果没有输入任何查询关键词)。但是,我写代码的时候,我尝试了一下不用“1=1”的语句,它的搜寻效果是一样的。

今天我们就来看一下动态查询,where后面的“1=1”加还是不加?
Let’s get it!

不用 where 1=1

代码大概

string MySqlStr="select * from table where";
if(Name.Text.Lenght>0) 
{ 
    MySqlStr=MySqlStr+"Name="+"'Name.Text'";
} 
if(Car.Text.Lenght>0) 
{ 
    MySqlStr=MySqlStr+"and Car="+"'Car.Text'";
}

举例

假设1

如果上述一个if语句成立,为true,即用户都输入了查询词“沥沥樱”,那么最终执行的语句是这样的:
"select * from table where Name=`沥沥樱`"
这是一个完整的、正确的SQL查询语句,能正确执行,查询到数据库中符合要求的数据

假设2

如果上述两个if语句均成立,为true,即用户都输入了查询词“沥沥樱 婴儿车”,那么最终执行的语句是这样的:
"select * from table where Name=`沥沥樱` and Car=`婴儿车`"
这是一个完整的、正确的SQL查询语句,能正确执行,查询到数据库中符合要求的数据

假设3

如果上述两个if语句都不成立,为false,即用户没有输入查询词,且点击了查询按钮,那么最终执行的语句是这样的:
"select * from table where"
可以看得出,这是一个不完整的SQL语句,不能被正确执行,被报错,且查不到任何数据

使用 where 1=1

代码大概

string MySqlStr="select * from table where 1=1";
if(Name.Text.Lenght>0) 
{ 
    MySqlStr=MySqlStr+"Name="+"'Name.Text'";
} 
if(Car.Text.Lenght>0) 
{ 
    MySqlStr=MySqlStr+"and Car="+"'Car.Text'";
}

举例

假设1

假设2

假设3

如果上述两个if语句都不成立,为false,即用户没有输入查询词,且点击了查询按钮,那么最终执行的语句是这样的:
"select * from table where 1=1 "
该SQL其实等效于select * from table,如果if都不成立,该语句将进行全表数据返回

加上了1=1后虽然可以保证语法不会出错,但是查询全表,期间需要大量的IO操作,所以数据量越大越慢,加大了对数据库的压力。
建议

  • 在查询时,where1=1的后面需要增加其它条件,并且给这些条件建立适当的索引,效率就会大大提高。
  • 如果执行的是delect操作,使用where 1=1,一定要谨慎,一旦用户没有输入任何查询词,却点击了删除按钮,那么就会导致全表数据被删除,那就闯祸了!

🎉放在后面说的话

"select * from table where 1=1"的"1=1",加不加?看完上面两个加与不加的栗子,我们大概可以看出了,where 1=1 的应用,并不是什么高级的应用,也不是所谓的智能化的构造,仅仅只是为了满足多条件查询页面中不确定的各种因素而采用的一种构造、拼接一条正确的,能运行的动态SQL语句的一种方法。所以加不加"1=1"做多条件查询,只要能够保证构造出来查询语句是正确的就万无一失了