当前位置:  数据库>sqlserver

sql where 1=1的优缺点分析

    来源: 互联网  发布时间:2014-10-10

    本文导语:   一、不用where  1=1  在多条件查询中的困扰  举个例子,如果您做查询页面,并且,可查询的选项有多个,同时,还让用户自行选择并输入查询关键词,那么,按平时的查询语句的动态构造,代码大体如下:  代码如下: ...

 
一、不用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=0; 这个条件始终为false,结果不会返回任何数据,只有表结构,可用于快速建表
 

代码如下:

"SELECT * FROM strName WHERE 1 = 0";

该select语句主要用于读取表的结构而不考虑表中的数据,这样节省了内存,因为可以不用保存结果集。 
代码如下:

create table newtable as select * from oldtable where 1=0;  创建一个新表,而新表的结构与查询的表的结构是一样的。

    
 
 

您可能感兴趣的文章:

  • SQL查询分析工具 SQL Workbench/J
  • oracle导出sql语句的结果集和保存执行的sql语句(深入分析)
  • 基于SQL的日志分析工具 myselect
  • 关于SQL嵌套的误解分析
  • sql server中通过查询分析器实现数据库的备份与恢复方法分享
  • SQL语句中SUM与COUNT的区别深入分析
  • SQL Server 死锁原因分析与解决办法
  • 有关sql server中千万级数据的like问题分析
  • unix shell 里调用sql ,请帮手分析问题,谢谢
  • sql server 2008时间查询问题分析
  • 通过分析SQL语句的执行计划优化SQL
  • SQL 中having 和where的区别分析
  • jdbc连接sql server数据库问题分析
  • 深入sql数据连接时的一些问题分析
  • SQL查询前10条记录(SqlServer/mysql/oracle)的语法分析
  • Discuz7.2版的faq.php SQL注入漏洞分析
  • 对于ThinkPHP框架早期版本的一个SQL注入漏洞详细分析
  • SQL Server 置疑、可疑、正在恢复等情况分析
  • SQL 查询分析中使用net命令问题
  • SQL Server和Oracle并行处理比较分析
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • sql筛选记录的语句之where、having的区别
  • sql server在多表关联时where语句中慎用trim()方法
  • sql语句之WHERE子句用法
  • sql server中having与where的区别
  • 解析sql语句中left_join、inner_join中的on与where的区别
  • SQL中WHERE变量IS NULL条件导致全表扫描问题的解决方法
  • UCenter info: MySQL Query Error SQL:SELECT value FROM [Table]vars WHERE noteexists
  • T-SQL实例 在where子句中使用and操作符
  • sql连接查询中where关键字的位置优化
  • sql连接查询中,where关键字的位置讲解
  • 有关sql server参数化查询之where in和like实现的讲解
  • java命名空间java.sql接口statement的类成员方法: executeupdate定义及介绍
  • 请问,这是什么错误!java.sql.SQLException: [Microsoft][ODBC SQL Server Driver][Named Pipes]??????? SQL Server?虽然分少,但一定给,只要您是前5名回复者中最好的以为!
  • java命名空间java.sql接口connection的类成员方法: nativesql定义及介绍
  • SQL Server统计SQL语句执行时间的脚本
  • java命名空间java.sql接口preparedstatement的类成员方法: executeupdate定义及介绍
  • SQL客户端软件 PKLite SQL Client
  • java命名空间java.sql接口rowid的类成员方法: getbytes定义及介绍
  • SQL语句实现SQL Server 2000及Sql Server 2005日志收缩(批量)
  • java命名空间java.sql接口ref的类成员方法: getbasetypename定义及介绍
  • SQL客户端管理工具 SQuirreL SQL Client
  • java命名空间java.sql接口databasemetadata的类成员方法: getsqlkeywords定义及介绍
  • 如何处理此错误:java.sql.SQLException: [Microsoft][ODBC SQL Server Driver]没有执行可选特性
  • java命名空间java.sql接口rowid的类成员方法: tostring定义及介绍
  • sql2005 大数据量检索分页的sql代码
  • java命名空间javax.sql.rowset接口joinrowset的类成员方法: getwhereclause定义及介绍
  • 如何实现连接一次数据库,提交多个sql语句。(sql的批处理)
  • java命名空间java.sql接口statement的类成员方法: execute定义及介绍
  • 微软网站下载的Ms SQL Server2000 JDBC Driver,必须用英文版的SQL server2000吗?
  • java命名空间java.sql接口resultset的类成员方法: getcursorname定义及介绍
  • 安装SQL2008时提示删除SQL2005Express工具的解决方法


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3