查询参数提高SQL语句的利用率

运维 数据库运维
数据库的应用中,参数的查询时数据库管理员经常会用到的一种数据库功能,本文要为大家介绍的是查询参数提高SQL语句的利用率。

导读:有时候数据库管理员在查询记录的时候,有可能只是查询条件不同,而其他的内容都是相同的。如人事部门可能每天都需要查询当天矿工、迟到、早退的员工,然后向人事经理汇报。其实这个时候SQL语句的大部分都是相同的,只是查询条件中一个时间不一样而已。遇到这种情况时,数据库管理员需要创建可以使用多次但每次使用不同值的查询。在SQLServer数据库中,把这种情况叫做参数查询。参数的查询要利用SQL语句,从而提高了SQL语句的利用率。

  一、 在什么时候使用参数符号。

  在SQLServer数据库中,其提供的语言支持使用参数来作为查询条件。如果用户需要创建每次使用不同值的查询,则可以在查询中使用参数。那么这个参数到底是什么呢?其实确切的说,应该把这个参数叫做占位符。即参数是在运行查询时提供值的占位符。在SQLServer数据库中,在需要显示的内容(Select子句)与查询条件(Where子句)中都可以采用参数,从其他地方接收输入的值。不过大部分情况下,都只在查询条件中使用参数。即在单个行或者组的搜索条件中使用参数作为占位符。

  不过并不是说只有在搜索条件中才能够使用参数,只是说在搜索中参数使用的比较多而已。另外,有时候在表达式中可能也会用的比较多。如一个ERP系统中,可能会有一定的价格折扣,如5%的折扣。那么在应用程序设计的时候,就需要把这个折扣率从前台传递到后台的SQL语句中。然后数据库系统根据这个折扣率把计算后的架构回传给前台的客户端。在这个过程中,如果能够采用参数来实现的话,就可以提高SQL语句的利用率。不用每次使用不同的折扣率,而采用不同的SQL语句。

  所以说,参数在SQLServer中的应用范围是非常广泛的。通常情况下,在SQL语句的任何部分都可以采用参数来接受外部传入的值,从而避免每次参数不同而调整SQL语句的情况。

  二、 未命名参数与命名参数。

  在SQLServer中,参数可以分为两种,即未命名参数与命名参数。通常情况下,如果SQL语句中只需要一个参数的话,那么可以采用未命名参数。如需要查询某个员工上班到现在的全部出勤信息。此时就只需要用到员工编号这个参数即可。此时可以采用未命名的参数。不过有的时候可能查询时需要不止一个参数。如现在需要查询某个员工在4月份的出勤情况。此时就需要两个参数,分别为员工编号、月份。或者需要三个参数,分别为员工编号、开始日期、结束日期等等。总之要多于一个参数。此时就需要使用命名参数。因为如果使用未命名参数的话,则数据库并不知道要把哪个参数对应到哪个地方。所以说,如果要在查询中使用多个参数,那么此时命名参数就会非常有用。

  未命名的参数使用很简单。不需要像应用程序开发那样,先声明再使用。而是在需要的地方直接输入?符号即可。如需要把某个员工最为参数的话,则可以使用ad_user_id =?即可。这里需要注意一点,这里不需要加入单引号。因为正常情况下,如果输入的条件是字符型的话,则必须利用单引号括起来。如果输入的条件是数字的话,则不用单引号。但是如果采用的是参数的话,无论最终输入的数据类型是什么,这里都不用单引号。否则的话,就不能够达到预期的效果。

  如果采用的是命名参数的话,也不需要事先定义。只需要在使用的时候定义参数名字即可。这个定义的过程也很简单。如现在用户需要按员工编号与日期来查询某个员工的出勤记录。此时只需要使用AD_USER_ID=%USER_ID% AND USERDATE=%USERSDATE%。从这里可以看出,未命名参数与命名参数使用的参数符号是不同的。在命名参数是,需要中参数名字的前后使用%号,表示这是一个命名参数。不过这个前缀与后缀的字符数据库管理员可以根据自己的需要来进行自定义。不过需要注意的就是,在创建命名参数查询之前,必须要先预先定义后这个参数的前缀与后缀符号。

  三、 在循环中使用参数标记。

  参数不仅可以用在Select查询语句中,有时候在一些循环语句中也可以使用。如现在有一个股票分析系统。用户自定义了10只关注的股票。现在这个系统要每隔30秒就从数据库系统中读取这十只股票的***价格。此时该如何实现呢?

  当然用户也可以在查询条件语句中通过输入10个股票的代码来实现查询。但是这个做非常的麻烦。而且由于用户关注的股票数量不确定,所以采用多个命名参数来实现的话,也不现实。虽然SQL语句可以接受多个参数,但是其参数的数量必须是固定的。像现在这种不固定的参数,SQL语句也很难实现。针对这种情况,只有通过循环语句来实现。即在SQL语句中只使用一个参数,即股票代码这个参数。然后通过循环语句把用户选定的股票代码一个一个的传递进去。传进去***个后,数据库返回结果;然后再传进去第二个,再返回结果。知道***一个参数传递完毕。通常情况下,可以把这个循环语句做成一个存储过程或者函数。然后通过参数的个数来控制循环的次数。这种解决方案可以很好的实现因为参数个数不确定而难以处理的情况。当然,这其中仍然参数在起着主导作用。

  四、 在SET语句中使用参数。

  企业有时候可能遇到这种需求,即把满足某个条件的记录中,某些字段利用某个参数值来进行代替。如企业可能经济效益好,要把提升员工的工资。其中普通员工提升10%,管理层员工提升15%。此时就需要用到SQL语句中的Update语句。这更新的时候,需要用到两个参数。一个是员工的类别,即是属于普通员工又或者是属于管理层员工;第二个参数是提升的百分比,是提升10%还是15%。

  其实在实际工作中,有很多地方需要用到类似地参数与语句。如在ERP系统中,有时候需要根据产品的类别或者供应商来更新价格;如有时候需要把好几年都没有用过的产品信息设置为不活跃;有时候需要把订单尾数少于5的采购订单指定为结束等等。所有,数据库管理员必须要掌握这种参数与Upadate语句结合使用的案例。这有助于数据库管理员在日后的工作中,利用这些语句顺利完成任务。

  五、 使用参数时的注意事项。

  从上面分析中可以看出,使用参数与不使用参数有一个很大的区别。如果直接在SQL语句中输入查询条件(不通过参数来实现),那么数据库在编译SQL语句的时候,会进行语法方面的检查。如果输入的条件有错误,或者其数据类型跟需要比较字段的数据类型不一致,或者在SET语句中需要更新的值与数据库字段的数据类型不一致的话,那么数据库就会提示错误信息。也就是说,在执行语句之前,就对了一道保障。

  但是如果使用参数来传递数据的话,有一个不好的信息。即在SQL语句执行时,传递的参数是否符合要求呢?此时对数据库来说,只有在SQL语句执行的时候才能够知道。为了避免这种情况,***能够在应用程序那边进行相关的判断与限制。如需要查询今天是否有员工旷工、迟到、早退等等情况。一共需要两个参数,一是时间,二是事由(可以多选)。但是这两个数据又都是比较特别的。如时间是一个日期类型的数据。如果在应用程序客户端用户不小心输入了一个不是日期类型的数据,或者把2009年5月20日写成了2009年5月40日。这很可能是笔误,但这毕竟是错误,数据库无法识别类似的错误。为此***能够在应用程序客户端处就进行检查。如果发现这个输入的日期非法的话,就在客户端把这个参数传递给数据库之前就提示参数输入错误。

  另外事由这个字段应该是跟列表类似的数据类型。在数据库中只保存着对应的几个编码。也就是说,其输入的是有一定含义的序列。对于这种数据,在客户端上也需要进行控制。其实控制起来也很简单。即不要让用户自己手工输入,而是通过复选框的形式来用户来进行选择。然后应用程序直接根据选择的内容翻译成对应的参数然后传递给数据库中的SQL语句。显然在应用程序客户端层面可以对参数的合法性进行控制,***限度的保障输入的数据符合SQL语句的要求。避免因为数据类型不一致而导致SQL语句执行错误。所以,在SQLServer数据库使用参数的话,数据库管理员还需要跟程序开发者好好沟通,才能够让参数发挥其应有的作用。

