发布新日志

  • 测试用例设计思想

    funly 发布于 2007-05-22 23:29:42

    1、数据分析。所有的系统最基本的单元就是数据,所以对于功能点的测试最基本的也是数据的测试。常常用到等价类划分及边界值分析这两种测试方法。

    2、流程分析。每个系统操作都是由不同的流程组成。要做到对流程操作清楚必须由精通业务知识开始。然后才开始设计流程测试用例。常用的测试方法应该是因果图(但我个人比较怕用这个测试方法,所以还是以自我总结的流程为主)。

    3、用户习惯操作分析。这是针对系统的的易用性来进行分析的。

    4、组合分析。个人最不喜欢的就是组合测试,但有查询功能就一定要进行组合测试。常用的测试方法是白盒测试的思想。最好可以问问清楚开发人员他是如何开发出查询功能的。这样可以让你清楚定位测试方法。

    以上的分析都要包括其非的操作,也就是消极测试用例。有以上思想编写出来的测试用例,我认为就是好的测试用例。但是这些用例的对于需求的覆盖率达到多少,我还没有度量的数据。

  • SQL语法详解

    Erica 发布于 2007-03-13 10:06:01

    一些基本的SQL命令有一段时间不用了,就会有些忘记了,周六的时候找了一些,今天贴出来共享。(忘记了是从那个网站找到的了:))

    **********

    SQL语法详解

    Select用途:
    从指定表中取出指定的列的数据

    语法:


    SELECT column_name(s) FROM table_name


    解释:

    从数据库中选取资料列,并允许从一或多个资料表中,选取一或多个资料列或资料行。SELECT 陈述式的完整语法相当复杂,但主要子句可摘要为:

    SELECT select_list
    [ INTO new_table ]
    FROM table_source
    [ WHERE search_condition ]
    [ GROUP BY group_by_expression ]
    [ HAVING search_condition ]
    [ ORDER BY order_expression [ ASC | DESC ] ]

    例:

    “Persons” 表中的数据有

    LastName
    FirstName
    Address
    City

    Hansen
    Ola
    Timoteivn 10
    Sandnes

    Svendson
    Tove
    Borgvn 23
    Sandnes

    Pettersen
    Kari
    Storgt 20
    Stavanger


    选出字段名” LastName”、” FirstName” 的数据

    SELECT LastName,FirstName FROM Persons


    返回结果:

    LastName
    FirstName

    Hansen
    Ola

    Svendson
    Tove

    Pettersen
    Kari


    选出所有字段的数据

    SELECT * FROM Persons


    返回结果:


    LastName
    FirstName
    Address
    City

    Hansen
    Ola
    Timoteivn 10
    Sandnes

    Svendson
    Tove
    Borgvn 23
    Sandnes

    Pettersen
    Kari
    Storgt 20
    Stavanger


    Where
    用途:

    被用来规定一种选择查询的标准

    语法:

    SELECT column FROM table WHERE column condition value


    下面的操作符能被使用在WHERE中:

    =,<>,>,<,>=,<=,BETWEEN,LIKE

    注意: 在某些SQL的版本中不等号< >能被写作为!=

    解释:

    SELECT语句返回WHERE子句中条件为true的数据

    例:

    从” Persons”表中选出生活在” Sandnes” 的人

    SELECT * FROM Persons WHERE City='Sandnes'


    Persons 表中的数据有:

    LastName
    FirstName
    Address
    City
    Year

    Hansen
    Ola
    Timoteivn 10
    Sandnes
    1951

    Svendson
    Tove
    Borgvn 23
    Sandnes
    1978

    Svendson
    Stale
    Kaivn 18
    Sandnes
    1980

    Pettersen
    Kari
    Storgt 20
    Stavanger
    1960


    返回结果:

    LastName
    FirstName
    Address
    City
    Year

    Hansen
    Ola
    Timoteivn 10
    Sandnes
    1951

    Svendson
    Tove
    Borgvn 23
    Sandnes
    1978

    Svendson
    Stale
    Kaivn 18
    Sandnes
    1980


    And & Or
    用途:

    在WHERE子句中AND和OR被用来连接两个或者更多的条件

    解释:

    AND在结合两个布尔表达式时,只有在两个表达式都为 TRUE 时才传回 TRUE

    OR在结合两个布尔表达式时,只要其中一个条件为 TRUE 时,OR便传回 TRUE

    例:

    Persons 表中的原始数据:
    LastName
    FirstName
    Address
    City

    Hansen
    Ola
    Timoteivn 10
    Sandnes

    Svendson
    Tove
    Borgvn 23
    Sandnes

    Svendson
    Stephen
    Kaivn 18
    Sandnes


    用AND运算子来查找Persons 表中FirstName为”Tove”而且LastName为” Svendson”的数据

    SELECT * FROM Persons
    WHERE FirstName='Tove'
    AND LastName='Svendson'


    返回结果:

    LastName
    FirstName
    Address
    City

    Svendson
    Tove
    Borgvn 23
    Sandnes


    用OR运算子来查找Persons 表中FirstName为”Tove”或者LastName为” Svendson”的数据

    SELECT * FROM Persons
    WHERE firstname='Tove'
    OR lastname='Svendson'


    返回结果:

    LastName
    FirstName
    Address
    City

    Svendson
    Tove
    Borgvn 23
    Sandnes

    Svendson
    Stephen
    Kaivn 18
    Sandnes


    你也能结合AND和OR (使用括号形成复杂的表达式),如:

    SELECT * FROM Persons WHERE
    (FirstName='Tove' OR FirstName='Stephen')
    AND LastName='Svendson'


    返回结果:

    LastName
    FirstName
    Address
    City

    Svendson
    Tove
    Borgvn 23
    Sandnes

    Svendson
    Stephen
    Kaivn 18
    Sandnes


    Between…And
    用途:

    指定需返回数据的范围

    语法:

    SELECT column_name FROM table_name
    WHERE column_name
    BETWEEN &#118;alue1 AND &#118;alue2


    例:

    “Persons”表中的原始数据

    LastName
    FirstName
    Address
    City

    Hansen
    Ola
    Timoteivn 10
    Sandnes

    Nordmann
    Anna
    Neset 18
    Sandnes

    Pettersen
    Kari
    Storgt 20
    Stavanger

    Svendson
    Tove
    Borgvn 23
    Sandnes


    用BETWEEN…AND返回LastName为从”Hansen”到”Pettersen”的数据:

    SELECT * FROM Persons WHERE LastName
    BETWEEN 'Hansen' AND 'Pettersen'


    返回结果:

    LastName
    FirstName
    Address
    City

    Hansen
    Ola
    Timoteivn 10
    Sandnes

    Nordmann
    Anna
    Neset 18
    Sandnes

    Pettersen
    Kari
    Storgt 20
    Stavanger


    为了显示指定范围之外的数据,也可以用NOT操作符:

    SELECT * FROM Persons WHERE LastName
    NOT BETWEEN 'Hansen' AND 'Pettersen'


    返回结果:

    LastName
    FirstName
    Address
    City

    Svendson
    Tove
    Borgvn 23
    Sandnes


    Distinct
    用途:

    DISTINCT关键字被用作返回唯一的值

    语法:

    SELECT DISTINCT column-name(s) FROM table-name


    解释:

    当column-name(s)中存在重复的值时,返回结果仅留下一个

    例:

    “Orders”表中的原始数据

    Company
    OrderNumber

    Sega
    3412

    W3Schools
    2312

    Trio
    4678

    W3Schools
    6798


    用DISTINCT关键字返回Company字段中唯一的值:

    SELECT DISTINCT Company FROM Orders


    返回结果:

    Company

    Sega

    W3Schools

    Trio


    Order by
    用途:

    指定结果集的排序

    语法:

    SELECT column-name(s) FROM table-name ORDER BY { order_by_expression [ ASC | DESC ] }


    解释:

    指定结果集的排序,可以按照ASC(递增方式排序,从最低值到最高值)或者DESC(递减方式排序,从最高值到最低值)的方式进行排序,默认的方式是ASC

    例:

    “Orders”表中的原始数据:

    Company
    OrderNumber

    Sega
    3412

    ABC Shop
    5678

    W3Schools
    2312

    W3Schools
    6798


    按照Company字段的升序方式返回结果集:

    SELECT Company, OrderNumber FROM Orders
    ORDER BY Company


    返回结果:

    Company
    OrderNumber

    ABC Shop
    5678

    Sega
    3412

    W3Schools
    6798

    W3Schools
    2312


    按照Company字段的降序方式返回结果集:

    SELECT Company, OrderNumber FROM Orders
    ORDER BY Company DESC


    返回结果:

    Company
    OrderNumber

    W3Schools
    6798

    W3Schools
    2312

    Sega
    3412

    ABC Shop
    5678


    Group by
    用途:

    对结果集进行分组,常与汇总函数一起使用。

    语法:

    SELECT column,SUM(column) FROM table GROUP BY column


    例:

    “Sales”表中的原始数据:

    Company
    Amount

    W3Schools
    5500

    IBM
    4500

    W3Schools
    7100


    按照Company字段进行分组,求出每个Company的Amout的合计:

    SELECT Company,SUM(Amount) FROM Sales
    GROUP BY Company


    返回结果:

    Company
    SUM(Amount)

    W3Schools
    12600

    IBM
    4500


    Having
    用途:

    指定群组或汇总的搜寻条件。

    语法:

    SELECT column,SUM(column) FROM table
    GROUP BY column
    HAVING SUM(column) condition &#118;alue


    解释:

    HAVING 通常与 GROUP BY 子句同时使用。不使用 GROUP BY 时,HAVING 则与 WHERE 子句功能相似。

    例:

    “Sales”表中的原始数据:

    Company
    Amount

    W3Schools
    5500

    IBM
    4500

    W3Schools
    7100


    按照Company字段进行分组,求出每个Company的Amout的合计在10000以上的数据:

    SELECT Company,SUM(Amount) FROM Sales
    GROUP BY Company HAVING SUM(Amount)>10000


    返回结果:

    Company
    SUM(Amount)

    W3Schools
    12600


    Join
    用途:

    当你要从两个或者以上的表中选取结果集时,你就会用到JOIN。

    例:

    “Employees”表中的数据如下,(其中ID为主键):

    ID
    Name

    01
    Hansen, Ola

    02
    Svendson, Tove

    03
    Svendson, Stephen

    04
    Pettersen, Kari


    “Orders”表中的数据如下:

    ID
    Product

    01
    Printer

    03
    Table

    03
    Chair


    用Employees的ID和Orders的ID相关联选取数据:

    SELECT Employees.Name, Orders.Product
    FROM Employees, Orders
    WHERE Employees.ID = Orders.ID


    返回结果:

    Name
    Product

    Hansen, Ola
    Printer

    Svendson, Stephen
    Table

    Svendson, Stephen
    Chair


    或者你也可以用JOIN关键字来完成上面的操作:

    SELECT Employees.Name, Orders.Product
    FROM Employees
    INNER JOIN Orders
    ON Employees.ID = Orders.ID


    INNER JOIN的语法:

    SELECT field1, field2, field3
    FROM first_table
    INNER JOIN second_table
    ON first_table.keyfield = second_table.foreign_keyfield


    解释:

    INNER JOIN返回的结果集是两个表中所有相匹配的数据。


    LEFT JOIN的语法:

    SELECT field1, field2, field3
    FROM first_table
    LEFT JOIN second_table
    ON first_table.keyfield = second_table.foreign_keyfield


    用”Employees”表去左外联结”Orders”表去找出相关数据:

    SELECT Employees.Name, Orders.Product
    FROM Employees
    LEFT JOIN Orders
    ON Employees.ID = Orders.ID


    返回结果:

    Name
    Product

    Hansen, Ola
    Printer

    Svendson, Tove


    Svendson, Stephen
    Table

    Svendson, Stephen
    Chair

    Pettersen, Kari


    解释:

    LEFT JOIN返回”first_table”中所有的行尽管在” second_table”中没有相匹配的数据。


    RIGHT JOIN的语法:

    SELECT field1, field2, field3
    FROM first_table
    RIGHT JOIN second_table
    ON first_table.keyfield = second_table.foreign_keyfield


    用”Employees”表去右外联结”Orders”表去找出相关数据:

    SELECT Employees.Name, Orders.Product
    FROM Employees
    RIGHT JOIN Orders
    ON Employees.ID = Orders.ID


    返回结果:

    Name
    Product

    Hansen, Ola
    Printer

    Svendson, Stephen
    Table

    Svendson, Stephen
    Chair


    解释:

    RIGHT JOIN返回” second_table”中所有的行尽管在”first_table”中没有相匹配的数据。


    Alias
    用途:

    可用在表、结果集或者列上,为它们取一个逻辑名称

    语法:

    给列取别名:

    SELECT column AS column_alias FROM table


    给表取别名:

    SELECT column FROM table AS table_alias


    例:

    “Persons”表中的原始数据:

    LastName
    FirstName
    Address
    City

    Hansen
    Ola
    Timoteivn 10
    Sandnes

    Svendson
    Tove
    Borgvn 23
    Sandnes

    Pettersen
    Kari
    Storgt 20
    Stavanger


    运行下面的SQL:

    SELECT LastName AS Family, FirstName AS Name
    FROM Persons


    返回结果:

    Family
    Name

    Hansen
    Ola

    Svendson
    Tove

    Pettersen
    Kari


    运行下面的SQL:

    SELECT LastName, FirstName
    FROM Persons AS Employees


    返回结果:

    Employees中的数据有:

    LastName
    FirstName

    Hansen
    Ola

    Svendson
    Tove

    Pettersen
    Kari


    Insert Into
    用途:

    在表中插入新行

    语法:

    插入一行数据

    INSERT INTO table_name
    &#118;alueS (&#118;alue1, &#118;alue2,....)


    插入一行数据在指定的字段上

    INSERT INTO table_name (column1, column2,...)
    &#118;alueS (&#118;alue1, &#118;alue2,....)


    例:

    “Persons”表中的原始数据:

    LastName
    FirstName
    Address
    City

    Pettersen
    Kari
    Storgt 20
    Stavanger


    运行下面的SQL插入一行数据:

    INSERT INTO Persons
    &#118;alueS ('Hetland', 'Camilla', 'Hagabakka 24', 'Sandnes')


    插入后”Persons”表中的数据为:

    LastName
    FirstName
    Address
    City

    Pettersen
    Kari
    Storgt 20
    Stavanger

    Hetland
    Camilla
    Hagabakka 24
    Sandnes


    运行下面的SQL插入一行数据在指定的字段上:

    INSERT INTO Persons (LastName, Address)
    &#118;alueS ('Rasmussen', 'Storgt 67')


    插入后”Persons”表中的数据为:

    LastName
    FirstName
    Address
    City

    Pettersen
    Kari
    Storgt 20
    Stavanger

    Hetland
    Camilla
    Hagabakka 24
    Sandnes

    Rasmussen

    Storgt 67


    Update
    用途:

    更新表中原有数据

    语法:

    UPDATE table_name SET column_name = new_&#118;alue
    WHERE column_name = some_&#118;alue


    例:

    “Person”表中的原始数据:

    LastName
    FirstName
    Address
    City

    Nilsen
    Fred
    Kirkegt 56
    Stavanger

    Rasmussen

    Storgt 67


    运行下面的SQL将Person表中LastName字段为”Rasmussen”的FirstName更新为”Nina”:

    UPDATE Person SET FirstName = 'Nina'
    WHERE LastName = 'Rasmussen'


    更新后”Person”表中的数据为:

    LastName
    FirstName
    Address
    City

    Nilsen
    Fred
    Kirkegt 56
    Stavanger

    Rasmussen
    Nina
    Storgt 67


    同样的,用UPDATE语句也可以同时更新多个字段:

    UPDATE Person
    SET Address = 'Stien 12', City = 'Stavanger'
    WHERE LastName = 'Rasmussen'


    更新后”Person”表中的数据为:

    LastName
    FirstName
    Address
    City

    Nilsen
    Fred
    Kirkegt 56
    Stavanger

    Rasmussen
    Nina
    Stien 12
    Stavanger


    Delete
    用途:

    删除表中的数据

    语法:

    DELETE FROM table_name WHERE column_name = some_&#118;alue


    例:

    “Person”表中的原始数据:

    LastName
    FirstName
    Address
    City

    Nilsen
    Fred
    Kirkegt 56
    Stavanger

    Rasmussen
    Nina
    Stien 12
    Stavanger


    删除Person表中LastName为”Rasmussen”的数据:

    DELETE FROM Person WHERE LastName = 'Rasmussen'


    执行删除语句后”Person”表中的数据为:

    LastName
    FirstName
    Address
    City

    Nilsen
    Fred
    Kirkegt 56
    Stavanger


    Create Table
    用途:

    建立新的资料表。

    语法:

    CREATE TABLE table_name
    (
    column_name1 data_type,
    column_name2 data_type,
    .......
    )


    例:

    创建一张叫“Person”的表,该表有4个字段LastName, FirstName, Address, Age:

    CREATE TABLE Person
    (
    LastName varchar,
    FirstName varchar,
    Address varchar,
    Age int
    )


    如果想指定字段的最大存储长度,你可以这样:

    CREATE TABLE Person
    (
    LastName varchar(30),
    FirstName varchar(30),
    Address varchar(120),
    Age int(3)
    )


    下表中列出了在SQL的一些数据类型:

    Data Type
    Descrīption

    integer(size)
    int(size)
    smallint(size)
    tinyint(size)
    Hold integers only. The maximum number of digits are specified in parenthesis.

    decimal(size,d)
    numeric(size,d)
    Hold numbers with fractions. The maximum number of digits are specified in size. The maximum number of digits to the right of the decimal is specified in d.

    char(size)
    Holds a fixed length string (can contain letters, numbers, and special characters). The fixed size is specified in parenthesis.

    varchar(size)
    Holds a variable length string (can contain letters, numbers, and special characters). The maximum size is specified in parenthesis.

    date(yyyymmdd)
    Holds a date


    Alter Table
    用途:

    在已经存在的表中增加后者移除字段

    语法:

    ALTER TABLE table_name
    ADD column_name datatype
    ALTER TABLE table_name
    DROP COLUMN column_name


    注意:某些数据库管理系统不允许移除表中的字段


    例:

    “Person”表中的原始数据:

    LastName
    FirstName
    Address

    Pettersen
    Kari
    Storgt 20


    在Person表中增加一个名为City的字段:

    ALTER TABLE Person ADD City varchar(30)


    增加后表中数据如下:

    LastName
    FirstName
    Address
    City

    Pettersen
    Kari
    Storgt 20


    移除Person表中原有的Address字段:

    ALTER TABLE Person DROP COLUMN Address


    移除后表中数据如下:

    LastName
    FirstName
    City

    Pettersen
    Kari


    Drop Table
    用途:

    在数据库中移除一个数据表定义及该数据表中的所有资料、索引、触发程序、条件约束及权限指定。

    语法:

    DROP TABLE table_name


    Create Database
    用途:

    建立新的数据库.

    语法:

    CREATE DATABASE database_name


    Drop Database
    用途:

    移除原有的数据库

    语法:

    DROP DATABASE database_name


    聚集函数
    count
    用途:

    传回选取的结果集中行的数目。

    语法:

    SELECT COUNT(column_name) FROM table_name


    例:

    “Persons”表中原始数据如下:

    Name
    Age

    Hansen, Ola
    34

    Svendson, Tove
    45

    Pettersen, Kari
    19


    选取记录总数:

    SELECT COUNT(Name) FROM Persons


    执行结果:

    3


    sum
    用途:

    以表达式传回所有值的总和,或仅 DISTINCT 值。SUM 仅可用于数值资料行。已忽略 Null 值。

    语法:

    SELECT SUM(column_name) FROM table_name


    例:

    “Persons”表中原始数据如下:

    Name
    Age

    Hansen, Ola
    34

    Svendson, Tove
    45

    Pettersen, Kari
    19


    选取”Persons”表中所有人的年龄总和:

    SELECT SUM(Age) FROM Persons


    执行结果:

    98


    选取”Persons”表中年龄超过20岁的人的年龄总和:

    SELECT SUM(Age) FROM Persons WHERE Age>20


    执行结果:

    79


    avg
    用途:

    传回选取的结果集中值的平均值。已忽略 Null 值。

    语法:

    SELECT AVG(column_name) FROM table_name


    例:

    “Persons”表中原始数据如下:

    Name
    Age

    Hansen, Ola
    34

    Svendson, Tove
    45

    Pettersen, Kari
    19


    选取”Persons”表中所有人的平均年龄:

    SELECT AVG(Age) FROM Persons


    执行结果:

    32.67


    选取”Persons”表中年龄超过20岁的人的平均年龄:

    SELECT AVG(Age) FROM Persons WHERE Age>20


    执行结果:

    39.5


    max
    用途:

    传回选取的结果集中值的最大值。已忽略 Null 值。

    语法:

    SELECT MAX(column_name) FROM table_name


    例:

    “Persons”表中原始数据如下:

    Name
    Age

    Hansen, Ola
    34

    Svendson, Tove
    45

    Pettersen, Kari
    19


    选取”Persons”表中的最大年龄:

    SELECT MAX(Age) FROM Persons


    执行结果:

    45


    min
    用途:

    传回选取的结果集中值的最小值。已忽略 Null 值。

    语法:

    SELECT MIN(column_name) FROM table_name


    例:

    “Persons”表中原始数据如下:

    Name
    Age

    Hansen, Ola
    34

    Svendson, Tove
    45

    Pettersen, Kari
    19


    选取”Persons”表中的最小年龄:

    SELECT MIN(Age) FROM Persons


    执行结果:

    19


    算术函数
    abs
    用途:

    传回指定数值表达式 (Numeric Expression) 的绝对正值。

    语法:

    ABS(numeric_expression)


    例:

    ABS(-1.0) ABS(0.0) ABS(1.0)


    执行结果:

    1.0 0.0 1.0


    ceil
    用途:

    传回大于等于给定数值表达式的最小整数。

    语法:

    CEIL(numeric_expression)


    例:

    CEIL(123.45) CEIL(-123.45)


    执行结果:

    124.00 -123.00


    floor
    用途:

    传回小于或等于给定数值表达式的最大整数。

    语法:

    FLOOR(numeric_expression)


    例:

    FLOOR(123.45) FLOOR(-123.45)


    执行结果:

    123.00 -124.00


    cos
    用途:

    在指定表达式中传回指定角度 (以弪度为单位) 的三角余弦值的数学函数。

    语法:

    COS(numeric_expression)


    例:

    COS(14.7


    执行结果:

    -0.599465


    cosh
    用途:

    传回以弧度为单位的角度值,其余弦为指定的 float 表达式,也称为反余弦。

    语法:

    COSH(numeric_expression)


    例:

    COSH(-1)


    执行结果:

    3.14159


    sin
    用途:

    以近似的数值 (float) 表达式传回给定角度 (以弧度) 之三角正弦函数 (Trigonometric Sine)。

    语法:

    SIN(numeric_expression)


    例:

    SIN(45.175643)


    执行结果:

    0.929607


    sinh
    用途:

    传回以弪度为单位的角度,其正弦为指定的 float 表达式 (也称为反正弦)。

    语法:

    SINH(numeric_expression)


    例:

    SINH(-1.00)


    执行结果:

    -1.5708


    tan
    用途:

    传回输入表达式的正切函数。

    语法:

    TAN(numeric_expression)


    例:

    TAN(3.14159265358979/2)


    执行结果:

    1.6331778728383844E+16


    tanh
    用途:

    传回以弪度为单位的角度,其正切为指定的 float 表达式 (也称为反正切)。

    语法:

    TANH(numeric_expression)


    例:

    TANH(-45.01)


    执行结果:

    -1.54858


    exp
    用途:

    传回给定的 float 表达式的指数 (Exponential) 值。

    语法:

    EXP(numeric_expression)


    例:

    EXP(378.615345498)


    执行结果:

    2.69498e+164


    log
    用途:

    传回给定的 float 表达式之自然对数。

    语法:

    LOG(numeric_expression)


    例:

    LOG(5.175643)


    执行结果:

    1.64396


    power
    用途:

    传回给定表达式指定乘幂的值。

    语法:

    POWER(numeric_expression,v)


    例:

    POWER(2,6)


    执行结果:

    64


    sign
    用途:

    传回给定的表达式之正 (+1)、零 (0) 或负 (-1) 号。

    语法:

    SIGN(numeric_expression)


    例:

    SIGN(123) SIGN(0) SIGN(-456)


    执行结果:

    1 0 -1


    sqrt
    用途:

    传回给定表达式的平方。

    语法:

    SQRT(numeric_expression)


    例:

    SQRT(10)


    执行结果:

    100
  • 精妙SQL语句收集(转)

    swanlin128 发布于 2007-08-21 10:40:05

    最近需要用到SQL
    所以从网上找到篇很精妙的介绍。
    原文转至CSDN http://blog.csdn.net/chen8148/archive/2007/08/14/1741991.aspx

    精妙 SQL 语句收集

    SQL语句先前写的时候,很容易把一些特殊的用法忘记,我特此整理了一下SQL语句操作。
    一、基础
    1、说明:创建数据库
    CREATE DATABASE database-name
    2、说明:删除数据库
    drop database dbname
    3、说明:备份sql server
    --- 创建 备份数据的 device
    USE master
    EXEC sp_addumpdevice 'disk', 'testBack', 'c:\mssql7backup\MyNwind_1.dat'
    --- 开始 备份
    BACKUP DATABASE pubs TO testBack
    4、说明:创建新表
    create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..)
    根据已有的表创建新表:
    A:create table tab_new like tab_old (使用旧表创建新表)
    B:create table tab_new as select col1,col2... from tab_old definition only
    5、说明:删除新表
    drop table tabname
    6、说明:增加一个列
    Alter table tabname add column col type
    注:列增加后将不能删除。DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。
    7、说明:添加主键: Alter table tabname add primary key(col)
    说明:删除主键: Alter table tabname drop primary key(col)
    8、说明:创建索引:create [unique] index idxname on tabname(col....)
    删除索引:drop index idxname
    注:索引是不可更改的,想更改必须删除重新建。
    9、说明:创建视图:create view viewname as select statement
    删除视图:drop view viewname
    10、说明:几个简单的基本的sql语句
    选择:select * from table1 where 范围
    插入:insert into table1(field1,field2) values(value1,value2)
    删除:delete from table1 where 范围
    更新:update table1 set field1=value1 where 范围
    查找:select * from table1 where field1 like '%value1%' ---like的语法很精妙,查资料!
    排序:select * from table1 order by field1,field2 [desc]
    总数:select count as totalcount from table1
    求和:select sum(field1) as sumvalue from table1
    平均:select avg(field1) as avgvalue from table1
    最大:select max(field1) as maxvalue from table1
    最小:select min(field1) as minvalue from table1
    11、说明:几个高级查询运算词
    A: UNION 运算符
    UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表。当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行。两种情况下,派生表的每一行不是来自 TABLE1 就是来自 TABLE2。
    B: EXCEPT 运算符
    EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表。当 ALL 随 EXCEPT 一起使用时 (EXCEPT ALL),不消除重复行。
    C: INTERSECT 运算符
    INTERSECT 运算符通过只包括 TABLE1 和 TABLE2 中都有的行并消除所有重复行而派生出一个结果表。当 ALL 随 INTERSECT 一起使用时 (INTERSECT ALL),不消除重复行。
    注:使用运算词的几个查询结果行必须是一致的。
    12、说明:使用外连接
    A、left outer join:
    左外连接(左连接):结果集几包括连接表的匹配行,也包括左连接表的所有行。
    SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c
    B:right outer join:
    右外连接(右连接):结果集既包括连接表的匹配连接行,也包括右连接表的所有行。
    C:full outer join:
    全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录。
    二、提升
    1、说明:复制表(只复制结构,源表名:a 新表名:b) (Access可用)
    法一:select * into b from a where 1<>1
    法二:select top 0 * into b from a
    2、说明:拷贝表(拷贝数据,源表名:a 目标表名:b) (Access可用)
    insert into b(a, b, c) select d,e,f from b;
    3、说明:跨数据库之间表的拷贝(具体数据使用绝对路径) (Access可用)
    insert into b(a, b, c) select d,e,f from b in '具体数据库' where 条件
    例子:..from b in '"&Server.MapPath(".")&"\data.mdb" &"' where..
    4、说明:子查询(表名1:a 表名2:b)
    select a,b,c from a where a IN (select d from b ) 或者: select a,b,c from a where a IN (1,2,3)
    5、说明:显示文章、提交人和最后回复时间
    select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b
    6、说明:外连接查询(表名1:a 表名2:b)
    select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c
    7、说明:在线视图查询(表名1:a )
    select * from (SELECT a,b,c FROM a) T where t.a > 1;
    8、说明:between的用法,between限制查询数据范围时包括了边界值,not between不包括
    select * from table1 where time between time1 and time2
    select a,b,c, from table1 where a not between 数值1 and 数值2
    9、说明:in 的使用方法
    select * from table1 where a [not] in ('值1','值2','值4','值6')
    10、说明:两张关联表,删除主表中已经在副表中没有的信息
    delete from table1 where not exists ( select * from table2 where table1.field1=table2.field1 )
    11、说明:四表联查问题:
    select * from a left inner join b on a.a=b.b right inner join c on a.a=c.c inner join d on a.a=d.d where .....
    12、说明:日程安排提前五分钟提醒
    SQL: select * from 日程安排 where datediff('minute',f开始时间,getdate())>5
    13、说明:一条sql 语句搞定数据库分页
    select top 10 b.* from (select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b where b.主键字段 = a.主键字段 order by a.排序字段
    14、说明:前10条记录
    select top 10 * form table1 where 范围
    15、说明:选择在每一组b值相同的数据中对应的a最大的记录的所有信息(类似这样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排名,等等.)
    select a,b,c from tablename ta where a=(select max(a) from tablename tb where tb.b=ta.b)
    16、说明:包括所有在 TableA 中但不在 TableB和TableC 中的行并消除所有重复行而派生出一个结果表
    (select a from tableA ) except (select a from tableB) except (select a from tableC)
    17、说明:随机取出10条数据
    select top 10 * from tablename order by newid()
    18、说明:随机选择记录
    select newid()
    19、说明:删除重复记录
    Delete from tablename where id not in (select max(id) from tablename group by col1,col2,...)
    20、说明:列出数据库里所有的表名
    select name from sysobjects where type='U'
    21、说明:列出表里的所有的
    select name from syscolumns where id=object_id('TableName')
    22、说明:列示type、vender、pcs字段,以type字段排列,case可以方便地实现多重选择,类似select 中的case。
    select type,sum(case vender when 'A' then pcs else 0 end),sum(case vender when 'C' then pcs else 0 end),sum(case vender when 'B' then pcs else 0 end) FROM tablename group by type
    显示结果:
    type vender pcs
    电脑 A 1
    电脑 A 1
    光盘 B 2
    光盘 A 2
    手机 B 3
    手机 C 3
    23、说明:初始化表table1
    TRUNCATE TABLE table1
    24、说明:选择从10到15的记录
    select top 5 * from (select top 15 * from table order by id asc) table_别名 order by id desc
    三、技巧
    1、1=1,1=2的使用,在SQL语句组合时用的较多
    "where 1=1" 是表示选择全部   "where 1=2"全部不选,
    如:
    if @strWhere !=''
    begin
    set @strSQL = 'select count(*) as Total from [' + @tblName + '] where ' + @strWhere
    end
    else
    begin
    set @strSQL = 'select count(*) as Total from [' + @tblName + ']'
    end
    我们可以直接写成
    set @strSQL = 'select count(*) as Total from [' + @tblName + '] where 1=1 安定 '+ @strWhere
    2、收缩数据库
    --重建索引
    DBCC REINDEX
    DBCC INDEXDEFRAG
    --收缩数据和日志
    DBCC SHRINKDB
    DBCC SHRINKFILE
    3、压缩数据库
    dbcc shrinkdatabase(dbname)
    4、转移数据库给新用户以已存在用户权限
    exec sp_change_users_login 'update_one','newname','oldname'
    go
    5、检查备份集
    RESTORE VERIFYONLY from disk='E:\dvbbs.bak'
    6、修复数据库
    ALTER DATABASE [dvbbs] SET SINGLE_USER
    GO
    DBCC CHECKDB('dvbbs',repair_allow_data_loss) WITH TABLOCK
    GO
    ALTER DATABASE [dvbbs] SET MULTI_USER
    GO
    7、日志清除
    SET NOCOUNT ON
    DECLARE @LogicalFileName sysname,
            @MaxMinutes INT,
            @NewSize INT

    USE     tablename             -- 要操作的数据库名
    SELECT  @LogicalFileName = 'tablename_log',  -- 日志文件名
    @MaxMinutes = 10,               -- Limit on time allowed to wrap log.
            @NewSize = 1                  -- 你想设定的日志文件的大小(M)
    -- Setup / initialize
    DECLARE @OriginalSize int
    SELECT @OriginalSize = size
      FROM sysfiles
      WHERE name = @LogicalFileName
    SELECT 'Original Size of ' + db_name() + ' LOG is ' +
            CONVERT(VARCHAR(30),@OriginalSize) + ' 8K pages or ' +
            CONVERT(VARCHAR(30),(@OriginalSize*8/1024)) + 'MB'
      FROM sysfiles
      WHERE name = @LogicalFileName
    CREATE TABLE DummyTrans
      (DummyColumn char (8000) not null)

    DECLARE @Counter   INT,
            @StartTime DATETIME,
            @TruncLog  VARCHAR(255)
    SELECT  @StartTime = GETDATE(),
            @TruncLog = 'BACKUP LOG ' + db_name() + ' WITH TRUNCATE_ONLY'
    DBCC SHRINKFILE (@LogicalFileName, @NewSize)
    EXEC (@TruncLog)
    -- Wrap the log if necessary.
    WHILE     @MaxMinutes > DATEDIFF (mi, @StartTime, GETDATE()) -- time has not expired
          AND @OriginalSize = (SELECT size FROM sysfiles WHERE name = @LogicalFileName) 
          AND (@OriginalSize * 8 /1024) > @NewSize 
      BEGIN -- Outer loop.
        SELECT @Counter = 0
        WHILE  ((@Counter < @OriginalSize / 16) AND (@Counter < 50000))
          BEGIN -- update
            INSERT DummyTrans VALUES ('Fill Log') 
            DELETE DummyTrans
            SELECT @Counter = @Counter + 1
          END  
        EXEC (@TruncLog) 
      END  
    SELECT 'Final Size of ' + db_name() + ' LOG is ' +
            CONVERT(VARCHAR(30),size) + ' 8K pages or ' +
            CONVERT(VARCHAR(30),(size*8/1024)) + 'MB'
      FROM sysfiles
      WHERE name = @LogicalFileName
    DROP TABLE DummyTrans
    SET NOCOUNT OFF
    8、说明:更改某个表
    exec sp_changeobjectowner 'tablename','dbo'
    9、存储更改全部表
    CREATE PROCEDURE dbo.User_ChangeObjectOwnerBatch
     @OldOwner as NVARCHAR(128),
     @NewOwner as NVARCHAR(128)
    AS
    DECLARE @Name   as NVARCHAR(128)
    DECLARE @Owner  as NVARCHAR(128)
    DECLARE @OwnerName  as NVARCHAR(128)
    DECLARE curObject CURSOR FOR
     select 'Name'   = name,
      'Owner'   = user_name(uid)
     from sysobjects
     where user_name(uid)=@OldOwner
     order by name
    OPEN  curObject
    FETCH NEXT FROM curObject INTO @Name, @Owner
    WHILE(@@FETCH_STATUS=0)
    BEGIN    
     if @Owner=@OldOwner
     begin
      set @OwnerName = @OldOwner + '.' + rtrim(@Name)
      exec sp_changeobjectowner @OwnerName, @NewOwner
     end
    -- select @name,@NewOwner,@OldOwner
     FETCH NEXT FROM curObject INTO @Name, @Owner
    END
    close curObject
    deallocate curObject
    GO

    10、SQL SERVER中直接循环写入数据
    declare @i int
    set @i=1
    while @i<30
    begin
       insert into test (userid) values(@i)
       set @i=@i+1
    end
    小记存储过程中经常用到的本周,本月,本年函数
    Dateadd(wk,datediff(wk,0,getdate()),-1)
    Dateadd(wk,datediff(wk,0,getdate()),6)
    Dateadd(mm,datediff(mm,0,getdate()),0)
    Dateadd(ms,-3,dateadd(mm,datediff(m,0,getdate())+1,0))
    Dateadd(yy,datediff(yy,0,getdate()),0)
    Dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate())+1, 0))
    上面的SQL代码只是一个时间段
    Dateadd(wk,datediff(wk,0,getdate()),-1)
    Dateadd(wk,datediff(wk,0,getdate()),6)
    就是表示本周时间段.
    下面的SQL的条件部分,就是查询时间段在本周范围内的:
    Where Time BETWEEN Dateadd(wk,datediff(wk,0,getdate()),-1) AND Dateadd(wk,datediff(wk,0,getdate()),6)
    而在存储过程中
    select @begintime = Dateadd(wk,datediff(wk,0,getdate()),-1)
    select @endtime = Dateadd(wk,datediff(wk,0,getdate()),6)


  • SQL核心语句使用技巧

    hades 发布于 2006-12-05 11:11:23

    1. 插入数据
      
      向表中添加一个新记录,你要使用SQL INSERT语句。这里有一个如何使用这种语句的例子:
      
      der="1" cellspacing="0" cellpadding="2" bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"> INSERT mytable(mycolumn) VALUES('some data');
      
      这个语句把字符串'some data'插入表mytable的mycolumn字段中。将要被插入数据的字段的名字在第一个括号中指定,实际的数据在第二个括号中给出。
      
      INSERT 语句的完整句法如下:
      
      INSERT [INTO] {table_name|view_name} [(column_list)]
      {DEFAULT VALUES | Values_list | select_statement};
      
      如果一个表有多个字段,通过把字段名和字段值用逗号隔开,你可以向所有的字段中插入数据。假设表mytable有三个字段first_column、second_column和third_column。下面的INSERT语句添加了一条三个字段都有值的完整记录:
      
      INSERT mytable (first_column,second_column,third_column)
      VALUES ('some data', 'some more data', 'yet more data');
      
      注意:
      
      你可以使用INSERT语句向文本型字段中插入数据。但是,如果你需要输入很长的字符串,你应该使用WRITETEXT语句。要了解更多的信息,请参考Microsoft SQL Sever 的文档。
      
      如果你在INSERT语句中只指定两个字段和数据会怎么样呢?换句话说,你向一个表中插入一条新记录,但有一个字段没有提供数据。在这种情况下,有下面的四种可能:
      
      1) 如果该字段有一个缺省值,该值会被使用。例如,假设你插入新记录时没有给字段third_column提供数据,而这个字段有一个缺省值'some value'。在这种情况下,当新记录建立时会插入值'some value'。
      
      2) 如果该字段可以接受空值,而且没有缺省值,则会被插入空值。
      
      3) 如果该字段不能接受空值,而且没有缺省值,就会出现错误。你会收到错误信息:
      
      The column in table mytable may not be null.
      
      4) 最后,如果该字段是一个标识字段,那么它会自动产生一个新值。当你向一个有标识字段的表中插入新记录时,只要忽略该字段,标识字段会给自己赋一个新值。
      
      注意:
      
      向一个有标识字段的表中插入新记录后,你可以用SQL变量@@identity来访问新记录的标识字段的值。考虑如下的SQL语句:
      
      INSERT mytable(first_column) VALUES('some value');
      INSERT anothertable(another_first, another_second);
      VALUES(@@identity, 'some value');
      
      如果表mytable有一个标识字段,该字段的值会被插入表anothertable的another_first字段。这是因为变量@@identity总是保存最后一次插入标识字段的值。
      
      字段another_first应该与字段first_column有相同的数据类型。但是,字段another_first不能是应该标识字段。Another_first字段用来保存字段first_column的值。
      
      2. 删除记录
      
      要从表中删除一个或多个记录,需要使用SQL DELETE语句。你可以给DELETE语句提供WHERE子句。WHERE子句用来选择要删除的记录。例如,下面的这个DELETE语句只删除字段first_column的值等于'Delete Me'的记录:
      
      DELETE mytable WHERE first_column='Deltet Me';
      
      DELETE 语句的完整句法如下:
      
      DELETE [FROM] {table_name|view_name} [WHERE clause];
      
      在SQL SELECT语句中可以使用的任何条件都可以在DELECT语句的WHERE子句中使用。例如,下面的这个DELETE语句只删除那些first_column字段的值为'goodbye'或second_column字段的值为'so long'的记录:
      
      DELETE mytable WHERE first_column='goodby' OR second_column='so long';
      
      如果你不给DELETE语句提供WHERE子句,表中的所有记录都将被删除,你不应该有这种想法。如果你想删除表中的所有记录,应使用TRUNCATE TABLE语句。注意这里为什么要用TRUNCATE TABLE语句代替DELETE语句:当你使用TRUNCATE TABLE语句时,记录的删除是不作记录的。也就是说,这意味着TRUNCATE TABLE要比DELETE快得多。
      
      3. 更新记录
      
      要修改表中已经存在的一条或多条记录,应使用SQL UPDATE语句。同DELETE语句一样,UPDATE语句可以使用WHERE子句来选择更新特定的记录。请看这个例子:
      
      UPDATE mytable SET first_column='Updated!' WHERE second_column='Update Me!';
      
      这个UPDATE语句更新所有second_column字段的值为'Update Me!'的记录。对所有被选中的记录,字段first_column的值被置为'Updated!'。
      
      下面是UPDATE语句的完整句法:
      
      UPDATE {table_name|view_name}
      SET [{table_name|view_name}]
      {column_list|variable_list|variable_and_column_list}
      [,{column_list2|variable_list2|variable_and_column_list2}…
      [,{column_listN|variable_listN|variable_and_column_listN}]]
      [WHERE clause]
      
      注意:你可以对文本型字段使用UPDATE语句。但是,如果你需要更新很长的字符串,应使用UPDATETEXT语句。要了解更多的信息,请参考Microsoft SQL Sever 的文档。
      
      如果你不提供WHERE子句,表中的所有记录都将被更新。
      
      你也可以同时更新多个字段,例如,下面的UPDATE语句同时更新first_column、second_column和third_column这三个字段:
      
      UPDATE mytable SET first_column='Updated!
      Second_column='Updated!'
      Third_column='Updated!
      WHERE first_column='Update Me!';
      
      技巧:
      
      SQL忽略语句中多余的空格,你可以把SQL语句写成任何你最容易读的格式。
      
      4. 用SELECT创建记录和表
      
      你也许已经注意到,INSERT语句与DELETE语句和UPDATE语句有一点不同,它一次只操作一个记录。然而,有一个方法可以使INSERT 语句一次添加多个记录。要作到这一点,你需要把INSERT语句与SELECT语句结合起来,象这样:
      
      INSERT mytable(first_column,second_column)
      SELECT another_first,another_second
      FROM anothertable
      WHERE another_first='Copy Me!';
      
      这个语句从anothertable拷贝记录到mytable.只有表anothertable中字段another_first的值为'Copy Me!'的记录才被拷贝。
      
      当为一个表中的记录建立备份时,这种形式的INSERT语句是非常有用的。在删除一个表中的记录之前,你可以先用这种方法把它们拷贝到另一个表中。
      
      如果你需要拷贝整个表,你可以使用SELECT INTO语句。例如,下面的语句创建了一个名为newtable的新表,该表包含表mytable的所有数据:
      
      SELECT * INTO newtable FROM mytable;
      
      你也可以指定只有特定的字段被用来创建这个新表。要做到这一点,只需在字段列表中指定你想要拷贝的字段。另外,你可以使用WHERE子句来限制拷贝到新表中的记录。下面的例子只拷贝字段second_columnd的值等于'Copy Me!'的记录的first_column字段。
      
      SELECT first_column INTO newtable
      FROM mytable
      WHERE second_column='Copy Me!';
      
      使用SQL修改已经建立的表是很困难的。例如,如果你向一个表中添加了一个字段,没有容易的办法来去除它。另外,如果你不小心把一个字段的数据类型给错了,你将没有办法改变它。但是,使用本节中讲述的SQL语句,你可以绕过这两个问题。
      
      例如,假设你想从一个表中删除一个字段。使用SELECT INTO语句,你可以创建该表的一个拷贝,但不包含要删除的字段。这使你既删除了该字段,又保留了不想删除的数据。
      
      如果你想改变一个字段的数据类型,你可以创建一个包含正确数据类型字段的新表。创建好该表后,你就可以结合使用UPDATE语句和SELECT语句,把原来表中的所有数据拷贝到新表中。通过这种方法,你既可以修改表的结构,又能保存原有的数据。

我的栏目

我的存档

数据统计

  • 访问量: 1725
  • 日志数: 4
  • 图片数: 1
  • 书签数: 1
  • 建立时间: 2008-07-05
  • 更新时间: 2008-07-07

RSS订阅

Open Toolbar