[ 永遠的UNIX::UNIX技術資料的寶庫 ]   GB | BIG5

首頁 > 數據庫 > 其它 > 正文
SQL 實踐和技巧 <1>
本文出自: http://go3.163.com/~axiom999/ (2001-06-18 19:00:00)

 

  • NULL值的使用

     

    RDSQL中字段缺省值為空;並且對數值型的0和空值,以及字符型的空白和空值區別對待。
    數值表達式中某個變為空,則整個表達式值為空;
    聚合函數中,對空值忽略不計,若全部為空值,除
    COUNT*)返回0外,其余返回空值。
    布爾表達式中,結果可能為“未知”(見下表)。如
    TRUE AND NULL 結果為 “未知”,對“未知”結果在RDSQL中看作不符合查詢條件。

    and

    T

    F

    ?

     

    or

    T

    F

    ?

     

    not

     

    T

    T

    F

    ?

     

    T

    T

    T

    T

     

    T

    F

    F

    F

    F

    ?

     

    F

    T

    F

    ?

     

    F

    T

    ?

    ?

    F

    ?

     

    ?

    T

    ?

    ?

     

    ?

    ?

    結合上表,分析下列子句 ,其中n1=20n2為空;n3=30。結果如右。

    where n1*n2 < 1000 and n3 = 30; 結果:不符合查詢條件
    where n1*n2 < 1000 or n3 = 30; 結果:符合查詢條件

    ORDER BY子句中的空值,每一個空值為一組。
    INSERTUPDATE時,可使用關鍵字NULL/null表示空值。
    字段是否可以為空,由
    CREATE TABLE語句中是否有NOT NULL指定或由ALTER修改。

    Qselect count(*) from t1select count(c1) from t1是否一樣?

     

     

  • 字符查找,主要使用LIKEMATCHES

     

    LIKE

    MATCHES

    意義

    %

    *

    匹配0或多個字符

    -

    ?

    匹配一個字符

    \

    \

    轉義字符

    []

    選擇匹配

    例:matches ‘*Sp’;匹配以任何字符開始,以Sp結束的字段值
    matches ‘?l*’ 匹配第一個字符任意,第二個字符為l,其余字符任意的字段值
    matches ‘[A-N]*’ 匹配以AN的字符開始,其余字符任意的字段值
    matches ‘*[sS]*’ 匹配含有sS的字段值,擴展以下可用case insensitive查詢
    like ‘%\%%’ 匹配含有%的字段值

     

     

  • 用SQL語句求表一中的關name有多少不同的num,結果如表二。
    表一:                    
    表二:
    id   name   num              name     count1
    1    AA    1               CC       2
    2    AA    2               BB       2
    3    AA    3               AA       3
    4    AA    1
    5    AA    2
    6    BB    4
    7    BB    5
    8    BB    4
    9    BB    5
    10   CC    6
    11   CC    6
    12   CC    7
  •  

    SQL語句如下:

    create table t1
    (
    id smallint,
    name char(10),
    num smallint
    );

    insert into t1 values(1,'AA',1);
    insert into t1 values(2,'AA',2);
    insert into t1 values(3,'AA',3);
    insert into t1 values(4,'AA',1);
    insert into t1 values(5,'AA',2);
    insert into t1 values(6,'BB',4);
    insert into t1 values(7,'BB',5);
    insert into t1 values(8,'BB',4);
    insert into t1 values(9,'BB',5);
    insert into t1 values(10,'CC',6);
    insert into t1 values(11,'CC',6);
    insert into t1 values(12,'CC',7);

    Aselect name ,count(distinct num) from t1 group by name;

    4)使用旋轉矩陣,將表一中關id在不同月份的費用,由縱向變為橫向。

    其中表一對一個id某個月份的記錄數可能>1。表一:
    id   d1  fee費用(分)
    1 2000-01-24 100
    1 2000-04-24 100
    2 2000-02-24 200
    2 2000-06-24 200
    3 2000-04-24 400
    4 2000-04-24 400
    5 2000-05-24 500
    6 2000-06-24 600
    7 2000-09-24 900
    8 2000-11-24 1100

    表二:
    id 1月份費用 2月份費用 …… … … 12月份費用
    1  100 0  0  100  0  0  0  0  0  0  0   0
    2  0  200 0  0   0  200 0  0  0  0  0   0
    3  0  0  0  400  0  0  0  0  0  0  0   0
    4  0  0  0  400  0  0  0  0  0  0  0   0
    5  0  0  0  0   500 0  0  0  0  0  0   0
    6  0  0  0  0   0  600 0  0  0  0  0   0
    7  0  0  0  0   0  0  0  0  900 0  0   0
    8  0  0  0  0   0  0  0  0  0  0  1100  0

    SQL語句:
    create table t3
    (
    id smallint,
    d1 datetime year to day,
    fee int
    );

    insert into t3 values(1,"2000-01-24", 100);
    insert into t3 values(1,"2000-04-24", 100);
    insert into t3 values(2,"2000-02-24", 200);
    insert into t3 values(2,"2000-06-24", 200);
    insert into t3 values(3,"2000-04-24", 400);
    insert into t3 values(4,"2000-04-24", 400);
    insert into t3 values(5,"2000-05-24", 500);
    insert into t3 values(6,"2000-06-24", 600);
    insert into t3 values(7,"2000-09-24", 900);
    insert into t3 values(8,"2000-11-24", 1100); 

    create table t4 旋轉矩陣
    (
    m_code smallint,
    y1 smallint,
    y2 smallint,
    y3 smallint,
    y4 smallint,
    y5 smallint,
    y6 smallint,
    y7 smallint,
    y8 smallint,
    y9 smallint,
    y10 smallint,
    y11 smallint,
    y12 smallint
    );

    insert into t4 values(1, 1,0,0,0,0,0,0,0,0,0,0,0);
    insert into t4 values(2, 0,1,0,0,0,0,0,0,0,0,0,0);
    insert into t4 values(3, 0,0,1,0,0,0,0,0,0,0,0,0);
    insert into t4 values(4, 0,0,0,1,0,0,0,0,0,0,0,0);
    insert into t4 values(5, 0,0,0,0,1,0,0,0,0,0,0,0);
    insert into t4 values(6, 0,0,0,0,0,1,0,0,0,0,0,0);
    insert into t4 values(7, 0,0,0,0,0,0,1,0,0,0,0,0);
    insert into t4 values(8, 0,0,0,0,0,0,0,1,0,0,0,0);
    insert into t4 values(9, 0,0,0,0,0,0,0,0,1,0,0,0);
    insert into t4 values(10,0,0,0,0,0,0,0,0,0,1,0,0);
    insert into t4 values(11,0,0,0,0,0,0,0,0,0,0,1,0);
    insert into t4 values(12,0,0,0,0,0,0,0,0,0,0,0,1);

     

    --方法一
    select id,month(d1) month,sum(fee) fei from t3 group by 1,2 into temp aa;
    select id,
    sum(y1*fei) y1,sum(y2*fei) y2,sum(y3*fei) y3,sum(y4*fei) y4,
    sum(y5*fei) y5,sum(y6*fei) y6,sum(y7*fei) y7,sum(y8*fei) y8,
    sum(y9*fei) y9,sum(y10*fei) y10,sum(y11*fei) y11,sum(y12*fei) y12
    from aa, t4 where aa.month = t4.m_code
    group by id order by id

    --方法二
    select id,
    sum(y1*fee) y1,sum(y2*fee) y2,sum(y3*fee) y3,sum(y4*fee) y4,
    sum(y5*fee) y5,sum(y6*fee) y6,sum(y7*fee) y7,sum(y8*fee) y8,
    sum(y9*fee) y9,sum(y10*fee) y10,sum(y11*fee) y11,sum(y12*fee) y12
    from t3, t4 where month(d1) = t4.m_code
    group by id order by id

    方法一和方法二的結果一樣,但有所區別:
    方法一中是先對
    id某個月的錢進行累加,然進行旋轉;
    方法二中在表一對一個
    id某個月份的記錄數可能>1的情況時,先對每條記錄進行旋轉,然在累加求和。

    (http://www.fanqiang.com)
        進入【UNIX論壇

    相關文章
    SQL 實踐和技巧 <2> (2001-06-18 20:10:01)
    SQL 實踐和技巧 <1> (2001-06-18 19:00:00)
     

    ★  樊強制作 歡迎分享  ★