小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

Teradata數(shù)據(jù)庫SQL命令

 昵稱8074342 2011-11-30

Teradata數(shù)據(jù)庫SQL命令  

2011-04-25 11:16:13|  分類: TeraData文檔 |  標簽: |字號 訂閱

HELP 幫助用戶了解數(shù)據(jù)庫中各種對象的結(jié)構(gòu)
SHOW 幫助用戶了解某種對象的定義,即返回其DDL語句
EXPLAIN 返回一個SQL語句經(jīng)優(yōu)化處理后的執(zhí)行步驟,注意并未真正執(zhí)行
FALLBACK 對數(shù)據(jù)加以保護的一種方式,是冗余的備份
RENAME 對表重命名
NULLIFZERO 對數(shù)據(jù)作累計處理時,忽略零值
ZEROIFNULL 對數(shù)據(jù)作累計處理時,將空值作零處理
WITH...BY 對詳細數(shù)據(jù)記錄作分類統(tǒng)計(Sub-Total)時有用
MODIFY USER/DATABASE  對用戶/數(shù)據(jù)庫對象作動態(tài)修改而無需數(shù)據(jù)庫重組


HELP  命令     參數(shù)           說明
HELP DATABASE databasename;  可以顯示一個指定數(shù)據(jù)庫所包含的所有對象
HELP USER username;  顯示某個用戶中所包含對象的信息
HELP TABLE tablename;  顯示某張表的信息
HELP VIEW viewname;  顯示某個視圖的信息
HELP MACRO macroname;  顯示某個宏的信息
HELP COLUMN table or viewname.*;  顯示表/視圖的各列的信息
HELP COLUMN table or viewname.colname . . ., colname;  顯示表/視圖某幾列的信息
HELP INDEX tablename;  顯示某個表中的所有索引定義
HELP STATISTICS tablename;  顯示表的統(tǒng)計
HELP CONSTRAINT table or viewname.constraintname;  顯示定義在某個表/視圖上的約束定義
HELP JOIN INDEX join_indexname;  顯示連接索引的定義
HELP TRIGGER triggername;  顯示觸發(fā)器的信息
HELP PROCEDURE procedurename;  顯示存儲過程的信息
HELP PROCEDURE procedurename ATTRIBUTES;
HELP 'SQL';  得到所有SQL命令的列表信息
HELP 'SQL sqlcommand';  得到某個特定SQL命令的使用方法


如要知道這些數(shù)據(jù)庫對象是用什么樣的DDL命令創(chuàng)建的,則要使用SHOW命令:
SHOW命令 參數(shù)
SHOW TABLE Tablename ;
SHOW VIEW Viewname;
SHOW MACRO Macroname;
SHOW INDEX Tablename;
SHOW JOIN INDEX join_indexname;
SHOW TRIGGER Triggername;
SHOW PROCEDURE Procedurename;



EXPLAIN命令:利用EXPLAIN命令,可以了解Teradata執(zhí)行一個SQL交易請求的詳細過程和計劃,這對于更進一步地理解Teradata的查詢處理機制有很大的幫助。另一方面,對于復(fù)雜SQL交易的調(diào)試來說,這也是不可缺少的一個工具。

利用EXPLAIN解釋一個SQL交易的方法很簡單,就是在原來SQL語句的前面加上EXPLAIN即可,其它完全不變。


在LIKE結(jié)構(gòu)的字符串中,'%'和'_'可以作為通配符使用,但是如果需要匹配這些字符本身(比如查找95%),即把它們作為一般字符時使用,我們可以通過定義ESCAPE字符來達到這個目的,緊跟在ESCAPE字符后的’%’和’_’作為一般字符看待。

例:
LIKE ''%A%%AAA__'' ESCAPE ''A''

在這個表達式中,將字母A定義為ESCAPE字符,其中:
! 第一個%為通配符;
! 第一個A和其后的%聯(lián)合表示字符%;
! 第三個%為通配符;
! 第二個A和其后的A聯(lián)合表示字符A;
! 第四個A和其后的’_’聯(lián)合表示字符_;
! 最后一個’_’為通配符。


