愿天天向上,愿学以致用,愿掌握生活

发布新日志

  • 删除符合条件的前N条纪录

    2007-10-10 15:07:40

    如删除A表中NAME为TOM的前3条纪录

    SET ROWCOUNT 3  
    delete from A where Name='Tom'
    SET ROWCOUNT 0

    set rowcount 3 设置只影响3行
    Set rowcount 0 设置回影响所有行

  • 使用SQL Server时最容易忽略的21个问题

    2007-10-10 14:20:01

    来源:赛迪网    作者:zy

    如果你正在负责一个基于SQL Server的项目,或者你刚刚接触SQL Server,你都有可能要面临一些数据库性能的问题,这篇文章会为你提供一些有用的指导(其中大多数也可以用于其它的DBMS)。

    在这里,我不打算介绍使用SQL Server的窍门,也不能提供一个包治百病的方案,我所做的是总结一些经验----关于如何形成一个好的设计。这些经验来自我过去几年中经受的教训,一直来,我看到许多同样的设计错误被一次又一次的重复。

    你了解工具吗?

    不要轻视这一点,这是我在这篇文章中讲述的最关键的一条。也许你也看到有很多的SQL Server程序员没有掌握全部的T-SQL命令和SQL Server提供的那些有用的工具。

    什么?我要浪费一个月的时间来学习那些我永远也不会用到的SQL命令???,你也许会这样说。对的,你不需要这样做。但是你应该用一个周末浏览所有的T-SQL命令。在这里,你的任务是了解,将来,当你设计一个查询时,你会记起来:对了,这里有一个命令可以完全实现我需要的功能,于是,到MSDN查看这个命令的确切语法。

    不要使用光标

    让我再重复一遍:不要使用光标。如果你想破坏整个系统的性能的话,它们倒是你最有效的首选办法。大多数的初学者都使用光标,而没有意识到它们对性能造成的影响。它们占用内存,还用它们那些不可思议的方式锁定表,另外,它们简直就像蜗牛。而最糟糕的是,它们可以使你的DBA所能做的一切性能优化等于没做。不知你是否知道每执行一次FETCH就等于执行一次SELECT命令?这意味着如果你的光标有10000条记录,它将执行10000SELECT!如果你使用一组SELECTUPDATE或者DELETE来完成相应的工作,那将有效率的多。

    初学者一般认为使用光标是一种比较熟悉和舒适的编程方式,可很不幸,这会导致糟糕的性能。显然,SQL的总体目的是你要实现什么,而不是怎样实现。

    我曾经用T-SQL重写了一个基于光标的存储过程,那个表只有100,000条记录,原来的存储过程用了40分钟才执行完毕,而新的存储过程只用了10秒钟。在这里,我想你应该可以看到一个不称职的程序员究竟在干了什么!!!

    我们可以写一个小程序来取得和处理数据并且更新数据库,这样做有时会更有效。记住:对于循环,T-SQL无能为力。

    我再重新提醒一下:使用光标没有好处。除了DBA的工作外,我从来没有看到过使用光标可以有效的完成任何工作。

    规范化你的资料表

    为什么不规范化数据库?大概有两个借口:出于性能的考虑和纯粹因为懒惰。至于第二点,你迟早得为此付出代价。而关于性能的问题,你不需要优化根本就不慢的东西。我经常看到一些程序员反规范化数据库,他们的理由是原来的设计太慢了,可结果却常常是他们让系统更慢了。DBMS被设计用来处理规范数据库的,因此,记住:按照规范化的要求设计数据库。

    不要使用SELECT *

    这点不太容易做到,我太了解了,因为我自己就经常这样干。可是,如果在SELECT中指定你所需要的列,那将会带来以下的好处:

    1 减少内存耗费和网络的带宽

    2 你可以得到更安全的设计

    3 给查询优化器机会从索引读取所有需要的列

    了解你将要对数据进行的操作

    为你的数据库创建一个健壮的索引,那可是功德一件。可要做到这一点简直就是一门艺术。每当你为一个表添加一个索引,SELECT会更快了,可INSERTDELETE却大大的变慢了,因为创建了维护索引需要许多额外的工作。显然,这里问题的关键是:你要对这张表进行什么样的操作。这个问题不太好把握,特别是涉及DELETEUPDATE时,因为这些语句经常在WHERE部分包含SELECT命令。

    不要给性别列创建索引

    首先,我们必须了解索引是如何加速对表的访问的。你可以将索引理解为基于一定的标准上对表进行划分的一种方式。如果你给类似于性别这样的列创建了一个索引,你仅仅是将表划分为两部分:男和女。你在处理一个有1,000,000条记录的表,这样的划分有什么意义?记住:维护索引是比较费时的。当你设计索引时,请遵循这样的规则:根据列可能包含不同内容的数目从多到少排列,比如:姓名+省份+性别。

    使用事务

    请使用事务,特别是当查询比较耗时。如果系统出现问题,这样做会救你一命的。一般有些经验的程序员都有体会-----你经常会碰到一些不可预料的情况会导致存储过程崩溃。

    小心死锁

    按照一定的次序来访问你的表。如果你先锁住表A,再锁住表B,那么在所有的存储过程中都要按照这个顺序来锁定它们。如果你(不经意的)某个存储过程中先锁定表B,再锁定表A,这可能就会导致一个死锁。如果锁定顺序没有被预先详细的设计好,死锁是不太容易被发现的。

    不要打开大的资料集

    在技术论坛中 ,一个经常被提出的问题是:我怎样才能迅速的将100000条记录添加到ComboBox中?这是不对的,你不能也不需要这样做。很简单,你的用户要浏览100000条记录才能找到需要的记录,他一定会诅咒你的。在这里,你需要的是一个更好的UI,你需要为你的用户显示不超过100200条记录。

    不要使用服务器端光标

    与服务器端光标比起来,客户端光标可以减少服务器和网络的系统开销,并且还减少锁定时间。

    使用参数查询

    有时,我在技术论坛看到类似这样的问题:“SELECT * FROM a WHERE a.id='A'B,因为单引号查询发生异常,我该怎么办?,而普遍的回答是:用两个单引号代替单引号。这是错误的。这样治标不治本,因为你还会在其它一些字符上遇到这样的问题,更何况这样会导致严重的bug,除此以外,这样做还会使SQL Server的缓冲系统无法发挥应有的作用。使用参数查询, 釜底抽薪,这些问题统统不存在了。

    在程序编码时使用大数据量的数据库

    程序员在开发中使用的测试数据库一般数据量都不大,可经常的是最终用户的数据量都很大。我们通常的做法是不对的,原因很简单:现在硬盘不是很贵,可为什么性能问题却要等到已经无可挽回的时候才被注意呢?

    不要使用INSERT导入大批的数据

    请不要这样做,除非那是必须的。使用UTS或者BCP,这样你可以一举而兼得灵活性和速度。

    注意超时问题

    查询数据库时,一般数据库的缺省都比较小,比如15秒或者30秒。而有些查询运行时间要比这长,特别是当数据库的数据量不断变大时。

    不要忽略同时修改同一记录的问题

    有时候,两个用户会同时修改同一记录,这样,后一个修改者修改了前一个修改者的操作,某些更新就会丢失。处理这种情况不是很难:创建一个timestamp字段,在写入前检查它,如果允许,就合并修改,如果存在冲突,提示用户。

    在细节表中插入纪录时,不要在主表执行SELECT MAX(ID)

    这是一个普遍的错误,当两个用户在同一时间插入数据时,这会导致错误。你可以使用SCOPE_IDENTITYIDENT_CURRENT@@IDENTITY。如果可能,不要使用@@IDENTITY,因为在有触发器的情况下,它会引起一些问题(详见这里的讨论)。

    避免将列设为NULLable

    如果可能的话,你应该避免将列设为NULLable。系统会为NULLable列的每一行分配一个额外的字节,查询时会带来更多的系统开销。另外,将列设为NULLable使编码变得复杂,因为每一次访问这些列时都必须先进行检查。

    我并不是说NULLS是麻烦的根源,尽管有些人这样认为。我认为如果你的业务规则中允许空数据,那么,将列设为NULLable有时会发挥很好的作用,但是,如果在类似下面的情况中使用NULLable,那简直就是自讨苦吃。

    CustomerName1

    CustomerAddress1

    CustomerEmail1

    CustomerName2

    CustomerAddress2

    CustomerEmail3

    CustomerName1

    CustomerAddress2

    CustomerEmail3

    如果出现这种情况,你需要规范化你的表了。

    尽量不要使用TEXT数据类型

    除非你使用TEXT处理一个很大的数据,否则不要使用它。因为它不易于查询,速度慢,用的不好还会浪费大量的空间。一般的,VARCHAR可以更好的处理你的数据。

    尽量不要使用临时表

    尽量不要使用临时表,除非你必须这样做。一般使用子查询可以代替临时表。使用临时表会带来系统开销,如果你是用COM+进行编程,它还会给你带来很大的麻烦,因为COM+使用数据库连接池而临时表却自始至终都存在。SQL Server提供了一些替代方案,比如Table数据类型。

    学会分析查询

    SQL Server查询分析器是你的好伙伴,通过它你可以了解查询和索引是如何影响性能的。

    使用参照完整性

    定义主健、唯一性约束和外键,这样做可以节约大量的时间

  • sql表数据简单操作

    2007-10-07 14:57:55

    表数据操作包括数据的插入、修改和删除。
    (insert,update,delete,truncate)
    一、插入数据

    在向表中添加数据时应该注意两点:第一是用户权限,只有sysadmin角包成员、数据库和数据库对

    象所有者及其授权用户才有权限向表中添加数据;第二是数据格式,对于不同的数据类型,插入数据的

    格式也不一样,应严格遵守它们各自的格式要求。

    Transact-SQL语言中用INSERT语句向表或视图中插入新的数据行。INSERT语句的语法格式为:

    INSERT [INTO] table_source

    {[column_list]

    VALUES ({DEFAULT | constant_expression} [,…n])

    |DEFAULT VALUES

    |select_statement

    |execute_statement

    }

    }

    其中,column_list参数为新插入数据行中一列或多列列名列表,它说明INSERT 语句只为指定列插

    入数据。在给表或视中部分列插入数据时,必须使用列名列表方式指出这部分列名。其余未指定列的列

    值要根据它们的默认值和空值属性情况而定,它们有以下几种可能取值:

    (1)对于timestamp列或具有IDENTITY属性列,它们的列值由SQL Server计算后自动赋值。

    (2)如果这些列有默认值或关联有默认数据库对象,插入新列时,它们的值为默认值。

    (3)当这些列没有默认值设置时,但它们允许空值时,该列值为空。

    (4)当这些列既没有默认值设置,也不允许空值时,SQL Server在执行INSERT 语句时将产生错误,

    导致插入操作失败。

    当未指定column_list 参数时,为各列所提供的数据顺序应严格按照表中各列的定义顺序,而使用

    column_list参数则可以调整向表中所插入数据的列顺序,只要VALUES子句所提供的数据顺序与column_

    list参数中指定的列顺序相同即可。

    VALUES子句为新插入行中column_list 参数所指定列提供数据,这些数据可以以常量表达式形式提

    供,或使用DEFAULT关键字说明向列中插入其默认值。

    DEFAULT VALUES说明向表中所有列插入其默认值。对于具有INDENTITY 属性或timestamp 数据类型

    列,系统将自动插入下一个适当值。对于没有设置默认值的列,如果它们允许空值,SQL Server将插入

    null,否则返回一错误消息。

    select_statement是标准的数据库查询语句,它是SQL Server为INSERT语句所提供的又一种数据插

    入方式。INSERT语句将select_statement子句所返回的结果集合数据插入到指定表中。查询语句结果集

    合每行中的数据数量、 数据类型和排列顺序也必须与表中所定义列或 column_list 参数中指定列的数

    量、数据类型和排列顺序完全相同。

    SQL Server为INSERT语句提供的第四种数据插入方式是通过执行系统存储过程,其数据来自于过程

    执行后所产生的结果集合。所执行的过程可以为存储过程、系统存储过程或扩展存储过程,它们既可以

    为本地存储过程,又可以是远程服务器上的存储过程,只要用户具有它们的执行权限即可。有关存储过

    程请参阅对应的内容。

    table_source说明INSERT语句插入数据时所操作的表或视图,其语法格式可简单书写为:

    {table_name [[AS] table_alias]

    | view_name [[AS] table_alias]

    }

    table_name和view_name说明被插入数据的表或视图名称,table_alias参数为表或视图设置别名。

    使用别名有两方面原因:第一、当表或视图名称较长时,使用别名可以简化书写工作;第二,在自连接

    或子查询中,使用别名可以区别同一个表或视图。

    在向表中插入数据时, 如果所插入的数据与约束或规则的要求冲突, 或是它们的数据类型不兼容

    时,将导致INSERT 语句执行失败。当使用SELECT或EXECUTE子句向表中一次插入多行数据时,如果其中

    有任一行数据有误,它将导致整个插入操作失败,使SQL Server停止所有数据行的插入操作。

    例一、使用数值列表方式( 假定 usertable 表中只定义了name、age和sex字段,且name、sex均为

    char类型,age为int类型)。

    INSERT usertable

    VALUES ('张三','女',18)

    例二、使用列名列表方式

    INSERT usertable (age,name)

    VALUES (18,'张三')

    例三、在数值列表中,还可以将变量的值插入到表中。在使用变量为列提供数据时,应保证变量的

    数据类型与列数据类型相同,或是可以自动将它们转换为相同的数据类型。例如:

    DECLARE @name char(16)

    SET @name='张三'

    INSERT usertable

    VALUES (@name,DEFAULT,20)

    本例中Asp中是这样的:

    dim name

    name="张三"

    sqlstr="INSERT usertable VALUES ('"&name&"','女',20)"

    ……



    例四、将SELECT子句的所返回的结果集合插入到表中。例如:

    INSERT usertable (name,sex,age)

    SELECT 's'+name,sex,age

    FROM usertable

    WHERE name like '张%%'


    二、修改数据

    Transact-SQL中的UPDATE语句用于修改表中数据,该语句的语法格式为:

    UPDATE ()

    SET (

    column_name={expression | DEFAULT }

    | @variable = expression

    } [,…n]

    [FROM

    {

    | (select_statement) [AS] table_alias [,…m]) ]

    }

    [,…n]

    ]

    [WHERE



    | CURRENT OF ({[GLOBAL] cursor_name } | cursor_variable_name} }

    ]

    别看写了一大堆,最常用的只是下列格式:

    UPDATE table_name

    SET column_name1=variable1,column_name2=variable2

    WHERE search_conditions

    其中table_or_view参数指出待修改的表或视图名称,其格式与INSERT语句中该参数的格式相同。

    SET子句指出表中被修改的列或变量,以及它们的新值。column_name为被修改的列名,@variable

    为一个已经声明的局部变量名称,它们修改后的值由expression表达式提供,或使用DEFAULT关键字将

    默认值赋给指定列。

    FROM子句引出另一个表,它为UPDATE语句的数据修改操作提供条件。

    WHERE子句中的search_conditions 参数说明UPDATE语句的修改条件,它指出表或视图中的哪些行

    需要修改。省略WHERE子句时,说明对指定的表或视图中的所有行进行修改!!!!

    WHERE子句中的CURRENT OF说明在游标的当前位置处执行修改操作,游标由curror_name 或游标变

    量cursor_variable_name指定。

    UPDATE不能修改具有IDENTITY属性列的列值。

    例一、将usertable表中所有人员的性别改为'男'

    UPDATE usertable

    SET sex='男'



    例二、将性别为null的所有人员的性别改成'男'

    UPDATE usertable

    SET sex='男'

    WHERE sex IS NULL

    例三、将所有姓名为null的人员的姓名改为'张三'、性别改为'女',年龄改为18

    UPDATE usertable

    SET name='张三',sex='女',age=18

    WHERE name IS NULL


    三、删除数据

    Transact-SQL中,DELETE和TRUNCATE TABLE语句均可以删除表中的数据。DELETE语句的语法格式为:

    DELETE

    {table_name | view_name}

    FROM

    {



    | (select_statement) [AS] table_alias [(column_alias [,…m])]

    }[,…n]

    [WHERE

    {

    |{ [CURRENT OF {{[global] cursor_name}

    |cursor_variable_name

    }



    DELETE语句的结构与UPDATE语句有些类似,其中也包含FROM子句和WHERE子句。WHERE子句为数据删

    除指定条件。不使用WHERE子句时,DELETE语句将把有或视图中所有的数据删除。FROM子句是Transact-

    SQL在ANSI基础上对DELETE语句的扩展,它指定要连接的表名,提供与相关子查询相似的功能。

    TRUNCATE TABLE语句语法格式为:

    TRUNCATE TABLE table_name

    TRUNCATE TABLE语句删除指定表中的所有数据行,但表结构及其所有索引继续保留,为该表所定义

    约束、规则、默认和触发器仍然有效。如果所删除表中包含有IDENTITY列,则该列将被复位到其原始基

    值。使用不带WHERE子句的DELETE语句也可以删除表中所有行,但它不复位IDENTITY列。

    与DELETE语句相比,TRUNCATE TABLE语句的删除速度更快。因为DELETE语句在每删除一行时都要把

    删除操作记录到日志中,而TRUNCATE TABLE语句则是通过释放表数据页面的方法来删除表中数据,它只

    在释放页面做一次事务日志记录。所以使用TRUNCATE TABLE语句删除数据后,这些行是不可恢复的,而

    DELETE操作则可回滚,能够恢复原来数据。

    因为TRUNCATE TABLE语句不做操作日志,它不能激活触发器,所以TRUNCATE TABLE语句不能删除一

    个被其它表通过FOREIGN KEY约束所参照的表。

    例一、使用DELETE语句删除usertable表中name为'张三'的数据行

    DELETE usertable

    WHERE name='张三'



    例二、下面使用FROM子句和WHERE子句指定条件,然后从TB_update表中删除数据

    DELETE TB_update

    FROM TB_constraint AS a,TB_update AS b

    WHERE a.name=b.name

    AND a.country='China'



    DELETE TB_update

    FROM (SELECT * FROM TB_constraint

    WHERE country='USA') AS a

    WHERE a.name=TB_update.name
  • i++与++i

    2007-10-07 13:56:09

    在某个论坛看到的一个帖子:


    ++i相当于
    {
      i = i + 1;
      return i;
    }

    而i++相当于
    {
      int j = i;
      i = i+1;
      return j;
    }

    由于i++还必须copy值给j,所以速度较慢。

    也确实看到好多开发人员用++i较多,而我们在学校学习的时候好像更偏爱i++
    这个帖子说的对不对,我也不是很确定 希望大家说说自己的想法.

     

  • 常用的WEB功能测试方法

    2007-10-07 13:30:23

    功能测试就是对产品的各功能进行验证,根据功能测试用例,逐项测试,检查产品是否达到用户要求的功能。针对Web应用的常用测试方法如下:

      1. 页面链接检查:每一个链接是否都有对应的页面,并且页面之间切换正确。


      2. 相关性检查:删除/增加一项会不会对其他项产生影响,如果产生影响,这些影响是否都正确。


      3. 检查按钮的功能是否正确:如update, cancel, delete, save等功能是否正确。


      4. 字符串长度检查: 输入超出需求所说明的字符串长度的内容, 看系统是否检查字符串长度,会不会出错。


      5. 字符类型检查: 在应该输入指定类型的内容的地方输入其他类型的内容(如在应该输入整型的地方输入其他字符类型),看系统是否检查字符类型,会否报错。


      6. 标点符号检查: 输入内容包括各种标点符号,特别是空格,各种引号,回车键.看系统处理是否正确。


      7. 中文字符处理: 在可以输入中文的系统输入中文,看会否出现乱码或出错。


      8. 检查带出信息的完整性: 在查看信息和update信息时,查看所填写的信息是不是全部带出,带出信息和添加的是否一致.

       9. 信息重复: 在一些需要命名,且名字应该唯一的信息输入重复的名字或ID,看系统有没有处理,会否报错,重名包括是否区分大小写,以及在输入内容的前后输入空格,系统是否作出正确处理。


      10. 检查删除功能:在一些可以一次删除多个信息的地方,不选择任何信息,按”delete”,看系统如何处理,会否出错;然后选择一个和多个信息,进行删除,看是否正确处理。

       11. 检查添加和修改是否一致: 检查添加和修改信息的要求是否一致,例如添加要求必填的项,修改也应该必填;添加规定为整型的项,修改也必须为整型.。


      12. 检查修改重名:修改时把不能重名的项改为已存在的内容,看会否处理,报错.同时,也要注意,会不会报和自己重名的错。


      13. 重复提交表单:一条已经成功提交的纪录,back后再提交,看看系统是否做了处理。


      14. 检查多次使用back键的情况: 在有back的地方,back,回到原来页面,再back,重复多次,看会否出错。


      15. search检查: 在有search功能的地方输入系统存在和不存在的内容,看search结果是否正确.如果可以输入多个search条件,可以同时添加合理和不合理的条件,看系统处理是否正确。


      16. 输入信息位置: 注意在光标停留的地方输入信息时,光标和所输入的信息会否跳到别的地方。


      17. 上传下载文件检查:上传下载文件的功能是否实现,上传文件是否能打开。对上传文件的格式有何规定,系统是否有解释信息,并检查系统是否能够做到。


      18. 必填项检查:应该填写的项没有填写时系统是否都做了处理,对必填项是否有提示信息,如在必填项前加*


      19. 快捷键检查:是否支持常用快捷键,如Ctrl+C Ctrl+V Backspace等,对一些不允许输入信息的字段,如选人,选日期对快捷方式是否也做了限制。


      20. 回车键检查: 在输入结束后直接按回车键,看系统处理如何,会否报错。

  • SQL中的联接

    2007-10-04 16:09:37

    建表:
    create table table1(id int,name varchar(10))
    create table table2(id int,score int)
    insert into table1 select 1, 'lee '
    insert into table1 select 2, 'zhang '
    insert into table1 select 4, 'wang '
    insert into table2 select 1,90
    insert into table2 select 2,100
    insert into table2 select 3,70
    如表
    -------------------------------------------------
    table1 ¦table2 ¦
    -------------------------------------------------
    idname ¦idscore ¦
    1lee ¦190 ¦
    2zhang ¦2100 ¦
    4wang ¦370 ¦
    -------------------------------------------------

    一、外连接
    1.概念:包括左向外联接、右向外联接或完整外部联接

    2.左连接:left join 或 left outer join
    (1)左向外联接的结果集包括 LEFT OUTER 子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值(null)。
    (2)sql语句
    select * from table1 left join table2 on table1.id=table2.id
    -------------结果-------------
    id name id score
    ------------------------------
    1 lee 1 90
    2 zhang 2 100
    4 wang NULL NULL
    ------------------------------
    注释:包含table1的所有子句,根据指定条件返回table2相应的字段,不符合的以null显示

    3.右连接:right join 或 right outer join
    (1)右向外联接是左向外联接的反向联接。将返回右表的所有行。如果右表的某行在左表中没有匹配行,则将为左表返回空值。
    (2)sql语句
    select * from table1 right join table2 on table1.id=table2.id
    -------------结果-------------
    id name id score
    ------------------------------
    1 lee 1 90
    2 zhang 2 100
    NULL NULL 3 70
    ------------------------------
    注释:包含table2的所有子句,根据指定条件返回table1相应的字段,不符合的以null显示

    4.完整外部联接:full join 或 full outer join 
    (1)完整外部联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。
    (2)sql语句
    select * from table1 full join table2 on table1.id=table2.id
    -------------结果-------------
    id name id score
    ------------------------------
    1 lee 1 90
    2 zhang 2 100
    4 wang NULL NULL
    NULL NULL 3 70
    ------------------------------
    注释:返回左右连接的和(见上左、右连接)

    二、内连接
    1.概念:内联接是用比较运算符比较要联接列的值的联接

    2.内连接:join 或 inner join 

    3.sql语句
    select * from table1 join table2 on table1.id=table2.id
    -------------结果-------------
    id name id score
    ------------------------------
    1 lee 1 90
    2 zhang 2 100
    ------------------------------
    注释:只返回符合条件的table1和table2的列

    4.等价(与下列执行效果相同)
    A:select a.*,b.* from table1 a,table2 b where a.id=b.id
    B:select * from table1 cross join table2 where table1.id=table2.id  (注:cross join后加条件只能用where,不能用on)

    三、交叉连接(完全)

    1.概念:没有 WHERE 子句的交叉联接将产生联接所涉及的表的笛卡尔积。第一个表的行数乘以第二个表的行数等于笛卡尔积结果集的大小。(table1和table2交叉连接产生3*3=9条记录)

    2.交叉连接:cross join (不带条件where...)

    3.sql语句
    select * from table1 cross join table2
    -------------结果-------------
    id name id score
    ------------------------------
    1 lee 1 90
    2 zhang 1 90
    4 wang 1 90
    1 lee 2 100
    2 zhang 2 100
    4 wang 2 100
    1 lee 3 70
    2 zhang 3 70
    4 wang 3 70
    ------------------------------
    注释:返回3*3=9条记录,即笛卡尔积

    4.等价(与下列执行效果相同)
    A:select * from table1,table2

  • 删除SQL表中的重复记录

    2007-10-04 15:49:54

        数据库表中出现重复记录是我们不愿意看到的,但如果由于种种原因,这种情况确实出现了,我们该如何去解决,删除那些重复的数据呢.而往往一些表的记录量是很大的,并且我们不知道哪些记录重复了,重复了几次.
        下面的这个方法供大家参考.

        /*查询表s中所有记录(不返回重复的),并把这些记录插入临时表#tmp*/
        select distinct * into #tmp from s
        /*如果有必要,可以查询表s中剩下的记录,即重复的*/
        select * from s
        /*删除表s中剩下的记录,即重复的*/
        delete from s
        /*把表#tmp中的记录插入到表s中*/
        insert into s select * from #tmp
        /*删除表tmp*/
        drop table #tmp

        如果真的表中出现重复的记录应该是相当可怕的,所以我们应该避免这样的事情发生,比如设定记录的关键字,标号等.在早期设计数据库的时候就应该考虑这种情况并制定措施加以防范.

  • web测试概述

    2007-10-04 12:28:19

    引用:http://testing.csdn.net/page/dcb60329-c646-4630-9ac6-5dbef1733b56

    在Web工程过程中,基于Web系统的测试、确认和验收是一项重要而富有挑战性的工作。基于Web的系统测试与传统的软件测试不同,它不但需要检查和验证是否按照设计的要求运行,而且还要测试系统在不同用户的浏览器端的显示是否合适。重要的是,还要从最终用户的角度进行安全性和可用性测试。然而,Internet和Web媒体的不可预见性使测试基于Web的系统变得困难。因此,我们必须为测试和评估复杂的基于Web的系统研究新的方法和技术。

      本文将 web 测试分为 6 个部分:

       1. 功能测试

       2. 性能测试(包括负载/压力测试)

       3. 用户界面测试

       4. 兼容性测试

       5. 安全测试

       6. 接口测试

      本文的目的是覆盖 web 测试的各个方面,未就某一主题进行深入说明。

      1 功能测试

      1.1 链接测试

      链接是Web应用系统的一个主要特征,它是在页面之间切换和指导用户去一些不知道地址的页面的主要手段。链接测试可分为三个方面。首先,测试所有链接是否按指示的那样确实链接到了该链接的页面;其次,测试所链接的页面是否存在;最后,保证Web应用系统上没有孤立的页面,所谓孤立页面是指没有链接指向该页面,只有知道正确的URL地址才能访问。

      链接测试可以自动进行,现在已经有许多工具可以采用。链接测试必须在集成测试阶段完成,也就是说,在整个Web应用系统的所有页面开发完成之后进行链接测试。

      采取措施:采用自动检测网站链接的软件来进行。

      推荐软件:

      Xenu Link Sleuth 免费 绿色免安装软件

      HTML Link Validator 共享(30天试用)

      1.2 表单测试

      当用户通过表单提交信息的时候,都希望表单能正常工作。

      如果使用表单来进行在线注册,要确保提交按钮能正常工作,当注册完成后应返回注册成功的消息。如果使用表单收集配送信息,应确保程序能够正确处理这些数据,最后能让顾客能让客户收到包裹。要测试这些程序,需要验证服务器能正确保存这些数据,而且后台运行的程序能正确解释和使用这些信息。

      当用户使用表单进行用户注册、登陆、信息提交等操作时,我们必须测试提交操作的完整性,以校验提交给服务器的信息的正确性。例如:用户填写的出生日期与职业是否恰当,填写的所属省份与所在城市是否匹配等。如果使用了默认值,还要检验默认值的正确性。如果表单只能接受指定的某些值,则也要进行测试。例如:只能接受某些字符,测试时可以跳过这些字符,看系统是否会报错。

      1.3 数据校验

      如果系根据业务规则需要对用户输入进行校验,需要保证这些校验功能正常工作。例如,省份的字段可以用一个有效列表进行校验。在这种情况下,需要验证列表完整而且程序正确调用了该列表(例如在列表中添加一个测试值,确定系统能够接受这个测试值)。

      在测试表单时,该项测试和表单测试可能会有一些重复。

      1.2和1.3的采取措施:第一个完整的版本采用手动检查,同时形成WinRunner(QTP)脚本;回归测试以及升级版本主要靠WinRunner(QTP)自动回放测试。

      1.4 cookies测试

      Cookies通常用来存储用户信息和用户在某应用系统的操作,当一个用户使用Cookies访问了某一个应用系统时,Web服务器将发送关于用户的信息,把该信息以Cookies的形式存储在客户端计算机上,这可用来创建动态和自定义页面或者存储登陆等信息。

      如果Web应用系统使用了Cookies,就必须检查Cookies是否能正常工作。测试的内容可包括Cookies是否起作用,是否按预定的时间进行保存,刷新对Cookies有什么影响等。如果在 cookies 中保存了注册信息,请确认该 cookie能够正常工作而且已对这些信息已经加密。如果使用 cookie 来统计次数,需要验证次数累计正确。

      采取措施:

       1 采用黑盒测试:采用上面提到的方法进行测试

       2 采用查看cookies的软件进行(初步的想法)

      可以选择采用的软件

      IECookiesView v1.50

      Cookies Manager v1.1

      1.5 数据库测试

      在Web应用技术中,数据库起着重要的作用,数据库为Web应用系统的管理、运行、查询和实现用户对数据存储的请求等提供空间。在Web应用中,最常用的数据库类型是关系型数据库,可以使用SQL对信息进行处理。

      在使用了数据库的Web应用系统中,一般情况下,可能发生两种错误,分别是数据一致性错误和输出错误。数据一致性错误主要是由于用户提交的表单信息不正确而造成的,而输出错误主要是由于网络速度或程序设计问题等引起的,针对这两种情况,可分别进行测试。

      采取措施:暂时没有更好的测试方法

      考虑结合到1.2和1.3的测试中

      1.6 应用程序特定的功能需求

      最重要的是,测试人员需要对应用程序特定的功能需求进行验证。尝试用户可能进行的所有操作:下订单、更改订单、取消订单、核对订单状态、在货物发送之前更改送货信息、在线支付等等。这是用户之所以使用网站的原因,一定要确认网站能像广告宣传的那样神奇。

      采取措施:深刻理解需求说明文档

      1.7 设计语言测试

      Web设计语言版本的差异可以引起客户端或服务器端严重的问题,例如使用哪种版本的HTML等。当在分布式环境中开发时,开发人员都不在一起,这个问题就显得尤为重要。除了HTML的版本问题外,不同的脚本语言,例如Java、Javascrīpt、 ActiveX、VBscrīpt或Perl等也要进行验证。

      暂时没有方法测试,可以多参考一点讨论组内的更新信息

      2 性能测试

      2.1 连接速度测试

      用户连接到Web应用系统的速度根据上网方式的变化而变化,他们或许是电话拨号,或是宽带上网。当下载一个程序时,用户可以等较长的时间,但如果仅仅访问一个页面就不会这样。如果Web系统响应时间太长(例如超过5秒钟),用户就会因没有耐心等待而离开。

      另外,有些页面有超时的限制,如果响应速度太慢,用户可能还没来得及浏览内容,就需要重新登陆了。而且,连接速度太慢,还可能引起数据丢失,使用户得不到真实的页面。

      2.2 负载测试

      负载测试是为了测量Web系统在某一负载级别上的性能,以保证Web系统在需求范围内能正常工作。负载级别可以是某个时刻同时访问Web系统的用户数量,也可以是在线数据处理的数量。例如:Web应用系统能允许多少个用户同时在线?如果超过了这个数量,会出现什么现象?Web应用系统能否处理大量用户对同一个页面的请求?

      2.3 压力测试

      负载测试应该安排在Web系统发布以后,在实际的网络环境中进行测试。因为一个企业内部员工,特别是项目组人员总是有限的,而一个Web系统能同时处理的请求数量将远远超出这个限度,所以,只有放在Internet上,接受负载测试,其结果才是正确可信的。

      进行压力测试是指实际破坏一个Web应用系统,测试系统的反映。压力测试是测试系统的限制和故障恢复能力,也就是测试Web应用系统会不会崩溃,在什么情况下会崩溃。黑客常常提供错误的数据负载,直到Web应用系统崩溃,接着当系统重新启动时获得存取权。

      压力测试的区域包括表单、登陆和其他信息传输页面等。

      负载/压力测试应该关注什么

      测试需要验证系统能否在同一时间响应大量的用户,在用户传送大量数据的时候能否响应,系统能否长时间运行。可访问性对用户来说是极其重要的。如果用户得到“系统忙”的信息,他们可能放弃,并转向竞争对手。系统检测不仅要使用户能够正常访问站点,在很多情况下,可能会有黑客试图通过发送大量数据包来攻击服务器。出于安全的原因,测试人员应该知道当系统过载时,需要采取哪些措施,而不是简单地提升系统性能。

      瞬间访问高峰

      如果您的站点用于公布彩票的抽奖结果,最好使系统在中奖号码公布后的一段时间内能够响应上百万的请求。负载测试工具能够模拟 X 个用户同时访问测试站点。

      每个用户传送大量数据

      网上书店的多数用户可能只订购 1-5 书,但是大学书店可能会订购 5000 本有关心理学介绍的课本? 或者一个祖母为她的 50 个儿孙购买圣诞礼物(当然每个孩子都有自己的邮件地址) 系统能处理单个用户的大量数据吗?

      长时间的使用

      如果站点用于处理鲜花订单,那么至少希望它在母亲节前的一周内能持续运行。如果站点提供基于 web 的 email 服务,那么点最好能持续运行几个月,甚至几年。可能需要使用自动测试工具来完成这种类型的测试,因为很难通过手工完成这些测试。你可以想象组织100 个人同时点击某个站点。但是同时组织 100000 个人呢。通常,测试工具在第二次使用的时候,它创造的效益,就足以支付成本。而且,测试工具安装完成之后,再次使用的时候,只要点击几下。

      采取措施:采用测试工具WAS、ACT协助进行测试

      3 用户界面测试

      3.1 导航测试

      导航描述了用户在一个页面内操作的方式,在不同的用户接口控制之间,例如按钮、对话框、列表和窗口等;或在不同的连接页面之间。通过考虑下列问题,可以决定一个Web应用系统是否易于导航:导航是否直观?Web系统的主要部分是否可通过主页存取?Web系统是否需要站点地图、搜索引擎或其他的导航帮助?

      在一个页面上放太多的信息往往起到与预期相反的效果。Web应用系统的用户趋向于目的驱动,很快地扫描一个Web应用系统,看是否有满足自己需要的信息,如果没有,就会很快地离开。很少有用户愿意花时间去熟悉Web应用系统的结构,因此,Web应用系统导航帮助要尽可能地准确。

      导航的另一个重要方面是Web应用系统的页面结构、导航、菜单、连接的风格是否一致。确保用户凭直觉就知道Web应用系统里面是否还有内容,内容在什么地方。

      Web应用系统的层次一旦决定,就要着手测试用户导航功能,让最终用户参与这种测试,效果将更加明显。

      3.2 图形测试

      在Web应用系统中,适当的图片和动画既能起到广告宣传的作用,又能起到美化页面的功能。一个Web应用系统的图形可以包括图片、动画、边框、颜色、字体、背景、按钮等。图形测试的内容有:

      (1)要确保图形有明确的用途,图片或动画不要胡乱地堆在一起,以免浪费传输时间。Web应用系统的图片尺寸要尽量地小,并且要能清楚地说明某件事情,一般都链接到某个具体的页面。

      (2)验证所有页面字体的风格是否一致。

      (3)背景颜色应该与字体颜色和前景颜色相搭配。

      (4)图片的大小和质量也是一个很重要的因素,一般采用JPG或GIF压缩,最好能使图片的大小减小到 30k 以下

      (5)最后,需要验证的是文字回绕是否正确。如果说明文字指向右边的图片,应该确保该图片出现在右边。不要因为使用图片而使窗口和段落排列古怪或者出现孤行。

      通常来说,使用少许或尽量不使用背景是个不错的选择。如果您想用背景,那么最好使用单色的,和导航条一起放在页面的左边。另外,图案和图片可能会转移用户的注意力。

      3.3内容测试

      内容测试用来检验Web应用系统提供信息的正确性、准确性和相关性。

      信息的正确性是指信息是可靠的还是误传的。例如,在商品价格列表中,错误的价格可能引起财政问题甚至导致法律纠纷;信息的准确性是指是否有语法或拼写错误。这种测试通常使用一些文字处理软件来进行,例如使用Microsoft Word的"拼音与语法检查"功能;信息的相关性是指是否在当前页面可以找到与当前浏览信息相关的信息列表或入口,也就是一般Web站点中的所谓"相关文章列表"。

      对于开发人员来说,可能先有功能然后才对这个功能进行描述。大家坐在一起讨论一些新的功能,然后开始开发,在开发的时候,开发人员可能不注重文字表达,他们添加文字可能只是为了对齐页面。不幸的是,这样出来的产品可能产生严重的误解。因此测试人员和公关部门一起检查内容的文字表达是否恰当。否则,公司可能陷入麻烦之中,也可能引起法律方面的问题。测试人员应确保站点看起来更专业些。过分地使用粗体字、大字体和下划线可能会让用户感到不舒服。在进行用户可用性方面的测试时,最好先请图形设计专家对站点进行评估。你可能不希望看到一篇到处是黑体字的文章,所以相信您也希望自己的站点能更专业一些。最后,需要确定是否列出了相关站点的链接。很多站点希望用户将邮件发到一个特定的地址,或者从某个站点下载浏览器。但是如果用户无法点击这些地址,他们可能会觉得很迷惑。

      3.4 表格测试

      需要验证表格是否设置正确。用户是否需要向右滚动页面才能看见产品的价格?把价格放在左边,而把产品细节放在右边是否更有效? 每一栏的宽度是否足够宽,表格里的文字是否都有折行?是否有因为某一格的内容太多,而将整行的内容拉长?

      3.5 整体界面测试

      整体界面是指整个Web应用系统的页面结构设计,是给用户的一个整体感。例如:当用户浏览Web应用系统时是否感到舒适,是否凭直觉就知道要找的信息在什么地方?整个Web应用系统的设计风格是否一致?

      对整体界面的测试过程,其实是一个对最终用户进行调查的过程。一般Web应用系统采取在主页上做一个调查问卷的形式,来得到最终用户的反馈信息。

      对所有的用户界面测试来说,都需要有外部人员(与Web应用系统开发没有联系或联系很少的人员)的参与,最好是最终用户的参与。

      采取措施:手动测试,参与人员最好有外部人员

      4 兼容性测试

      4.1 平台测试

      市场上有很多不同的操作系统类型,最常见的有Windows、Unix、Macintosh、Linux等。Web应用系统的最终用户究竟使用哪一种操作系统,取决于用户系统的配置。这样,就可能会发生兼容性问题,同一个应用可能在某些操作系统下能正常运行,但在另外的操作系统下可能会运行失败。

      因此,在Web系统发布之前,需要在各种操作系统下对Web系统进行兼容性测试。

      4.2 浏览器测试

      浏览器是Web客户端最核心的构件,来自不同厂商的浏览器对Java,、Javascrīpt、 ActiveX、 plug-ins或不同的HTML规格有不同的支持。例如,ActiveX是Microsoft的产品,是为Internet Explorer而设计的,Javascrīpt是Netscape的产品,Java是Sun的产品等等。另外,框架和层次结构风格在不同的浏览器中也有不同的显示,甚至根本不显示。不同的浏览器对安全性和Java的设置也不一样。

      测试浏览器兼容性的一个方法是创建一个兼容性矩阵。在这个矩阵中,测试不同厂商、不同版本的浏览器对某些构件和设置的适应性。

      4.3 分辨率测试

      页面版式在 640x400、600x800 或 1024x768 的分辨率模式下是否显示正常? 字体是否太小以至于无法浏览? 或者是太大? 文本和图片是否对齐?

      4.4 Modem/连接速率

      是否有这种情况,用户使用 28.8 modem下载一个页面需要 10 分钟,但测试人员在测试的时候使用的是 T1 专线? 用户在下载文章或演示的时候,可能会等待比较长的时间,但却不会耐心等待首页的出现。最后,需要确认图片不会太大。

      4.5 打印机

      用户可能会将网页打印下来。因此网也在设计的时候要考虑到打印问题,注意节约纸张和油墨。有不少用户喜欢阅读而不是盯着屏幕,因此需要验证网页打印是否正常。有时在屏幕上显示的图片和文本的对齐方式可能与打印出来的东西不一样。测试人员至少需要验证订单确认页面打印是正常的。

      4.6 组合测试

      最后需要进行组合测试。600x800 的分辨率在 MAC 机上可能不错,但是在 IBM 兼容机上却很难看。在 IBM 机器上使用 Netscape 能正常显示,但却无法使用 Lynx 来浏览。如果是内部使用的 web 站点,测试可能会轻松一些。如果公司指定使用某个类型的浏览器,那么只需在该浏览器上进行测试。如果所有的人都使用 T1 专线,可能不需要测试下载施加。(但需要注意的是,可能会有员工从家里拨号进入系统) 有些内部应用程序,开发部门可能在系统需求中声明不支持某些系统而只支持一些那些已设置的系统。但是,理想的情况是,系统能在所有机器上运行,这样就不会限制将来的发展和变动。

      采取措施:根据实际情况,采取等价划分的方法,列出兼容性矩阵

      5 安全测试

      即使站点不接受信用卡支付,安全问题也是非常重要的。Web 站点收集的用户资料只能在公司内部使用。如果用户信息被黑客泄露,客户在进行交易时,就不会有安全感。

      5.1 目录设置

      Web 安全的第一步就是正确设置目录。每个目录下应该有 index.html 或 main.html 页面,这样就不会显示该目录下的所有内容。我服务的一个公司没有执行这条规则。我选中一幅图片,单击鼠标右键,找到该图片所在的路径"…com/objects/images"。然后在浏览器地址栏中手工输入该路径,发现该站点所有图片的列表。这可能没什么关系。我进入下一级目录 "…com/objects" ,点击 jackpot。在该目录下有很多资料,其中引起我注意的是已过期页面。该公司每个月都要更改产品价格,并且保存过期页面。我翻看了一下这些记录,就可以估计他们的边际利润以及他们为了争取一个合同还有多大的降价空间。如果某个客户在谈判之前查看了这些信息,他们在谈判桌上肯定处于上风。

      5.2 SSL

      很多站点使用 SSL 进行安全传送。你知道你进入一个 SSL 站点是因为浏览器出现了警告消息,而且在地址栏中的 HTTP 变成 HTTPS。如果开发部门使用了SSL,测试人员需要确定是否有相应的替代页面(适用于3.0 以下版本的浏览器,这些浏览器不支持SSL。当用户进入或离开安全站点的时候,请确认有相应的提示信息。是否有连接时间限制?超过限制时间后出现什么情况?

      5.3 登录

      有些站点需要用户进行登录,以验证他们的身份。这样对用户是方便的,他们不需要每次都输入个人资料。你需要验证系统阻止非法的用户名/口令登录,而能够通过有效登录。用户登录是否有次数限制? 是否限制从某些 IP 地址登录? 如果允许登录失败的次数为3,你在第三次登录的时候输入正确的用户名和口令,能通过验证吗? 口令选择有规则限制吗? 是否可以不登陆而直接浏览某个页面?

      Web应用系统是否有超时的限制,也就是说,用户登陆后在一定时间内(例如15分钟)没有点击任何页面,是否需要重新登陆才能正常使用。

      5.4 日志文件

      在后台,要注意验证服务器日志工作正常。日志是否记所有的事务处理? 是否记录失败的注册企图? 是否记录被盗信用卡的使用? 是否在每次事务完成的时候都进行保存? 记录IP 地址吗? 记录用户名吗?

      5.5 脚本语言

      脚本语言是常见的安全隐患。每种语言的细节有所不同。有些脚本允许访问根目录。其他只允许访问邮件服务器,但是经验丰富的黑客可以将服务器用户名和口令发送给他们自己。找出站点使用了哪些脚本语言,并研究该语言的缺陷。还要需要测试没有经过授权,就不能在服务器端放置和编辑脚本的问题。最好的办法是订阅一个讨论站点使用的脚本语言安全性的新闻组。 

      6 接口测试

      在很多情况下,web 站点不是孤立。Web 站点可能会与外部服务器通讯,请求数据、验证数据或提交订单。

      6.1服务器接口

      第一个需要测试的接口是浏览器与服务器的接口。测试人员提交事务,然后查看服务器记录,并验证在浏览器上看到的正好是服务器上发生的。测试人员还可以查询数据库,确认事务数据已正确保存。

      这种测试可以归到功能测试中的表单测试和数据校验测试中

      6.2 外部接口

      有些 web 系统有外部接口。例如,网上商店可能要实时验证信用卡数据以减少欺诈行为的发生。测试的时候,要使用 web 接口发送一些事务数据,分别对有效信用卡、无效信用卡和被盗信用卡进行验证。如果商店只使用 Visa 卡和 Mastercard 卡, 可以尝试使用 Discover 卡的数据。(简单的客户端脚本能够在提交事务之前对代码进行识别,例如 3 表示 American Express,4 表示 Visa,5 表示 Mastercard,6 代表Discover。)通常,测试人员需要确认软件能够处理外部服务器返回的所有可能的消息。

      这种情况在远程抄表中可能会体现到

      6.3 错误处理

      最容易被测试人员忽略的地方是接口错误处理。通常我们试图确认系统能够处理所有错误,但却无法预期系统所有可能的错误。尝试在处理过程中中断事务,看看会发生什么情况?订单是否完成?尝试中断用户到服务器的网络连接。尝试中断 web 服务器到信用卡验证服务器的连接。在这些情况下,系统能否正确处理这些错误?是否已对信用卡进行收费?如果用户自己中断事务处理,在订单已保存而用户没有返回网站确认的时候,需要由客户代表致电用户进行订单确认。

      采取措施:在理解需求的基础上,充分发挥想象力,尽量比较全面的列出各种异常情况。

      7 结论

      无论你在测试 internet、intranet 或者是 extranet 应用程序,web 测试相对于非 web 测试来说都是更具挑战性的工作。用户对 web 页面质量有很高的期望。在很多情况下,就像业务功能一样,页面用于维护和发展公共关系,所以第一印象非常重要。

  • SQL把日期转换为季度来作查询

    2007-10-03 15:36:38

    SQL 里面没有季度函数

    Select Season = Case when month(日期) in (1,2,3) then '一季度'
                         when  month(日期) in (4,5,6) then '二季度'
                         when  month(日期) in (7,8,9) then '三季度'
                         when  month(日期) in (10,11,12) then '四季度' end ,
        count(*)
        from tablename
        group by    Case when month(日期) in (1,2,3) then '一季度'
                         when  month(日期) in (4,5,6) then '二季度'
                         when  month(日期) in (7,8,9) then '三季度'
                         when  month(日期) in (10,11,12) then '四季度' end

    查询结果为 按季度分组后的各季度记录数量

  • SQL通配符

    2007-10-03 15:05:25

    Sql Server中通配符的使用
    引用:http://www.badguy.name/article.asp?id=106

    通配符_

    "_"号表示任意单个字符,该符号只能匹配一个字符."_"可以放在查询条件的任意位置,且只能代表一个字符.一个汉字只使用一个"_"表示.

    通配符%

    "%"符号是字符匹配符,能匹配0个或更多字符的任意长度的字符串.在SQL语句中可以在查询条件的任意位置放置一个%来代表一个任意长度的字符串.在查询条件时也可以放置两个%进行查询,但在查询条件中最好不要连续出现两个%

    通配符[]

    在模式查询中可以利用"[ ]"来实现查询一定范围的数据.[ ]用于指定一定范围内的任何单个字符,包括两端数据

    LIKE '5[%]'      表示    5%
    LIKE '[_]n'      表示    _n
    LIKE '[a-cdf]'   表示    a、b、c、d或f
    LIKE '[-acdf]'   表示    -、a、c、d或f
    LIKE '[ [ ]'       表示    [
    LIKE '[ ] ]'       表示    ]
    LIKE 'abc[_]d%'  表示    abc_d开头的字符串(包括abc_d)
    LIKE 'abc[def]'  表示    abcd、abce或abcf
    通配符[^]

    [^]用来查询不属于指定范围 ([a-f]) 或集合 ([abcdef]) 的任何单个字符。
    如:select * from alluser
    where username like 'M[^abc]%'
    表示从表alluser中查询用户名以M开头,且第二个字符不是a,b,c信息.

    ESCAPE子句的模式匹配

    可搜索包含一个或多个特殊通配符的字符串。例如,customers 数据库中的 discounts 表可能存储含百分号 (%) 的折扣值。若要搜索作为字符而不是通配符的百分号,必须提供 ESCAPE 关键字和转义符。例如,一个样本数据库包含名为 comment 的列,该列含文本 30%。若要搜索在 comment 列中的任何位置包含字符串 30% 的任何行,请指定由 Where comment LIKE '%30!%%' ESCAPE '!' 组成的 Where 子句。如果不指定 ESCAPE 和转义符,SQL Server 将返回所有含字符串 30 的行。

    下例说明如何在 pubs 数据库 titles 表的 notes 列中搜索字符串"50% off when 100 or more copies are purchased":

    Select notes FROM titles
    Where notes LIKE '50%% off when 100 or more copies are purchased'
       ESCAPE '%'

    escape的主要用途

    1.使用 ESCAPE 关键字定义转义符。 在模式中,当转义符置于通配符之前时,该通配符就解释为普通字符。例如,要搜索在任意位置包含字符串 5% 的字符串,请使用: Where ColumnA LIKE '%5/%%' ESCAPE '/'

    2.ESCAPE 'escape_character' 允许在字符串中搜索通配符而不是将其作为通配符使用。 escape_character 是放在通配符前表示此特殊用途的字符。

    Select * FROM finances Where descrīption LIKE 'gs_' ESCAPE 'S'

    意思就是: 比如,我们要搜索一个字符串 "g_" ,如果直接 like "g_",那么 "_"的作用就是通配符,而不是字符,结果,我们会查到比如 "ga","gb","gc",而不是我们需要的 "g_". 用 LIKE 'gs_' ESCAPE 'S' 's'表示特殊用法标志

302/2<12

数据统计

  • 访问量: 21342
  • 日志数: 30
  • 建立时间: 2007-10-02
  • 更新时间: 2007-11-14

RSS订阅

Open Toolbar