没有最好,只有更好!!!!!!

发布新日志

  • 关于自动化测试的随笔

    2010-11-27 01:05:54

    我个人认为,作为一位测试人员掌握自动化,非常必要而且重要,因为测试是无穷尽的,我们必须要把重复性的工作丢给机器帮我们做,这样我们才能够腾出时间做更重要的事情。
    自动化也不要想的很神秘,只要是机器自动的帮我们做了我们需要做的事情就达到了它的目的,小到一个编写的宏命令,大到整个测试框架的测试任务。
    至于自动化为什么做的越来越累,是我们的态度的问题,很多人是为了实现自动化而做自动化,我们要知道自动化仅仅是一个方法,是测试的手段,不是目的。
    很多厉害的牛人,实际上是分析和抽象的能力非常强,能够把复杂的东西简单化,抽象化,而我们现在很多人是把简单的东西复杂化了,所以做到最后掉里面了。
    自动化测试的应用需要结合具体项目来灵活处理的,一个系统有它变化的成分也有不变的成分,所以也很简单,自动化主要集中在比较稳定的系统测试回归上面会达到他最大的价值,如果整个系统每个部分都在重构,显然这个系统不稳定,不适合自动化。
    一 般的web系统,如果你开始就用qtp不假思索的去做自动化,说明你还很稚嫩,你首先应该分析系统相对变化的部分和不变的部分,聪明的测试人员会重点让机 器帮他测试系统的调用和接口,方法等.....  谁都知道页面变化会相对比较频繁,当然要形成自动化测试的规模框架就必不可少了...
    说道干净的测试环境也是相对的了,没有绝对的干净的环境,关键是需要分析不干净的成分对你的影响,具体就看你对所测试系统的了解程度及你的手段了,毕竟现实中资源都是很紧张的.....
  • MySQL用户管理

    2007-05-14 16:17:21

    MySQL用户管理
     

    MySQL管理员应该知道如何设置MySQL用户账号,指出哪个用户可以连接服务器,从哪里连接,连接后能做什么。MySQL 3.22.11开始引入两条语句使得这项工作更容易做:GRANT语句创建MySQL用户并指定其权限,而REVOKE语句删除权限。两条语句扮演了mysql数据库的前端角色,并提供与直接操作这些表的内容不同的另一种方法。CREATE和REVOKE语句影响4个表:授权表
    内容
    user 能连接服务器的用户以及他们拥有的任何全局权限
    db 数据库级权限
    tables_priv 表级权限
    columns_priv 列级权限

    还有第5个授权表(host),但它不受GRANT和REVOKE的影响。
    当你对一个用户发出一条GRANT语句时,在user表中为该用户创建一条记录。如果语句指定任何全局权限(管理权限或适用于所有数据库的权限),这些也记录在user表中。如果你指定数据库、表和列级权限,他们被分别记录在db、tables_priv和columns_priv表中。
    用GRANT和REVOKE比直接修改授权表更容易些,然而,建议你阅读一下《MySQL安全性指南》。这些表异常重要,而且作为一名管理员,你应该理解它们如何超越GRANT和REVOKE语句的功能水平。
    在下面的章节中,我们将介绍如何设置MySQL用户账号并授权。我们也涉及如何撤权和从授权表中删除用户。
    你可能也想考虑使用mysqlaccess和mysql_setpermission脚本,它是MySQL分发的一部分,它们是Perl脚本,提供GRANT语句的另一种选择设置用户账号。mysql_setpermission需要安装DBI支持。
    1 创建用户并授权

    GRANT语句的语法看上去像这样:
    GRANT privileges (columns) ON what TO user IDENTIFIED BY "password" WITH GRANT OPTION 

    要使用该语句,你需要填写下列部分:
    privileges

    授予用户的权限,下表列出可用于GRANT语句的权限指定符:
    权限指定符
    权限允许的操作
    ALTER 修改表和索引
    CREATE 创建数据库和表
    DELETE 删除表中已有的记录
    DROP 抛弃(删除)数据库和表
    INDEX 创建或抛弃索引
    INSERT 向表中插入新行
    REFERENCE 未用
    SELECT 检索表中的记录
    UPDATE 修改现存表记录
    FILE 读或写服务器上的文件
    PROCESS 查看服务器中执行的线程信息或杀死线程
    RELOAD 重载授权表或清空日志、主机缓存或表缓存。
    SHUTDOWN 关闭服务器
    ALL 所有;ALL PRIVILEGES同义词
    USAGE 特殊的“无权限”权限

    上表显示在第一组的权限指定符适用于数据库、表和列,第二组数管理权限。一般,这些被相对严格地授权,因为它们允许用户影响服务器的操作。第三组权限特殊,ALL意味着“所有权限”,UASGE意味着无权限,即创建用户,但不授予权限。
    columns

    权限运用的列,它是可选的,并且你只能设置列特定的权限。如果命令有多于一个列,应该用逗号分开它们。
    what

    权限运用的级别。权限可以是全局的(适用于所有数据库和所有表)、特定数据库(适用于一个数据库中的所有表)或特定表的。可以通过指定一个columns字句是权限是列特定的。
    user

    权限授予的用户,它由一个用户名和主机名组成。在MySQL中,你不仅指定谁能连接,还有从哪里连接。这允许你让两个同名用户从不同地方连接。MySQL让你区分他们,并彼此独立地赋予权限。
    MySQL中的一个用户名就是你连接服务器时指定的用户名,该名字不必与你的Unix登录名或Windows名联系起来。缺省地,如果你不明确指定一个名字,客户程序将使用你的登录名作为MySQL用户名。这只是一个约定。你可以在授权表中将该名字改为nobody,然后以nobody连接执行需要超级用户权限的操作。
    password

    赋予用户的口令,它是可选的。如果你对新用户没有指定IDENTIFIED BY子句,该用户不赋给口令(不安全)。对现有用户,任何你指定的口令将代替老口令。如果你不指定口令,老口令保持不变,当你用IDENTIFIED BY时,口令字符串用改用口令的字面含义,GRANT将为你编码口令,不要象你用SET PASSWORD 那样使用password()函数。
    WITH GRANT OPTION子句是可选的。如果你包含它,用户可以授予权限通过GRANT语句授权给其它用户。你可以用该子句给与其它用户授权的能力。
    用户名、口令、数据库和表名在授权表记录中是大小写敏感的,主机名和列名不是。
    一般地,你可以通过询问几个简单的问题来识别GRANT语句的种类:
    谁能连接,从那儿连接?
    用户应该有什么级别的权限,他们适用于什么?
    用户应该允许管理权限吗?

    下面就讨论一些例子。
    1.1 谁能连接,从那儿连接?

    你可以允许一个用户从特定的或一系列主机连接。有一个极端,如果你知道降职从一个主机连接,你可以将权限局限于单个主机:
    GRANT ALL ON samp_db.* TO boris@localhost IDENTIFIED BY "ruby"GRANT ALL ON samp_db.* TO fred@res.mars.com IDENTIFIED BY "quartz"

    (samp_db.*意思是“samp_db数据库的所有表)另一个极端是,你可能有一个经常旅行并需要能从世界各地的主机连接的用户max。在这种情况下,你可以允许他无论从哪里连接:
    GRANT ALL ON samp_db.* TO max@% IDENTIFIED BY "diamond"

    “%”字符起通配符作用,与LIKE模式匹配的含义相同。在上述语句中,它意味着“任何主机”。所以max和max@%等价。这是建立用户最简单的方法,但也是最不安全的。
    取其中,你可以允许一个用户从一个受限的主机集合访问。例如,要允许mary从snake.net域的任何主机连接,用一个%.snake.net主机指定符:
    GRANT ALL ON samp_db.* TO mary@.snake.net IDENTIFIED BY "quartz";

    如果你喜欢,用户标识符的主机部分可以用IP地址而不是一个主机名来给定。你可以指定一个IP地址或一个包含模式字符的地址,而且,从MySQL 3.23,你还可以指定具有指出用于网络号的位数的网络掩码的IP号:
    GRANT ALL ON samp_db.* TO boris@192.168.128.3 IDENTIFIED BY "ruby" GRANT ALL ON samp_db.* TO fred@192.168.128.% IDENTIFIED BY "quartz" GRANT ALL ON samp_db.* TO rex@192.168.128.0/17 IDENTIFIED BY "ruby"

    第一个例子指出用户能从其连接的特定主机,第二个指定对于C类子网192.168.128的IP模式,而第三条语句中,192.168.128.0/17指定一个17位网络号并匹配具有192.168.128头17位的IP地址。 
    如果MySQL抱怨你指定的用户值,你可能需要使用引号(只将用户名和主机名部分分开加引号)。
    GRANT ALL ON samp_db.president TO "my friend"@"boa.snake.net"
    1.2 用户应该有什么级别的权限和它们应该适用于什么?

    你可以授权不同级别的权限,全局权限是最强大的,因为它们适用于任何数据库。要使ethel成为可做任何事情的超级用户,包括能授权给其它用户,发出下列语句:
    GRANT ALL ON *.* TO ethel@localhost IDENTIFIED BY "coffee" WITH GRANT OPTION

    ON子句中的*.*意味着“所有数据库、所有表”。从安全考虑,我们指定ethel只能从本地连接。限制一个超级用户可以连接的主机通常是明智的,因为它限制了试图破解口令的主机。
    有些权限(FILE、PROCESS、RELOAD和SHUTDOWN)是管理权限并且只能用"ON *.*"全局权限指定符授权。如果你愿意,你可以授权这些权限,而不授权数据库权限。例如,下列语句设置一个flush用户,他只能发出flush语句。这可能在你需要执行诸如清空日志等的管理脚本中会有用:
    GRANT RELOAD ON *.* TO flushl@localhost IDENTIFIED BY "flushpass"

    一般地,你想授权管理权限,吝啬点,因为拥有它们的用户可以影响你的服务器的操作。
    数据库级权限适用于一个特定数据库中的所有表,它们可通过使用ON db_name.*子句授予:
    GRANT ALL ON samp_db TO bill@racer.snake.net INDETIFIED BY "rock" GRANT SELECT ON samp_db TO ro_user@% INDETIFIED BY "rock"

    第一条语句向bill授权samp_db数据库中所有表的权限,第二条创建一个严格限制访问的用户ro_user(只读用户),只能访问samp_db数据库中的所有表,但只有读取,即用户只能发出SELECT语句。
    你可以列出一系列同时授予的各个权限。例如,如果你想让用户能读取并能修改现有数据库的内容,但不能创建新表或删除表,如下授予这些权限:
    GRANT SELECT,INSERT,DELETE,UPDATE ON samp_db TO bill@snake.net INDETIFIED BY "rock"

    对于更精致的访问控制,你可以在各个表上授权,或甚至在表的每个列上。当你想向用户隐藏一个表的部分时,或你想让一个用户只能修改特定的列时,列特定权限非常有用。如:
    GRANT SELECT ON samp_db.member TO bill@localhost INDETIFIED BY "rock"GRANT UPDATE (expiration) ON samp_db. member TO bill@localhost

    第一条语句授予对整个member表的读权限并设置了一个口令,第二条语句增加了UPDATE权限,当只对expiration列。没必要再指定口令,因为第一条语句已经指定了。
    如果你想对多个列授予权限,指定一个用逗号分开的列表。例如,对assistant用户增加member表的地址字段的UPDATE权限,使用如下语句,新权限将加到用户已有的权限中:
    GRANT UPDATE (street,city,state,zip) ON samp_db TO assistant@localhost
    通常,你不想授予任何比用户确实需要的权限宽的权限。然而,当你想让用户能创建一个临时表以保存中间结果,但你又不想让他们在一个包含他们不应修改内容的数据库中这样做时,发生了要授予在一个数据库上的相对宽松的权限。你可以通过建立一个分开的数据库(如tmp)并授予开数据库上的所有权限来进行。例如,如果你想让来自mars.net域中主机的任何用户使用tmp数据库,你可以发出这样的GRANT语句:
    GRANT ALL ON tmp.* TO ""@mars.net
    在你做完之后,用户可以创建并用tmp.tbl_name形式引用tmp中的表(在用户指定符中的""创建一个匿名用户,任何用户均匹配空白用户名)。
    1.3 用户应该被允许管理权限吗?

    你可以允许一个数据库的拥有者通过授予数据库上的所有拥有者权限来控制数据库的访问,在授权时,指定WITH GRANT OPTION。例如:如果你想让alicia能从big.corp.com域的任何主机连接并具有sales数据库中所有表的管理员权限,你可以用如下GRANT语句:
    GRANT ALL ON sales.* TO alicia@%.big.corp.com INDETIFIED BY "applejuice" WITH GRANT OPTION
    在效果上WITH GRANT OPTION子句允许你把访问授权的权利授予另一个用户。要注意,拥有GRANT权限的两个用户可以彼此授权。如果你只给予了第一个用户SELECT权限,而另一个用户有GRANT加上SELECT权限,那么第二个用户可以是第一个用户更“强大”。
    2 撤权并删除用户

    要取消一个用户的权限,使用REVOKE语句。REVOKE的语法非常类似于GRANT语句,除了TO用FROM取代并且没有INDETIFED BY和WITH GRANT OPTION子句:
    REVOKE privileges (columns) ON what FROM user
    user部分必须匹配原来GRANT语句的你想撤权的用户的user部分。privileges部分不需匹配,你可以用GRANT语句授权,然后用REVOKE语句只撤销部分权限。
    REVOKE语句只删除权限,而不删除用户。即使你撤销了所有权限,在user表中的用户记录依然保留,这意味着用户仍然可以连接服务器。要完全删除一个用户,你必须用一条DELETE语句明确从user表中删除用户记录:
    %mysql -u root mysqlmysql>DELETE FROM user ->WHERE User="user_name" and Host="host_name";mysql>FLUSH PRIVILEGES; 

    DELETE语句删除用户记录,而FLUSH语句告诉服务器重载授权表。(当你使用GRANT和REVOKE语句时,表自动重载,而你直接修改授权表时不是。)

  • 用来跟踪你的测试步骤的方法

    2007-03-23 15:40:34

    你能用来跟踪你的测试步骤的方法有测试脚本、测试记录、敲键记录器如Spector和屏幕视频捕捉工具如Hypercam
  • 表单中对行的操作

    2007-03-23 15:34:55

    select *from qy_baseinfo
    select  qyid,qyname from qy_baseinfo
                                              /*显示 表中的2 个列*/  
                                             

     

    select qyid,qyid+' name is:'+qyname as pp from qy_baseinfo

                                              /*比较经典的对表的灵活处理*/

    select username,pwd from QY_UserInfo
    union
    select username,password from Qzz_UserInfo
                                             /*联合2个表的 公用2列 一起显示 出来*/


    select *from menu

    insert into menu values (6,'哈哈哈哈','eeeee/default.asp')
                                              /*对表里的‘行’进行的插入的操作*/

     

    select *from menu
    update menu set url='健康' where menuid='6'

                                               /*对表里的‘行’进行的修改的操作*/
    select *from menu
    delete from menu where menuid='6'

                                                /*对表里的‘行’进行的删除的操作*/

  • 软件测试与软件质量

    2007-03-23 15:02:36

    软件测试与软件质量

                                    作者: happysea   发布时间: 2007-3-21

    【摘要】:质量这个概念首先源于工业生产中,在工厂里所生产出来的产品,由于生产条件的限制和其他一些因素的影响,使不同的工厂所生产的产品满足消费者的程度不同,也就说产品有好坏之分,对于消费者来说,当然喜欢物美价廉的产品。所以在工业时代,为了追求更多的利润,自己的产品更有市场,所以企业在成本一定的条件下,去努力生产出更能博得消费者青睐的产品,质量由此而生。在众多生产企业中,生产出高质量的产品成了企业占有市场和获得高利润所不可缺少的因素,逐渐的也产生了品牌的概念,好的品牌意味着具有好的质量,不断提高产品质量成了企业获得高利润的手段。为了保证产品的质量,企业里边设立了品质保证team,根据产品的不同,有的企业除了具有品质保证team,而且还设立了测试team,来保证产品的质量。现在软件已成为当今世界的支柱产业,和工业生产一样,软件的质量也被软件企业所越来越重视,软件测试这一IT行业中新兴职业便诞生了,在软件质量的提高中起到得了非常重要的作用。

    【关键字】:质量  软件质量  软件测试   企业利润   开发成本

         质量在我们的现实生活中,并不陌生,在ISO中是这样定义的:质量就是实体基于所有特性满足需求的程度。在工业生产中,产品测试在保证产品的质量中起到了非常重要的作用,测试部门和生产部门就像企业的左膀右臂,在企业的发展中,不可缺少。如今我们处在信息时代,软件已成为当今世界的支柱产业,迅速发展起来的软件产业也逐渐暴露出了好多的质量问题,特别是60年代中期,随着软件复杂度的增加,爆发了众所周知的软件危机,1994—1995年间,美国的迪士尼的狮子王动画片,风靡全球,受到了全世界的小朋友,乃至大人的欢迎,年底的圣诞节,迪士尼公司接着又推出了新的产品儿童多媒体光盘游戏:Lion king animated storybook,然而结果令他们大失所望,面对的不是像狮子王动画片那样的成功而是众多客户要求的赔偿,究其原因,就是因为这款游戏在发布之前,没有在大众使用的pc机型进行正确的测试,致使客户不能在自己机器上使用,导致迪士尼遭受了很大损失。类似的例子还有很多,软件的质量逐渐受到了软件企业的关注和重视,在软件产业发达的国家,软件测试在整个软件开发的系统工程中占据相当的比重。例如,为打造Windows2000,微软用了250多个项目经理,1700多个开发人员,以及3200个测试人员,开发和测试人员之比约为三比五,这是一个比较合理的比例。而我国的软件产业在这方面状况堪忧,企业往往只注重开发,而忽视软件测试,很多企业都没有软件测试部门,甚至不设软件测试的岗位;而且业界存在轻视软件测试工作错误观念,企业中软件测试人员的地位和待遇往往不如软件开发人员……

    到底软件测试在软件的生命周期中只是收尾辅助工作,还是应该被重视?可能有些软件企业老板会认为,只要软件开发出来,测一测功能,只要功能ok,就可以发布了,而且这些测试工作开发人员就顺便做了,没有必要组建专门的测试团队,来增加公司的额外成本,使公司的利润降低。听起来好像没有什么错误,实际上只要在软件的生命周期内合理的安排其在各个阶段的测试工作,大大地可以降低软件的开发成本,不但不会减少公司的利润,还可以增加,使企业快速进入一个持续发展的轨道。

    到现在为止,还没有那个软件企业敢保证自己开发的软件没有任何缺陷,更不敢不经过测试就直接发布,而且当软件中存在的缺陷发现的越早,它由于修复所花费的成本就越低,发现的越晚,修复所要花费的成本就越大,如果比较严重的缺陷在软件发布前还没有被发现并修复,后果是严重的,可能会导致项目倒闭,给公司造成重大的损失。在成本一定的条件下,高质量的软件才会占据市场,给软件企业带来更多的利润。提高并保证软件的质量,是企业发展的根本,软件企业必须非常重视自己开发的软件质量,应该最大限度的保证自己的软件在发布后没有比较严重的缺陷,要做到这点就必须对软件做测试,在公司中像重视软件质量一样来重视软件测试。

    软件测试并不是软件生命周期中的收尾工作,由开发人员顺便做做而已的事情,而是软件测试工作已经参透到了软件生命周期的每一个阶段,从刚开始的需求分析到最后的软件发布前,都有软件测试的活动,每一个阶段的测试都有详细周密的计划和测试执行,来最大限度的保证软件的缺陷早发现早修复,降低开发成本。

    现在的软件企业要想做大,做强,具有非常强的竞争力,不但要有优秀的开发团队,更要有非常优秀的测试团队,重视测试团队的建设,来保证软件的质量,这样在软件行业的激烈竞争中才能立于不败之地。

     

     


  • sql 中对表的操作

    2007-03-19 22:00:03

    create table orderA
    (dingdanid int not null,
     riqi      datetime not null,
     kehuid    int not null
    )
                                             /*建立了一个表orderA 包括列名:dingdanid,riqi,kehuid */


    alter table orderA
    add dingdanmingchen varchar(20) null,dinggousuliang int null

                                              /*修改表 使用的是 alter 语句,add 为添加列*/

    alter table orderA
    alter column dingdanmingchen varchar(50)

                                              /*修改表 使用的是 alter 语句,alter column 为
                                                修改 列的数据类型 */ 
                                             
    alter table orderA
    alter column dinggousuliang numeric


                                              /*和上个例子类似,修改了列dingdanid的数据类型*/
    alter table orderA
    drop column dingdanid,dinggousuliang


                                              /*删除列 dingdanid,dinggousuliang*/
    alter table orderA
    add constraint xinid primary key (riqi)

                                               /*定义主键为riqi,它的主键约束名为xinid,
                                                语法为:add constraint ...primary key..*/


    /*  以上为表单的建立,对表单内列的 添加,删除,对列的数据类型的修改的一些语法 举例,和 对表单
    内主键的定义 的语法*/

  • no title

    2007-02-27 21:03:54

    今天去递 离职了 哦

         比较巧,进入现在公司的日期是8月15日,离开是3月8日. 哈哈 都是节日 啊,真巧.........

  • 在公司的最后几天

    2007-02-09 21:18:18

          忙乎了好长时间,终于车票弄到了,该请的假也都请到了,总算松了口气。哎,这个是烦啊,要不是好心的人转让车票给我,也不知道什么时候可以弄到,真的很幸运啊,明年一定要记住提前2个月定票,不然有和今年一样狼狈。

        今天公司举行了本年度的春节派对,虽然节目不多,还算热闹。看着有个老外在那搞笑的说了几句中文,还能勉强听懂的,猛然间感觉到公司突然亲切了许多,一想到过完春节回来就要递上我的离职报告,离开这个努力了一年多的公司,心里好像有点舍不得。公司一下子变得可爱了许多,许多......

        其实从内心我觉得,我的公司是一个很不错的公司,不管从人文关怀和工作方式方面。在公司的一年多时间里,我也学到了不少的知识,特别是在做事方式方面。在我的第一家公司,我学到的具体的做事情,掌握了做事情的基本方法,一些专业的基本技能。在现在的公司,也就是我的第二家公司,让我形成了我的做事风格,培养了我工作的主动性。也许是美资企业传承了美国人那种管理方式吧,工作有时候觉得确实蛮累的,一个人当几个人用似的,其实渐渐的就能感觉到自己的协调能力,管理能力方面在提高。说到这些我要对我现在的公司说声谢谢....

        也许我如果是上海人,不用考虑自己要买房子,(因为好多上海的同事都有房子的)我可能会需要一个稳定的职业,会继续留在公司。而现实我不是,我也不能去怪谁,只能通过自己去奋斗。离开公司,从新跨入这个软件测试行业,对我是个挑战,也做了好久的思想斗争。因为从这几年的经历我体会到ems行业,他的技术是很有限的,对于这个行业中我们这些做测试的,还算技术含量比较高的,也没有太多的技术要你去钻研的,往后职位的提升,也只能向管理方面发展了。考虑自己的实际情况,还是觉得做技术比较好,而且对软件比较感兴趣,所以依然投入到了这个充满挑战的软件测试行业,不用再想太多,不管道路多么崎岖,艰难,努吧............

    感谢我的公司,感谢周围的同事,朋友,愿我们都能找到自己的合适位置,事业成功!!!!!!!!

  • SQL查询语句精华使用简要

    2007-02-06 19:53:02

    SQL查询语句精华使用简要

    2007-1-31

    一、 简单查询
      简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的表或视图、以及搜索条件等。
      例如,下面的语句查询testtable表中姓名为"张三"的nickname字段和email字段。

       SELECT nickname,email
      FROM testtable
      WHERE name='张三'

      (一) 选择列表

      选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变量和全局变量)等构成。

      1、选择所有列

      例如,下面语句显示testtable表中所有列的数据:

       SELECT *
      FROM testtable

      2、选择部分列并指定它们的显示次序

      查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。
      例如:

       SELECT nickname,email
      FROM testtable

      3、更改列标题

      在选择列表中,可重新指定列标题。定义格式为:
      列标题=列名
      列名 列标题
      如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列标题:

       SELECT 昵称=nickname,电子邮件=email
      FROM testtable

      4、删除重复行

      SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。

      5、限制返回的行数

      使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是表示一百分数,指定返回的行数等于总行数的百分之几。
      例如:

       SELECT TOP 2 *
      FROM testtable
      SELECT TOP 20 PERCENT *
      FROM testtable

      (二)FROM子句

      FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图,它们之间用逗号分隔。
      在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应使用下面语句格式加以限定:

        SELECT username,citytable.cityid
      FROM usertable,citytable
      WHERE usertable.cityid=citytable.cityid

      在FROM子句中可用以下两种格式为表或视图指定别名:
      表名 as 别名
      表名 别名

      (二) FROM子句

      FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图,它们之间用逗号分隔。
      在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应使用下面语句格式加以限定:

       SELECT username,citytable.cityid
      FROM usertable,citytable
      WHERE usertable.cityid=citytable.cityid

      在FROM子句中可用以下两种格式为表或视图指定别名:
      表名 as 别名
      表名 别名
      例如上面语句可用表的别名格式表示为:

       SELECT username,b.cityid
      FROM usertable a,citytable b
      WHERE a.cityid=b.cityid

      SELECT不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。

      例如:

        SELECT a.au_fname+a.au_lname
      FROM authors a,titleauthor ta
      (SELECT title_id,title
      FROM titles
      WHERE ytd_sales>10000
      ) AS t
      WHERE a.au_id=ta.au_id
      AND ta.title_id=t.title_id

      此例中,将SELECT返回的结果集合给予一别名t,然后再从中检索数据。

    (三) 使用WHERE子句设置查询条件

      WHERE子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据:

       SELECT *
      FROM usertable
      WHERE age>20

      WHERE子句可包括各种条件运算符:
      比较运算符(大小比较):>、>=、=、<、<=、<>、!>、!<
      范围运算符(表达式值是否在指定的范围):BETWEEN...AND...
      NOT BETWEEN...AND...
      列表运算符(判断表达式是否为列表中的指定项):IN (项1,项2......)
      NOT IN (项1,项2......)
      模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE
      空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL
      逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR

      1、范围运算符例:age BETWEEN 10 AND 30相当于age>=10 AND age<=30
      2、列表运算符例:country IN ('Germany','China')
      3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、varchar、text、ntext、datetime和smalldatetime等类型查询。
      可使用以下通配字符:
      百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。
      下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。
      方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。[^]:其取值也[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。
      例如:
      限制以Publishing结尾,使用LIKE '%Publishing'
      限制以A开头:LIKE '[A]%'
      限制以A开头外:LIKE '[^A]%'

      4、空值判断符例WHERE age IS NULL

      5、逻辑运算符:优先级为NOT、AND、OR

      (四)查询结果排序

      使用ORDER BY子句对查询返回的结果按一列或多列排序。ORDER BY子句的语法格式为:
      ORDER BY {column_name [ASC|DESC]} [,...n]
      其中ASC表示升序,为默认值,DESC为降序。ORDER BY不能按ntext、text和image数据类型进行排
      序。
      例如:

        SELECT *
      FROM usertable
      ORDER BY age desc,userid ASC

      另外,可以根据表达式进行排序。

      二、 联合查询

      UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,即执行联合查询。UNION的语法格式为:

        select_statement
      UNION [ALL] selectstatement
      [UNION [ALL] selectstatement][...n]

      其中selectstatement为待联合的SELECT查询语句。

      ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一行。

      联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。

      在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类型,系统将低精度的数据类型转换为高精度的数据类型。

      在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如:

      查询1 UNION (查询2 UNION 查询3)

      三、连接查询

      通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型数据库管理系统的一个标志。

      在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行查询。

      连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出连接时有助于将连接操作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。

      SQL-92标准所定义的FROM子句的连接语法格式为:

       FROM join_table join_type join_table
      [ON (join_condition)]

      其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一个表操作的连接又称做自连接。

      join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接(INNER JOIN)使用比较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN)和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的数据行。

      交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。

      连接操作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑运算符等构成。

      无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接连接。例如:

       SELECT p1.pub_id,p2.pub_id,p1.pr_info
      FROM pub_info AS p1 INNER JOIN pub_info AS p2
      ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info)

      (一)内连接
      内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分三种:
      1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接表中的所有列,包括其中的重复列。
      2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些运算符包括>、>=、<=、<、!>、!<和<>。
      3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询结果集合中所包括的列,并删除连接表中的重复列。
      例,下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社:

       SELECT *
      FROM authors AS a INNER JOIN publishers AS p
      ON a.city=p.city
      又如使用自然连接,在选择列表中删除authors 和publishers 表中重复列(city和state):
      SELECT a.*,p.pub_id,p.pub_name,p.country
      FROM authors AS a INNER JOIN publishers AS p
      ON a.city=p.city

      (二)外连接
      内连接时,返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和连接条件的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。如下面使用左外连接将论坛内容和作者信息连接起来:

       SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b
      ON a.username=b.username

      下面使用全外连接将city表中的所有作者以及user表中的所有作者,以及他们所在的城市:

        SELECT a.*,b.*
      FROM city as a FULL OUTER JOIN user as b
      ON a.username=b.username

      (三)交叉连接
      交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等于6*8=48行。
       SELECT type,pub_name
      FROM titles CROSS JOIN publishers
      ORDER BY type

    转载于  rose个人空间  谢谢!!!!!!!!!!!!

  • 头大了

    2007-02-05 22:04:30

      今天老爸又打电话过来 催我结婚啊

    心理真的很矛盾啊 到底男人什么时候应该结婚啊, 现在工作刚转,起步阶段,他们这个时候跟着添乱,心理想猫抓一样,当然也不能怪他们阿。毕竟他们是为了我好啊!!!!

       这个年要过好,确实要费点脑筋了 阿

  • 难忘的周末

    2007-02-05 00:35:37

       看看现在的时间 已经凌晨了 阿 ,比较晚了 需要马上睡觉,因为明天还要上班啊 ,不过 这个周末我觉得比较难忘,由于时间关系 不能说太多了 。但是 必须说出了一下 。害怕忘记。

    昨天 我的测试培训入学考试通过了 ,我很欣慰,大概一个多月的复习没有白费 。既然选择了这条路,就要为此奋斗到底,我现在已经是破釜沉舟了 ,已经没有了回头路。所要做的也就是 迎着风雨冲吧..........

      尽管考试通过了,也暴露出来了一些问题,毕竟是转行做软件测试,而且是从硬件转过来的,专业知识还是很欠缺的,很荣幸得到了老师的指点,也确实应该补补课啊,进一步的学习c语言的编写/调试,数据结构,数据库,操作系统。在开学前的这段时间,这些基础知识要比较扎实。这些也就是我在开学前所要搞定的第一件事情,要牢记,自己现在从新开始,一定要比其他的同行付出更多,现在的我是0起跑线阿............

    2007 年,我觉得是一个吉祥的年,希望我在这一年里,事业取得比较大的进步,努力啊 !!!!!!!!!!!

  • 有感而发

    2007-01-27 22:31:27

         今天是从我刚开始建立这个个人空间以来,第二次来登录我的这个小天地,再次浏览发现我的这个空间有6个访问量,我有点激动哦,真的很意外。

        当然在意外的同时,我感觉又有了一点小小的压力哦。因为,这个空间不仅我可以看到,而且其他的同仁,大哥,大姐,师傅,师兄也可以看到阿,如果哪里写的不好,就让大家笑话了哦,更重要的一点,浪费了大家的宝贵时间,我会很抱歉的。所以以后我会更加认真仔细的对待它。我想现在也仅仅是我的一些感言吧,还不是很专业,我会努力把它建成不仅对我自己有用,而且对大家都有用的,比较专业的个人空间。我会努力....

       所以希望各位大哥,大姐,师兄路过,给小弟一些意见。我会非常的感激。

       最后再次感谢在本小弟的“白杨轩”留下足迹的朋友!!!!!!!

     

  • 空间新开通 高兴哦

    2007-01-25 19:18:43

       哈哈,首先哈哈两下来表示我的现在的高兴。

    大概在今年吧,开始流行个人博客,好像那个什么徐静蕾的火的不行啊,每次上网有时喜欢看一些文字的东西,渐渐的觉得,这个博客真好噢,可以没有束缚的尽情地表达自己,没有任何的顾虑,如实道来,可能是因为网络这个平台吧,给我们提供了一个这样的机会。也不知道什么时候,觉得 如果有属于自己的博客就好了。真好,有种双喜临门的感觉哦,一喜,便是我即将迈入软件测试行业,对我来说有划时代的意见,转行进入这个充满着挑战,刺激,上进的行业。二喜,哈哈,当然是我现在已经拥有了属于自己的个人博客哦 !!

      在这里 我确实要感谢51testing 。
    不过现在还不能高兴得太早哦,因为我可是一穷二白阿,从硬件转行到软件测试,意味着从头开始啊。艰苦的挑战在等着我,首先我要通过就业培训的入学考试阿,这几天看书,头都有点大了阿,看见同寝室的同事聊天,看电影,真是羡慕 阿,不过自己还是要把握好自己,因为重任在肩,还是要老老实实的看书,考试过关才是第一关阿,不管怎么样,一定要努力啊,所以每天在网的时间不会很长,等等就要下了 ,看书阿

    我会成功的,我相信自己,我会努力,努力,再努力的。。。。。。。。。

Open Toolbar