数据库中SQL语句where 1=1及where 1<>1或1=0的妙用

最精简的理解:

  • where 1=1 恒真,为了拼装语句用的(便于动态连接后续条件 )
  • where 1<>1 恒假,为了只获取表结构用的
  • 而“1 = 0”与“1<>1”是一个道理。

下面是网上摘抄加自己理解:

我们先来看看这个语句的结果:select * from table where 1=1,其中where 1=1,由于1=1永远是成立的,返回TRUE,条件为真;所以,这条语句,就相当于select * from table,返回查询表中的所有数据。

一、不用where 1=1 在多条件查询中的困扰

举个例子,如果您做查询页面,并且,可查询的选项有多个,同时,还让用户自行选择并输入查询关键词,那么,按平时的查询语句的动态构造,代码大 体如下:

string MySqlStr=”select * from table where”;

if(Age.Text.Lenght>0)
{
MySqlStr=MySqlStr+“Age=“+“’Age.Text’“;
}

if(Address.Text.Lenght>0)
{
MySqlStr=MySqlStr+“and Address=“+“’Address.Text’“;
}

①种假设

如果上述的两个IF判断语句,均为True,即用户都输入了查询词,那么,最终的MySqlStr动态构造语句变为:

MySqlStr=”select * from table where Age=’18′ and Address=’云南省文山州广南县小波吗村’”

可以看得出来,这是一条完整的正确的SQL查询语句,能够正确的被执行,并根据数据库是否存在记录,返回数据。

②种假设

如果上述的两个IF判断语句不成立,那么,最终的MySqlStr动态构造语句变为:

MySqlStr=”select * from table where“

现在,我们来看一下这条语句,由于where关键词后面需要使用条件,但是这条语句根本就不存在条件,所以,该语句就是一条错误的语句,肯定不 能被执行,不仅报错,同时还不会查询到任何数据。

上述的两种假设,代表了现实的应用,说明,语句的构造存在问题,不足以应付灵活多变的查询条件。

二、使用 where 1=1 的好处

假如我们将上述的语句改为:

string MySqlStr=”select * from table where 1=1 ”;

if(Age.Text.Lenght>0)
{
MySqlStr=MySqlStr+“and Age=“+“’Age.Text’“;
}

if(Address.Text.Lenght>0)
{
MySqlStr=MySqlStr+“and Address=“+“’Address.Text’“;
}

现在,也存在两种假设

①种假设

如果两个IF都成立,那么,语句变为:

MySqlStr=”select * from table where 1=1 and Age=’18′ and Address=’云南省文山州广南县小波吗村’”,很明显,该语句是一条正确的语句,能够正确执行,如果数据库有记录,肯定会被查询到。

②种假设

如果两个IF都不成立,那么,语句变为:

MySqlStr=”select * from table where 1=1”,现在,我们来看这条语句,由于where 1=1 是为True的语句,因此,该条语句语法正确,能够被正确执行,它的作用相当于:MySqlStr=”select * from table”,即返回表中所有数据。

言下之意就是:如果用户在多条件查询页面中,不选择任何字段、不输入任何关键词,那么,必将返回表中所有数据;如果用户在页面中,选择了部分字 段并且输入了部分查询关键词,那么,就按用户设置的条件进行查询。

说到这里,不知道您是否已明白,其实,where 1=1的应用,不是什么高级的应用,也不是所谓的智能化的构造,仅仅只是为了满足多条件查询页面中不确定的各种因素而采用的一种构造一条正确能运行的动态 SQL语句的一种方法。

三、我必须使用 where 1=1 才能做多条件查询吗

非也,您爱使用就使用,您不喜欢使用就不使用,对于您而言,不损失什么,也不会多得什么;

那么,如果我不使用where 1=1做多条件查询,该如何构造动态查询语句呢?非常简单,在下给您提供一种思维:

如下语句:

string MySqlStr=”select * from table”;

if(Age.Text.Lenght>0)
{
QuerySqlStr=QuerySqlStr+“Age=“+“’Age.Text’“;
}

if(Address.Text.Lenght>0)
{
QuerySqlStr=QuerySqlStr+“and Address=“+“’Address.Text’“;
}

if(QuerySqlStr.Lenght>0)
{
MySqlStr=MySqlStr+“ where “+QuerySqlStr;
}

不管你使用不使用where 1=1做多条件查询,只要您能够保证您构造出来的查询语句,是正确的就万无一失了。

四、where 1=1 的总结

为方便构造动态的多条件之不确定因素的复杂的正确的查询语句所采取的一种“江湖手段”。

此类方法,一般,在书籍上不常见,而在实际的应用中,人们得从现实角度考虑,即要保证能满足多条件查询、同时还要能应付不确定因素的灵活性,最 后还要保证语句不出现任何语法错误。

以上文章转载自:法月博客博客 – http://www.zhangpingyong.com/

  • 1<>1 的用处:
    用于只取结构不取数据的场合
    例如:
    create table table_temp tablespace tbs_temp as
    select * from table_ori where 1<>1
    建成一个与table_ori 结构相同的表table_temp,但是不要table_ori 里的数据。(除了表结构,其它结构也同理)

where 1=1有什么用?在SQL语言中,写这么一句话就跟没写一样。

select * from table1 where 1=1与select * from table1完全没有区别,甚至还有其他许多写法,1<>2,'a'='a','a'<>'b',其目的就只有一个,where 的条件为永真,得到的结果就是未加约束条件的。

在SQL注入时会用到这个,例如select * from table1 where name='lala'给强行加上select * from table1 where name='lala' or 1=1这就又变成了无约束的查询了。

最近发现的妙用在于,在不定数量查询条件情况下,1=1可以很方便的规范语句。例如一个查询可能有name,age,height,weight约束,也可能没有,那该如何处理呢?

String sql=select * from table1 where 1=1

为什么要写多余的1=1?马上就知道了。

if(!name.equals("")){

sql=sql+"name='"+name+"'";

}

if(!age.equals("")){

sql=sql+"age='"+age+"'";

}

if(!height.equals("")){

sql=sql+"height='"+height+"'";

}

if(!weight.equals("")){

sql=sql+"weight='"+weight+"'";

}

如果不写1=1呢,那么在每一个不为空的查询条件面前,都必须判断有没有where字句,否则要在第一个出现的地方加where

where 1=1的写法是为了检化程序中对条件的检测

打个比方有三个参数a, b, c

sql =select * from tb'

这三个参数都可能为空

这时你要构造语句的话,一个个检测再写语句就麻烦

比如

if @a is not null

sql = sql + " where a=' + @a

if @b is not null

这里你怎么写?要不要加where 或直接用 and ?,你这里还要对@a是否为空进行检测,用上 where 1=1 之后,就不存在这样的问题, 条件是 and 就直接and ,是or就直接接 or。

² where 1 = 0

今天看到:

"SELECT * FROM strName WHERE 1 = 0"; 不理解为什么有1=0

查询得出答案:

该select语句主要用于读取表的结构而不考虑表中的数据,这样节省了内存,因为可以不用保存结果集。另外,这个用在什么地方呢?主要用于创建一个新表,而新表的结构与查询的表的结构是一样的。如下SQL语句: create table newtable as select * from oldtable where 1= 0;

总结:

拷贝表

create table_name as select * from Source_table where 1=1;

复制表结构

create table_name as select * from Source_table where 1 <> 1;

而“1 = 0”与“1<>1”是一个道理。

希望本文对您有所帮助。为了共同学习及进步,您有什么建议及指导意见,请留言交流。谢谢!

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值