對于表達式的操作數(shù)如果是字符,ANSI標準中是區(qū)分大小寫的,如果不要區(qū)分大小寫,可以使用UPPER函數(shù)將其轉(zhuǎn)換成大寫字母來進行匹配。Teradata缺省不區(qū)分大小寫,如果要區(qū)分,可以使用其擴展參數(shù)CASESPECIFIC。


NULL的使用

NULL的說明:
! NULL顯示沒有數(shù)據(jù)的字段
! NULL表示不存在或未發(fā)現(xiàn)的值
! NULL既不是數(shù)字類型也不是字符類型
! 具有NULL值的字段可以被壓縮,不占任何空間

NULL也可以參與運算,其運算規(guī)則為:
! NULL在算術(shù)運算中產(chǎn)生的結(jié)果為NULL(空)
! NULL在比較運算中產(chǎn)生的結(jié)果為False
! UNKNOWN DATA, MISSING DATA和NULL是同樣的含義
! 當進行升序排列時,NULL在數(shù)字列排列在負數(shù)前,在字符列排列在空格
前。




CREATE MACRO macroname AS ( . . . );  定義宏
EXECUTE macroname;  執(zhí)行宏語句
SHOW MACRO macroname;  顯示宏定義
REPLACE MACRO macroname AS ( . . . );  改變宏定義
DROP MACRO macroname;  從字典中刪除宏定義
EXPLAIN EXEC macroname;  顯示宏執(zhí)行的解釋


EXISTS在子查詢中的使用

EXISTS可以使用在子查詢中,用來表示查詢至少返回一行。如果前面加上否定詞NOT,則表示查詢時無記錄存在。EXISTS可以代替IN,而NOT EXISTS可以代替NOT IN。


CHARACTERS函數(shù)

CHARACTERS函數(shù)也是Teradata的擴展,用于計算VARCHAR型數(shù)據(jù)字段的實際字符串長度。CHARACTERS函數(shù)可以簡寫成CHARACTER、CHARS或者CHAR。


TRIM函數(shù)

ANSI標準的TRIM函數(shù)用于去除字符數(shù)據(jù)中前頭或后端的空格或者二進制數(shù)據(jù)(BYTE與VARBYTE)中前頭或后端的零。在Teradata缺省模式下,TRIM (<expression>)只能去除后端的空格或二進制零。


SELECT CAST (salary_amount AS FORMAT ''$$$,$$9.99'');

SELECT (1000/salary_amount) * 100
(FORMAT 'ZZ9%')
(TITLE 'Increase Percentage')
FROM employee
WHERE employee_number = 1004;

SELECT (CAST (1000/salary_amount) * 100 AS FORMAT 'ZZ9%'
TITLE 'Increase Percentage') FROM ...

FORMAT短語中可以使用的格式化字符主要為:
$ 美元標識符
9 數(shù)字位
Z 將數(shù)字中的前綴零去除
, 在指定位置插入逗號
. 指定小數(shù)點位置
- 在指定位置插入連字號
/ 在指定位置插入斜線
% 在指定位置插入百分號
X 字符數(shù)據(jù),每個X代表一個字符
G 圖形數(shù)據(jù).一個G代表一個邏輯字符(雙字節(jié))
B 在指定位置插入空格


對日期的格式化處理

在Teradata中,日期數(shù)據(jù)的缺省輸出格式是:YY/MM/DD,這和ANSI標準是一樣的。而ANSI標準建議的日期顯示格式是:YYYY-MM-DD。

其它一些常用的日期顯示格式列舉如下,其中的B表示空格。
   YYYY/MM/DD'
   YYYY-MM-DD'
   YYYY.DDD'
   DBMMMBYYYY'
   MMBDD,BYYYY'
   YYYYBMMMBDD'
   YY/MM/DD'
   D-MM-YY'
   YBDDD'
   MM'

