`
hanjian861202
  • 浏览: 164986 次
  • 性别: Icon_minigender_1
  • 来自: 南京
文章分类
社区版块
存档分类
最新评论

Oracle:sql占位操作与开关操作

阅读更多

sql占位操作:

where 1=1; 这个条件始终为True,在不定数量查询条件情况下,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模板,其中有一个开关(1=:p1 and...),如果我们希望后面的and起作用,那么p1就赋值为1,如果不希望后面的and起作用,p1就赋非1的值。

==========================================

性能影响:

 

      占位操作是开发人员常用的一种编程方法,比如WHERE条件是动态生成的,那么WHERE后面的第一个条件和更后面的条件是不同的,WHERE 后的第一个条件前面没有任何运算符,而后面的都带有运算符,因此如果WHERE变为WHERE 1=1,那么后面的所有条件都有运算符,编程就简单很多。实际上占位操作是一种很不好的编程习惯,如果条件很复杂,又大量使用占位操作,那么会导致优化器无法获得正确的执行计划。

 

 

       开关操作也是编程人员常用的一种编程手段,同样也是性能杀手。比如写好一个SQL模板,其中有一个开关(1=:p1 and...),如果我们希望后面的and起作用,那么p1就赋值为1,如果不希望后面的and起作用,p1就赋非1的值。

对较为复杂情况的应用来说,占位操作和开关操作可以提高SQL代码的重用,简化SQL的逻辑关系。但是占位操作可能带来严重的数据库性能问题。由于使用了大量的开关变量和占位符,所以优化器很容易产生错误的执行计划,增加SQL的成本。实际上,占位操作完全可以通过应用程序的逻辑来替代。在应用软件开发过程中,尽量不要为了满足复杂的逻辑关系而编写过于庞大的SQL。通过程序的逻辑控制,将一个复杂的SQL分解为几个小型的SQL是一种十分好的编程习惯。由于开发团队往往过多地考虑功能上的实现以及代码的重用,而无法考虑到维护中产生的额外成本,所以维护团队中的DBA需要给开发团队的开发人员一定的培训,并且参与到各级评审中,尽早避免出现这种含有大量开关操作和占位操作的SQL。

 

分享到:
评论

相关推荐

    Toad for Oracle:SQL编辑与优化技巧.docx

    Toad for Oracle:SQL编辑与优化技巧.docx

    Oracle 高性能SQL引擎剖析:SQL优化与调优机制详解

    Oracle数据库的性能优化直接关系到系统的运行效率,而影响数据库性能...《Oracle 高性能SQL引擎剖析:SQL优化与调优机制详解》内容丰富且深入,破解了Oracle技术的很多秘密,适合Oracle数据库管理员、应用开发人员参考。

    oracle DBA认证资料 1z0-001

    M03989 Instroduction to Oracle: SQL and PL/SQL Participant Guide Vol. 1 M03990 Instroduction to Oracle: SQL and PL/SQL Participant Guide Vol. 2 M03991 Instroduction to Oracle: SQL and PL/SQL ...

    Oracle Database 11g:SQL Fundamentals I1

    标签 “oracle 1z0-051” 指的是与 Oracle 认证考试相关的编号,具体来说,1Z0-051 是 Oracle Database 11g: SQL Fundamentals 认证考试的代码。这意味着本教程不仅涵盖了 SQL 基础知识,还特别针对该认证考试进行了...

    ORACLE与SQLSERVER中的语法区别

    ORACLE 与 SQL SERVER 中的语法区别 在数据库管理系统中,ORACLE 和 SQL Server 是两个常用的关系数据库管理系统。虽然它们都使用 SQL 语言,但是它们之间存在一些语法上的区别。这篇文章将详细介绍 ORACLE 和 SQL ...

    深入浅出Oracle: DBA入门、进阶与诊断案例.pdf

    《深入浅出Oracle:DBA入门、进阶与诊断案例》是一本专为数据库管理员(DBA)设计的Oracle技术指南。这本书详细介绍了Oracle数据库管理的基础知识,中级技能以及高级故障诊断技巧,旨在帮助读者从新手到专家逐步提升...

    oracle官方文档:SQL参考手册

    oracle官方文档:SQL参考手册,最权威的oracle资料。

    Introduction to Oracle9i:SQL Ed 2.0

    **标题与描述**:“Introduction to Oracle9i:SQL Ed 2.0” 指的是针对 Oracle9i 数据库系统的 SQL 版本 2.0 的介绍性课程。该课程旨在为学习者提供关于 Oracle9i RDBMS(关系数据库管理系统)和 ORDBMS(对象关系...

    ORACLE和SQL Server的语法区别

    - **Oracle:** Oracle支持复杂的查询,包括连接操作、分组、排序等。例如,`START WITH ... CONNECT BY` 子句可用于构建层次结构查询。 ```sql SELECT /*+ optimizer_hints */ [ALL|DISTINCT] select_list ...

    ORACLE_SQLDeveloper使用教程

    本文详细介绍了如何使用 Oracle SQL Developer 和其他开发工具,包括 Oracle Database Home Page 的使用方法、如何在 Oracle 中使用 SQL*Plus、如何使用 SQL Developer 操作 Oracle 数据库以及如何执行 SQL 语句等...

    Oracle Database 11g:SQL基础I (学生指南第2册)中文版

    Oracle Database 11g:SQL基础I (学生指南第2册)官方中文版教材

    SQLserver、Oracle、Mysql语法与用法对比

    - Oracle:在SQL命令窗口中,可以使用`desc 表名`或`describe 表名` - MySQL:`desc 表名`或`show columns from 表名` 2. **修改数据库名称**: - SQL Server:`exec sp_renamedb '旧数据库名', '新数据库名'` ...

    Oracle SQL 优化与调优技术详解-附录:SQL提示

    这里提供的知识是基于黄玮编写的《Oracle高性能SQL引擎剖析:Oracle SQL优化与调优技术详解》一书的内容,以及上述文档提供的相关知识点。在实际应用中,可以参考这些内容来优化Oracle数据库中的SQL查询。同时,为了...

    Introduction to Oracle9i : SQL

    Introduction to Oracle9i: SQL Electronic Presentation 英文版的

    Oracle的SQL监视工具SQLTracker

    Oracle的SQL监视工具SQLTracker是一款强大的性能分析工具,专为数据库管理员和开发人员设计,用于诊断和优化SQL查询性能。这款工具在Oracle数据库环境中扮演着重要角色,它可以帮助用户实时监控SQL语句的执行情况,...

    Introduction to Oracle9i: SQL

    Introduction to Oracle9i: SQL Electronic Presentation 40049GC11 Production 1.1 October 2001

    ORACLE和SQL语法区别归纳

    本文旨在为初学者提供关于Oracle与SQL Server在数据类型、函数及日期操作等方面的语法差异总结,帮助读者更好地理解这两种数据库管理系统的特点,并能够在实际应用中灵活选择合适的语法进行操作。 #### 数据类型...

Global site tag (gtag.js) - Google Analytics