`
MINGMING_0302
  • 浏览: 22560 次
  • 性别: Icon_minigender_2
文章分类
社区版块
存档分类
最新评论

详解“ select * from table where 1=1 ”

阅读更多

        这是一种怎样的查询语句呢?首先说明,1=1不是查询语句中的任何关键词,所以,请您放心,不管你会不会使用这种语句,都没有任何关系,对于您而言,没有任何损失。

 

  另外,众多网站都有select * from table where 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 的总结

 

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

 

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

  

        该方法不失为一种好方法;但是,却由于这 where 1=1 不知道让多少新手,琢磨了多少次,始终不得要领,同时,还有可能会误导新手误入歧途;

  

        希望本文对您有所帮助。

 

转自:http://www.dzwebs.net/2418.html

分享到:
评论

相关推荐

    基于MySQL到MongoDB简易对照表的详解

    查询:MySQL:SELECT * FROM userMongo:db.user.find()MySQL:SELECT * FROM user WHERE name = ‘starlee’Mongo:db.user.find({‘name’ : ‘starlee’})插入:MySQL:INSERT INOT user (`name`, `age`) values (...

    详解Mysql多表联合查询效率分析及优化

    SELECT * FROM table1 CROSS JOIN table2 SELECT * FROM table1 JOIN table2 SELECT * FROM table1,table2  由于其返回的结果为被连接的两个数据表的乘积,因此当有WHERE, ON或USING条件的时候一般不建议使用,...

    MySQL null与not null和null与空值的区别详解

    判断字段不为空的时候,到底要 select * from table where column <> ” 还是要用 select * from table wherecolumn is not null 呢。 带着上面几个疑问,我们来深入研究一下null 和 not null 到底有什么不一样...

    MySQL中分页优化的实例详解

    SELECT * FROM `t1` WHERE ftype=1 ORDER BY id DESC LIMIT 100, 10; 或者像下面这个不带任何条件的分页SQL: SELECT * FROM `t1` ORDER BY id DESC LIMIT 100, 10; 一般而言,分页SQL的耗时随着 start 值的增加...

    MySQL中replace into语句的用法详解

    if not exists (select 1 from table where id = 1) insert into table(id, update_time) values(1, getdate()) else update table set update_time = getdate() where id = 1 在MySQL 中也可以先select,判断是否...

    详解Mysql查询条件中字符串尾部有空格也能匹配上的问题

    一、表结构 TABLE person id name 1 你 2 你(一个空格) 3 你(二个空格) 二、查询与结果 select * from person where `name` = ? 无论 ?...select * from person where `name` l

    Oracle分页查询性能优化代码详解

    Select rownum rn,t.* from table t) Where rn>&minnum and rn<=&maxnum 或者 Select * from ( Select rownum rn,t.* from table t rownum<=&maxnum) Where rn>&minnum 看似相似的分页语句,在响

    SQLServer中防止并发插入重复数据的方法详解

    insert into Table(****) select **** where not exists(select 1 from Table where ****); 3.使用SERIALIZABLE隔离级别,并且使用updlock或者xlock锁提示(等效于在默认隔离级别下使用(updlock,holdlock)或(xlock,...

    Oracle数据库使用及命名规则的详解

     1. 本注释说明主要用于PL/SQL程序及其它SQL文件,其它可作参考;  2. SQLPLUS接受的注释有三种:  ―― 这儿是注释  /* 这儿是注释 */  REM 这儿是注释  3. 开始注释,类似JAVAK中的开始注释,...

    mysql exists与not exists实例详解

    mysql exists与not exists实例详解 tableA |column1 | column1 |column3 | tableb |column1 | column1 |column3 | 要查询 tableA 的数据,条件是是 tableA.column1 不在 tableB 的 tableB.column2 中 也就是要得到...

    mysql之explain使用详解(分析索引)

    explain select * from statuses_status where id=11; explain列的解释 table:显示这一行的数据是关于哪张表的 type:这是重要的列,显示连接使用了何种类型。从最好到最差的连接类型为const、eq_reg、ref、range...

    Linux系统重启db2数据库命令实例详解.docx

    db2 list tables for schema [user] 复制一张表:db2 create table t1 like t2 显示表结构:db2 describe table tablename 查询表:db2 "select * from table tablename where ..." 执行SQL脚本:db2 -tvf scripts....

    详解SQL Server的简单查询语句

    所有复杂的语句都是由简单的语句组成基本都是由SELECT、FROM、WHERE、GROUP BY、HAVING、ORDER BY等组成,当然还包括一些谓词等等。比如当我们要查询某表中所有数据时我们会像如下进行。 SELECT * FROM TABLE 到这里...

    sql中的left join及on、where条件关键字的区别详解

    FROM table_name1 LEFT JOIN table_name2 ON table_name1.column_name=table_name2.column_name 注释:在某些数据库中, LEFT JOIN 称为 LEFT OUTER JOIN。 创建两张表并插入一些数据 create table class( class_...

    如何提高MySQL Limit查询性能的方法详解

    select * from mytable where index_col = xxx limit offset, limit; 经验:如果没有blob/text字段,单行记录比较小,可以把 limit 设大点,会加快速度。 问题:头几万条读取很快,但是速度呈线性下降,同

    详解SQL死锁检测的方法

    sql server中的死锁是指进程之间互相永久阻塞的状态,下文就将为您介绍如何检测sql ...IF EXISTS(SELECT name FROM sysobjects WHERE name='goods_sort' AND xtype='U') DROP TABLE dbo.goods_sort --创建商品分类表

    Oracle查看表结构命令详解

    获取表: ...select table_name from dba_tables where owner='\u7528\u6237\u540d' user_tables: table_name,tablespace_name,last_analyzed等 dba_tables: ower,table_name,tablespace_name,last_analy

    ORACLE中如何找到未提交事务的SQL语句详解

    在Oracle数据库中,我们能否找到未提交事务(uncommit transactin)的SQL语句或其他相关信息呢? 关于这个问题,我们先来看看实验测试吧。实践出真知。 首先,我们在会话1(SID=63)...SQL> delete from test where obj

    MySQL Innodb表导致死锁日志情况分析与归纳

    两个sql语句如下:(1)insert into backup_table select * from source_table(2)DELETE FROM source_table WHERE Id>5 AND titleWeight<32768 AND joinTime<‘$daysago_1week’teamUser表的表结构如下:...

    oracle详解

    例如:imp userid=test1/test1 file=expdat.dmp fromuser=test1 touser=test1 indexes=N 表空间传输 表空间传输是8i新增加的一种快速在数据库间移动数据的一种办法,是把一个数据库上的格式数据文件附加到另外一个...

Global site tag (gtag.js) - Google Analytics