下面是一些對日期進行格式化的例子。
   句法                        結(jié)果
   FORMAT 'YYYY/MM/DD'         1996/03/27
   FORMAT 'DDbMMMbYYYY'        27 Mar 1996
   FORMAT 'mmmBdd,Byyyy'       Mar 27, 1996
   FORMAT 'DD.MM.YYYY'         27.03.1996
   FORMAT 'MM/DD/YY'           03/27/96
   FORMAT 'MMM.DD.YY'          Mar.27.96
   FORMAT 'yy -- mm -- dd'     96 -- 03 -- 27
   FORMAT 'DDDYY'              08696

SELECT last_name,first_name,hire_date (FORMAT 'mmmBdd,Byyyy')
FROM employee
ORDER BY last_name;

利用FORMAT短語,可以將字符字段或表達式進行截取處理,這種處理只影響顯示格式,而不會影響數(shù)據(jù)的內(nèi)部存儲格式。


Teradata的屬性函數(shù)

屬性函數(shù)     返回信息說明
TYPE         數(shù)據(jù)類型
TITLE        標題短語
FORMAT       格式短語
NAMED        NAMED子句
CHARACTERS   字符個數(shù)


Teradata DDL允許在創(chuàng)建表時指定表的物理屬性,包括:
   A. SET 不允許記錄重復(fù),例:CREATE SET TABLE table1 ...
   B. MULTISET 允許記錄重復(fù),例:CREATE MULTISET TABLE table1 ...
   C. 數(shù)據(jù)保護要結(jié)合FALLBACK和JOURNAL (流水或日志)。
      FALLBACK是Teradata的一種數(shù)據(jù)保護機制,數(shù)據(jù)表的每一條記錄都同時存放兩份,而且位于不同的AMP所控制的存儲單元中;當數(shù)據(jù)發(fā)生問題或者AMP失敗時,可以利用存放在其他AMP上的數(shù)據(jù)保證對數(shù)據(jù)表的訪問。
        - FALLBACK 使用FALLBACK保護機制
        - NO FALLBACK 不使用FALLBACK保護機制
      日志有BEFORE和AFTER兩種,分別保存了一條記錄變化前后的狀態(tài)。當系統(tǒng)出錯時,可以利用日志進行恢復(fù)。
   D. 存儲空間選項
      DATABLOCKSIZE用來指定數(shù)據(jù)塊大小,最小的數(shù)據(jù)塊為6144字節(jié),最大的數(shù)據(jù)塊是32256字節(jié)。
      FREESPACE用來定義在每個磁盤柱面上保留的空間(0-75%)。
   例:
      CREATE MULTISET TABLE table_1
      , FALLBACK, NO JOURNAL
      , FREESPACE = 10 PERCENT
      , DATABLOCKSIZE = 16384 BYTES
      (field1 INTEGER);


雖然TD的DDL里有primary key,但是實際上存儲在TD數(shù)據(jù)字典里的只有index:
   A. 沒有在CREATE TABLE時指定PI
        IF 定義了PK,THEN PK = UPI
        ELSE IF 存在定義為UNIQUE的字段,
        THEN 第一個NIQUE的字段為UPI
        ELSE 表中定義的第一個字段作為NUPI
   B. CREATE TABLE時指定了PI
        IF 定義了PK,THEN PK作為USI
        AND為每一個定義為UNIQUE的字段建立一個USI


新建一張表TB1,表結(jié)構(gòu)與TB2一樣,不需要數(shù)據(jù)。
    Create table TB1 as TB2 with no data;

使用子查詢創(chuàng)建表,并選擇所需的列。
    CREATE TABLE emp1 AS(SELECT employee_number, department_number, salary_amount FROM employee) WITH NO DATA;

往TB1表中裝入TB2表的數(shù)據(jù)(也可以是有選擇性的,需指定字段)
    INSERT INTO TB1 SELECT * from TB2;