这就是我要为大家介绍的查询参数提高SQL语句的利用率的全部内容,希望大家能充分理解文章内容,将文中的知识真正变成自己的知识,为大家以后的工作带去便利。

【编辑推荐】

  1. 写出高性能SQL语句的十三条法则
  2. 开启MySQL慢查询 查找影响效率的SQL语句
  3. 通过索引优化MySQL语句的实现方法
责任编辑:迎迎 来源: IT专家网
相关推荐

2021-02-03 09:26:49

数据中心基础设施能源

2011-04-02 11:16:16

MRTG监控带宽

2013-09-29 16:09:26

OpenStack云计算

2022-11-29 11:33:30

戴尔

2010-11-15 16:46:49

Oracle查询效率

2012-05-08 15:04:12

Platform

2023-04-04 09:22:50

LinuxCPU命令

2017-08-25 15:56:54

Linuxproc文件系统CPU利用率

2010-03-11 16:49:55

Linux CPU利用

2011-07-13 09:16:08

服务器虚拟化数据中心

2009-01-15 18:49:03

服务器虚拟化VMware

2013-03-19 12:23:25

SDN网络利用率网络系统架构

2011-04-12 09:07:47

磁盘空间利用率虚拟化的隐藏成本

2012-11-07 15:07:30

VMware虚拟化

2012-05-08 13:24:45

负载均衡带宽锐捷网络

2013-04-02 09:15:40

服务器虚拟化

2020-02-26 16:19:44

漏洞网络安全

2011-03-17 15:16:38

2024-10-14 13:01:33

AOTcpu符号

2013-01-04 10:44:31

IBMdW
点赞
收藏

51CTO技术栈公众号