`
SunnyYoona
  • 浏览: 361633 次
社区版块
存档分类
最新评论

[技术点]SQL 多条件查询

 
阅读更多

网上有不少人提出过类似的问题:“看到有人写了WHERE 1=1这样的SQL,到底是什么意思?”。其实使用这种用法的开发人员一般都是在使用动态组装的SQL。让我们想像如下的场景:用户要求提供一个灵活的查询界面来根据各种复杂的条件来查询员工信息,界面如下图:

界面中列出了四个查询条件,包括按工号查询、按姓名查询、按年龄查询以及按工资查询,每个查询条件前都有一个复选框,如果复选框被选中,则表示将其做为一个过滤条件。比如上图就表示“检索工号介于DEV001和DEV008之间、姓名中含有J并且工资介于3000元到6000元的员工信息”。如果不选中姓名前的复选框,比如下图表示“检索工号介于DEV001和DEV008之间并且工资介于3000元到6000元的员工信息”:

如果将所有的复选框都不选中,则表示表示“检索所有员工信息”,比如下图:

这里的数据检索与前面的数据检索都不一样,因为前边例子中的数据检索的过滤条件都是确定的,而这里的过滤条件则随着用户设置的不同而有变化,这时就要根据用户的设置来动态组装SQL了。当不选中年龄前的复选框的时候要使用下面的SQL语句:

SELECT * FROM T_Employee
WHERE FNumber BETWEEN 'DEV001' AND 'DEV008'
AND FName LIKE '%J%'
AND FSalary BETWEEN 3000 AND 6000

而如果不选中姓名和年龄前的复选框的时候就要使用下面的SQL语句:

SELECT * FROM T_Employee
WHERE FNumber BETWEEN 'DEV001' AND 'DEV008'
AND FSalary BETWEEN 3000 AND 6000
而如果将所有的复选框都不选中的时候就要使用下面的SQL语句:
SELECT * FROM T_Employee

要实现这种动态的SQL语句拼装,我们可以在宿主语言中建立一个字符串,然后逐个判断各个复选框是否选中来向这个字符串中添加SQL语句片段。这里有一个问题就是当有复选框被选中的时候SQL语句是含有WHERE子句的, 而当所有的复选框都没有被选中的时候就没有WHERE子句了,因此在添加每一个过滤条件判断的时候都要判断是否已经存在WHERE语句了,如果没有WHERE语句则添加WHERE语句。 在判断每一个复选框的时候都要去判断, 这使得用起来非常麻烦,“聪明的程序员是会偷懒的程序员”,因此开发人员想到了一个捷径:为SQL语句指定一个永远为真的条件语句(比如“1=1”),这样就不用考虑WHERE语句是否存在的问题了。伪代码如下:

String sql = " SELECT * FROM T_Employee WHERE 1=1";
if(工号复选框选中)
{
sql.appendLine(
"AND FNumber BETWEEN '"+工号文本框1内容+"' AND '"+工号文本框2内容+"'");
}
if(姓名复选框选中)
{
sql.appendLine(
"AND FName LIKE '%"+姓名文本框内容+"%'");
}
if(年龄复选框选中)
{
sql.appendLine(
"AND FAge BETWEEN "+年龄文本框1内容+" AND "+年龄文本框2内容);
}
executeSQL(sql);
这样如果不选中姓名和年龄前的复选框的时候就会执行下面的SQL语句:
SELECT * FROM T_Employee WHERE 1=1
AND FNumber BETWEEN
'DEV001' AND 'DEV008'
AND FSalary BETWEEN
3000 AND 6000
而如果将所有的复选框都不选中的时候就会执行下面的SQL语句:
SELECT * FROM T_Employee WHERE 1=1

这看似非常优美的解决了问题,殊不知这样很可能会造成非常大的性能损失,因为使用添加了“1=1”的过滤条件以后数据库系统就无法使用索引等查询优化策略,数据库系统将会被迫对每行数据进行扫描(也就是全表扫描)以比较此行是否满足过滤条件,当表中数据量比较大的时候查询速度会非常慢。因此如果数据检索对性能有比较高的要求就不要使用这种“简便”的方式。下面给出一种参考实现,伪代码如下:

private void doQuery()
{
Bool hasWhere
= false;
StringBuilder sql
= new StringBuilder(" SELECT * FROM T_Employee");
if(工号复选框选中)
{
hasWhere
= appendWhereIfNeed(sql, hasWhere);
sql.appendLine(
"FNumber BETWEEN '"+工号文本框1内容+"' AND '"+工号文本框2内容+"'");
}
if(姓名复选框选中)
{
hasWhere
= appendWhereIfNeed(sql, hasWhere);
sql.appendLine(
"FName LIKE '%"+姓名文本框内容+"%'");
}
if(年龄复选框选中)
{
hasWhere
= appendWhereIfNeed(sql, hasWhere);
sql.appendLine(
"FAge BETWEEN "+年龄文本框1内容+" AND "+年龄文本框2内容);
}
executeSQL(sql);
}
private Bool appendWhereIfNeed(StringBuilder sql,Bool hasWhere)
{
if(hasWhere==false)
{
sql. appendLine(
"WHERE");
}
else
{
sql. appendLine(
"AND");
}
}

以上内容由博主摘自《程序员的SQL金典》。


模糊查询时:

  1. Stringname=request.getParameter("name");//姓名
  2. Stringrank=request.getParameter("age");//年龄
  3. Stringaddress=request.getParameter("address");//地址
  4. Stringsql="select*fromstudentwhere1=1";
  5. if(name!=null&&!name.equals("")){
  6. sql+="t.namelike'%"+name+"%'";
  7. }
  8. if(rank!=null&&!rank.equals("")){
  9. sql+="t.agelike'%"+age+"%'";
  10. }
  11. if(address!=null&&!address.equals("")){
  12. sql+="t.addresslike'%"+address+"%'";
  13. }
分享到:
评论

相关推荐

    Python使用sql语句对mysql数据库多条件模糊查询.pdf

    Python使用sql语句对mysql数据库多条件模糊查询

    SQL数据库查询技术

    SQL数据库查询技术包含: 1.数据库基础 2.设置SQL语句执行的环境 3.SQL语言基础 4.数据表 5.索引 6.查询数据——SELECT语句 7.条件查询 8.高级条件查询 9.SQL函数的使用

    SQL数据库查询技术教学课件9讲

    教程名称:SQL数据库查询技术教学课件9讲课程目录:【】01 数据库基础【】02 设置SQL语句执行的环境【】03 SQL语言基础【】04 数据表【】05 索引【】06 查询数据----SELECT语句【】07 条件查询【】08 高级条件查询...

    Microsoft_SQL_Server_2005技术内幕:T-SQL查询.pdf

    本书及其续篇——《Microsoft SQL Server 2005技术内幕:T-SQL程序设计》介绍了SQL Server 2005中高级T-SQL查询、查询优化及编程相关的知识。这两本书侧重于解决实践中的常见问题,并讨论了解决这些问题的方法。它们...

    sql查询和排序

    内容:本章介绍SQL语句的条件查询和排序操作。 产品:Oracle 10g 技术:SQL语句、Sql*Plus 难度:★★☆☆☆

    --[★]SqlServer 多条件查询 [存储过程] 经典例子.docx

    --[★]SqlServer 多条件查询 [存储过程] 经典例子.docx

    SQL Server数据库查询速度慢原因及优化方法

    【赛迪网-IT技术报道】SQL Server数据库查询速度慢的原因有很多,常见的有以下几种:  1、没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷)  2、I/O吞吐量小,形成了瓶颈效应。  3、没有...

    SQLServer2008查询性能优化 2/2

    书名: SQLServer2008查询性能优化 作者: 弗里奇(Grant Fritchey) 出版社: 人民邮电出版社 出版日期: 2010年8月1日 ISBN: 9787115230294 编辑推荐 《SQL Server 2008查询性能优化》为你提供了处理查询性能所...

    mybatis多条件查询处理方案(查询条件为数据库字段非传递参数).pdf

    mybatis多条件查询处理方案(查询条件为数据库字段非传递参数)

    精通SQL 结构化查询语言详解

    《精通SQ:结构化查询语言详解》全面讲解SQL语言,提供317个典型应用,读者可以随查随用,针对SQL Server和Oracle进行讲解,很有代表性。 全书共包括大小实例317个,突出了速学速查的特色。《精通SQ:结构化查询语言...

    VC++中数据库及其相关技术&使用SQL查询、操纵数据库

    并添加记录、使用ADO在数据库中遍历、修改和删除记录、使用ADO Data和DataGrid控件实现遍历、修改、删除、添加、使用ADO直接操作Access...条件查询、实例使用SQL语句进行时间条件检索、使用SQL语句对数据库进行通用操作...

    精通SQL--结构化查询语言详解

    10.1.1 在多表查询中使用子查询 187 10.1.2 在子查询中使用聚合函数 188 10.2 创建和使用返回多行的子查询 190 10.2.1 in子查询 190 10.2.2 in子查询实现集合交和集合差运算 191 10.2.3 exists子查询 192 ...

    ssm框架\mybatis\动态sql\1.使用动态SQL完成多条件查询\示例3:改造用户表的查询操作-if+whe

    ssm框架\mybatis\动态sql\1.使用动态SQL完成多条件查询\示例3:改造用户表的查询操作-if+where(教材示例5)

    Microsoft SQL Server 2005技术内幕: T-SQ程序设计.pdf

    从1992年开始,Itzik就一直致力于涉及各种数据库和计算机系统相关技术的多个课题。除了帮助顾客处理紧迫的要求、修复问题、优化数据库、教学和担任顾问以外,他还帮助开发人员和数据库管理员转变关系/基于集合的理念...

    SQL查询技巧(范例宝典)

    SQL查询相关技术,源码大放送! 10.1 SELECT子句 426  实例292 查询特定列数据 426  实例293 使用列别名 428  实例294 在列上加入计算 430 EX10_03  实例295 使用函数设置条件 431  10.2 查询...

    SQL查询安全性及性能优化

    子查询嵌套过多对性能有影响,查询关联的表特别多也影响性能  频繁访问数据等等 SQL如何被SQLServer执行的 SQL执行原理  解释:首先解释SQL语句【语法是否正确】  解析:检验语句的出现的对象是否有效...

    SQL选择查询选择查询选择查询选择查询选择查询选择查询

    考 生 信 息 栏 系 专业 级 班级 姓名 学号 装 订 线 厦门理工学院试卷 2006-2007 学年 第 2 学期 课程名称 数据库原理及应用 试卷 卷别 A □ B √ ...A)1个 B)2个 C)3个 D)任意多个

    SQL Server数据库技术大全 电子书

    SQL Server数据库技术大全 电子书 图书目录: 第1篇 SQL Server基础 第1章 SQL Server 2008概述/2 1.1 SQL Server 2008简介/2 1.1.1 SQL Server发展历史/2 1.1.2 SQL Server 2008的特点/4 1.2 SQL Server 2008架构...

Global site tag (gtag.js) - Google Analytics