交易完整性
   在Teradata中,系統(tǒng)將保證一個交易的完整。怎樣才算是一個交易呢,在Teradata中,根據(jù)其所處方式的不同在處理時也有所不同。在 Teradata缺省模式下,以分號結(jié)束的每個SQL語句都是一個完整的交易,也可以使用BT (Begin Transaction)和ET (End Transaction)來顯示地定義一個交易。下面看一個例子:
  
   例:

   缺省方式
   .LOGON
   INSERT row1; (txn #1)
   INSERT row2; (txn #2)
   .LOGOFF

   用BT和ET顯示定義交易
   .LOGON
   BT;
   INSERT row1; (txn #1)
   INSERT row2;
   COMMIT WORK;
   ET;
   .LOGOFF
  
   第一部分中有兩個SQL語句,用分號結(jié)束,表示兩個交易,任何一個失敗不會影響另一個的執(zhí)行。而第二部分用BT和ET顯示地規(guī)定:在BT和ET之間的所有 SQL是一個交易,只有最后的COMMIT WORK執(zhí)行成功后,才會真正地更新數(shù)據(jù)庫。執(zhí)行過程中任何一個SQL語句失敗,都會使整個交易失敗,系統(tǒng)將自動進行恢復(fù)(Rollback)處理。

   在ANSI方式下,必須進行顯示地提交才能完成一個交易。


利用WITH BY進行數(shù)據(jù)小計

   WITH BY的主要特點包括:
     A. 它為明細數(shù)據(jù)表創(chuàng)建分類小計。
     B. 跟GROUP BY不同的是,WITH BY沒有剔除明細記錄,而是在明細記錄后面按照分類增加小計行。
     C. 可以允許多于一個字段進行小計,即小計當中可以嵌套小計。
     D. 輸出結(jié)果將根據(jù)BY后面的所有字段自動進行排序。
     E. 它是Teradata的一個擴展特性。

   舉例:
     1. WITH BY, WITH和ORDER BY的聯(lián)合使用:

        SELECT last_name AS NAME
        ,salary_amount AS SALARY
        ,department_number AS DEPT
        FROM employee
        WITH SUM (SALARY) BY DEPT
        WITH SUM (SALARY) (TITLE 'GRAND TOTAL')
        ORDER BY NAME;

        結(jié)果如下:
        NAME       SALARY    DEPT
        Kanieski   29250.00   301
        Stein      29450.00   301
        -------------
        Sum (SALARY) 58700.00
        Johnson    36300.00   401
        Trader     37850.00   401
        -------------
        Sum (SALARY) 74150.00
        Ryan       31200.00   403
        Villegas   49700.00   403
        -------------
        Sum (SALARY) 80900.00
        -------------
        GRAND TOTAL 213750.00

     2. WITH和GROUP BY的聯(lián)合使用:

        SELECT department_number (TITLE 'dept_no')
        ,SUM (salary_amount)
        ,AVG (salary_amount)
        FROM employee
        GROUP BY department_number
        WITH SUM (salary_amount) (TITLE 'GRAND TOTAL')
        ,AVG (salary_amount) (TITLE '')
        ORDER BY department_number;

結(jié)果如下:
        dept_no SUM (salary_amount) AVG (salary_amount)
        301     58700.00            29350.00
        401     74150.00            37075.00
        403     80900.00            40450.00
        --------------------- ----------------------
        GRAND TOTAL 213750.00 35635.00


集合操作

    集合操作主要包括:合并操作(UNION)、相交操作(INTERSECT)和排外操作(EXCEPT)

    Teradata的集合操作與標準ANSI集合操作的不同之出在于返回結(jié)果的重復(fù)記錄處理上。在ANSI標準中集合操作將重復(fù)記錄自動剔除,而Teradata增加了ALL關(guān)鍵詞,ALL關(guān)鍵詞允許保留重復(fù)記錄。

    我們將有關(guān)集合操作的一些補充規(guī)則列舉如下:
      1. 在子查詢中不能使用集合操作
      2. 在定義視圖時不能使用集合操作
      3. 不能包含WITH或WITH BY子句
      4. 集合操作的優(yōu)先級為:INTERSECT第一,其后分別為UNION和 EXCEPT,從左到右。可以使用括號改變優(yōu)先級。
      5. 每一個SELECT語句必須有一個FROM <表名>的子句
      6. 每個單獨的SELECT語句中可以使用GROUP BY
      7. Group By不能用于或影響整個返回結(jié)果集
      8. 重復(fù)記錄將會拋棄,除非使用ALL選項


字符串函數(shù)

    SUBSTRING函數(shù):用來從字符串中析取一個子字符串,其格式為:
    SUBSTRING (<字符串表達式> FROM <開始位置> [ FOR <長度> ])
    如:
    SELECT SUBSTRING('catalog' FROM 5 FOR 3);
    結(jié)果為log。

    字符串合并:字符串合并的符號是"||",它把兩個字符串串聯(lián)成一個字符串。其基本格式為:
    <字符串1> || <字符串2>

    INDEX (字符串定位函數(shù)):INDEX用來在一個字符串中定位一個子串的開始位置。如下面的例子:
    SELECT INDEX('abc', 'b'); 返回結(jié)果2


CASE 表達式

    A. 基于值(Valued)的CASE語句,例如:
       SELECT SUM(
       CASE department_number
       WHEN 401 THEN salary_amount
       ELSE 0
       END) / SUM(salary_amount)
       FROM employee;

    B. 基于搜索(Searched)的CASE語句,例如:
       SELECT last_name,
       CASE
       WHEN salary_amount < 30000
       THEN 'Under $30K'
       WHEN salary_amount < 40000
       THEN 'Under $40K'
       WHEN salary_amount < 50000
       THEN 'Under $50K'
       ELSE
       'Over $50K'
       END
       FROM employee
       ORDER BY salary_amount;

    C. NULLIF表達式
       NULLIF實際上用來作為CASE語句在某種情況下的縮寫,其格式為:
       NULLIF ( <expression1> , <expression2> )
       規(guī)則是:
           如果表達式1等于表達式2,則返回NULL
           如果表達式1不等于表達式2,則返回表達式1的值。
       例:
           SELECT call_number
           ,labor_hours (TITLE 'ACTUAL HOURS')
           ,NULLIF (labor_hours, 0)
           (TITLE 'NULLIF ZERO HOURS')
           FROM call_employee
           ORDER BY labor_hours;

注意:在除法表達式中,如果被除數(shù)有可能為零值,經(jīng)常使用NULLIF來避免除零錯。

     D. COALESCE(接合)表達式
        COALESCE實際上也是CASE語句在某種特殊情況下的宿寫。COALESCE將返回第一個非NULL表達式的值。其格式為:
COALESCE ( <expression1> , <expression2> [, <expressionX> ] )

例:從phone_table表中,列出姓名和電話號碼,如果辦公室電話存在則列出辦公室電話,否則列出家里電話。
            SELECT name
            ,COALESCE (office_phone, home_phone)
            FROM phone_table;

        例:轉(zhuǎn)換可能的NULL值為零:
            SELECT course_name
            ,COALESCE (num_students, 0)
            (TITLE '# Students')
            FROM class_schedule;


簡單排隊RANK
    排隊函數(shù)(RANK)的語法是:
    RANK(colname)
    這里,colname表示排隊的列名,其結(jié)果降序排列。
    問題
       顯示商店1001的產(chǎn)品銷售額排隊。
    解答
       SELECT storeid, prodid, sales, RANK(sales)
       FROM salestbl
       WHERE storeid = 1001;
    結(jié)果
       storeid    prodid    sales        Rank
       1001       F         150000.00    1
       1001       A         100000.00    2
       1001       C         60000.00     3
       1001       D         35000.00     4
    如上所示,列Rank的最大值代表最低的銷售額。


帶限定的排隊
    QUALIFY子句限制排隊輸出的最終結(jié)果。QUALIFY子句與HAVING子句類似,使輸出限制在一定范圍內(nèi)。
    問題
       按商店得到銷售前3名的產(chǎn)品。
    解答
       SELECT storeid, prodid, sales, rank(sales)
       FROM salestbl
       GROUP BY storeid
       QUALIFY rank(sales) <= 3;
    結(jié)果
       storeid   prodid    sales       Rank
       1001      A         100000.00   1
       1001      C         60000.00    2
       1001      D         35000.00    3
       1002      A         40000.00    1
       1002      C         35000.00    2
       1002      D         25000.00    3
       1003      B         65000.00    1
       1003      D         50000.00    2
       1003      A         30000.00    3

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多