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 |
|
|