1.創建一個和表 pnr_1 結構一樣的表
Create table pnr_2 as pnr_1 with no data 不含數據
Create table pnr_2 as pnr_1 with data 含數據
2.NULLIF(exp1,exp2) 當字段exp1與exp2相等時返回 空;當兩者不相等時返回 exp1
-------常用在除數不能為0的限制下 RPK/NULLIF(ASK,0)
3.Substr(exp,m,n) 從第m位開始截取,截取長度為 n
------常用在時間的處理上 substr(‘20141023’,1,6) à ‘201410’
4.COALESCE (expression_1, expression_2, ...,expression_n)依次參考各參數表達式,遇到非null值即停止並返回該值。如果所有的表達式都是空值,最終將返回一個空值.
將ask為null的轉換為0 ------sum(coalesce(ask,0))
5. Index(str1 , str2) 返回 str2在str1中的起始位置
Index(str1 , str2) > 0 表名在str1中包含str2
6.Decimal (n ,m) 有效長度為n 小數位占m
Cast(12345.6789 as decimal(20,3))===》 12345.678
7.Teradata 四舍五入原則:Teradata中四舍五入的規則由DBSCONTROL下的參數 RoundHalfwayMagUp 決定,默認 RoundHalfwayMagUp = FALSE,此時按Teradata的規則進行進位,Teradata的規則考慮到5是個中間值,都進位則概率不平均,如果取決於前一位的奇偶,則進位的5和舍掉的5是平均的,根據這個原則,Teradata的四舍五入規則為:當5后面有1位不為0時,則進位,當5后面位都為0或者沒有其他位時根據5前面一位的奇偶,奇進偶不進。
select cast('1212.705' as decimal(18,2)) --1212.70
select cast('1212.715' as decimal(18,2)) --1212.72
select cast('1212.7051' as decimal(18,2)) --1212.71
select cast('1212.7052' as decimal(18,2)) --1212.71
select cast('1212.70500' as decimal(18,2)) --1212.70
select cast('1212.705001' as decimal(18,2)) --1212.71
8.兩個表進行union 時 對應的字段的 數據類型 要保持完全一致。
------字母與漢字不能進行union
------958與0.123進行union時 0.123會強制轉換為0,所以要保證數據的類型一致
Cast(958 as decimal(20,3)) ; cast(0.123 as decimal(20,3))
9.替換 oreplace('tera-data', '-', '') ===》 teradata
oreplace('ABCD', 'C', 'P') ===》 ABPD
10.MINUS
select A,B,C from table_1 where D>0
minus sleect A,B,C from table_1 where E=1
------ 在查詢結果1中刪除 包含有 查詢結果2 中的數據
11. || 字符串連接
當前日期的上一年的第一個月的日期
Add_months( CAST(substr( flight_dt ,1,4) ||‘01’AS date format‘YYYYMM’), -12)
Add_months( cast( substr( ‘20141120’,1,4) || ‘01’as date format ‘YYYYMM’), -12) ===》 201301
將小數轉化為百分數
cast(0.1234*100 as decimal(20,2))||'%' ===》 12.34%
12. 表重命名 rename table tablename to newtablename
13. HELP
Help database pmart 顯示pmart庫中的對象(表、視圖、宏等)
14. between A and B ------------在A與B之間且包括A和B
15. 強調字母大小寫----- CASESPECIFIC / NOT CASESPECIFIC
Select * from table_1 where name(CASESPECIFIC) like ‘%M%’
--------teradata 在缺省的狀態下是不區分大小寫的
16. LIKE
like '_T%' ----T 在第二個位置,以任意字符結尾 ; like '_M_N_' ---- M在第二個位置,N在第四個位置
%、_ 在 like 中作為通配符使用,但當查找 % 和 _ 本身時
定義 ESCAPE 字符 在escape字符后的 %和 _ 作為一般的字符使用
like '%A%' ESCAPE 'A' ----(第一個%為通配符,A%表示一般字符%) 表示以%結尾的字符串
like '_B_%' ESCAPE 'B' ----第二個字符為 _ 的以任意結尾的字符串
17. char(M) 固定長度字符串 共占M個字節 當字符串少於M個字節時以空格補充 ; varchar(M) 可變長度的字符串 最大長度為M
Name Char(6) ----LJT ;
name varchar(6) ----LJT.
18. 與日期有關的函數
EXTRACT --- select extract( year/month/day from date+30)
ADD_MONTHS ----select add_months(date, -3)
--select add_months(cast(flight_dt as date format ‘YYYYMMDD’) ,9)
19. CAST 數據轉換
以大寫顯示結果 --- select CAST(name as char(5) UPPERCASE)
------select UPPER(name) ;select name(UPPERCASE)
20. MACRO 宏
宏定義:
Create MACRO macro_name
( icur_start_dt VARCHAR(10)
, icmp_start_dt VARCHAE(10) ) ---宏參數
AS ( ……… ) ;
改變宏的定義
REPLACE MACRO macro_name (宏參數) AS ( ………)
宏執行:
EXEC pmart.macro_mkt_dom_reg_detail('20140430','20140401')
宏刪除:
DROP MACRO pmart.macro_mkt_dom_reg_detail
宏注釋:
COMMENT ON MACRO pmart.macro_mkt_dom_reg_detail IS '國際報表'
21. 子查詢
----子查詢的結果是唯一的,不含重復值,相當於加上了 distinct
---- order by 不能用於子查詢
22. TITLE
Select pax_count DECIMAL(20,6) ( TITLE‘承運旅客人數’)
23. CHARACTERS 計算varchar 型字符的實際長度
Select * from table_1 where CHARACTERS(first_name)>5
Select * from tbale_1 where CHARACTERS( TRIM(frist_name) )>5
24. trim 去掉字符數據前端和后端的字符
select trim (' abc ') ===》 abc
select trim(both 'a' from 'aabacdea') ===》bacde 去掉首尾指定字符
select trim(leading 'a' from 'aabacdea') ===》bacdea 去掉前端指定字符
select trim(trailing 'a' from 'aabacdea') ===》aabacde 去掉結尾指定字符
25. 當一個表與其自己進行連接 即自連接(self join)時 表一定要使用 別名
26. 建立表
CREATE VOLATILE MULTISET TABLE VT_RPT_OD_FORWARD_BOOKING
,FALLBACK ----數據備份 在缺省時默認為 無數據備份有恢復日志
,NO BEFORE JOURNAL -------無向前的恢復日志
,NO AFTER JOURNAL ---------無向后的恢復日志
(
Summ_Dt DATE FORMAT 'YYYYMMDD',
Od_Seq INTEGER NOT NULL WITH DEFAULT,
Group_Ind CHAR(1) CHARACTER SET LATIN CASESPECIFIC,
Od_Poo CHAR(3) CHARACTER SET UNICODE CASESPECIFIC,
Od_Booked_Qty_Sum DECIMAL(10,0) DEFAULT ‘999’
)
PRIMARY INDEX ( Od_Dpt_Airpt_Cd ,Od_Arrv_Airpt_Cd ,Od_Link_Airpt_Cd1 )
ON COMMIT PRESERVE ROWS;
WITH DEFAULT---用字段的系統默認值代替null
DEFAULT ‘999’ ------當無數據時用 默認值999代替空
CHARACTER SET LATIN CASESPECIFIC -----該字段大小寫敏感
CHARACTER SET UNICODE CASESPECIFIC
VOLATILE---建立臨時表 只存在於cache中,data dictionary中也找不到這個表,當User結束一個session時,這個表將自動刪除,所有用戶無法訪問,下次用戶需要重新建表
ON COMMIT PRESERVE ROWS ----使用ON COMMIT PRESERVE ROWS,允許會話中的其他查詢使用這個可變臨時表。缺省是ON COMMIT DELETE ROWS,意味着查詢提交后,數據被刪除。
創建可變臨時表時,不允許使用的CREATE TABLE選項包括:
永久日志(Permanent Journaling)
參照完整性(Referential Integrity)
檢查約束(Check)
列壓縮
列缺省值
列標題
命名的索引
MULTISET ------允許記錄重復 SET------不允許記錄重復
缺省時默認為 SET TABLE 當對SET TABLE 進行insert 時需要先檢查表中是否有重復的數據 故會相當耗費資源 故建表時宜都用 MULTISET TABLE
PRIMARY INDEX ---主索引
選擇原則:不同值盡量多、使用頻繁(值訪問及連接訪問)、少更新
CREATE VOLATILE MULTISET TABLE vt_airport_city_cnty_region AS
(
SELECT t1.airport_iata_cd,
t1.city_cd,
COALESCE(t2.city_name,'') AS city_name,
COALESCE(t3.country_cd,'') AS country_cd,
COALESCE(t3.country_name,'') AS country_name,
COALESCE(t4.iata_region,'') AS iata_region
FROM ${AUTO_PVIEWDB}.ref_airport_cd t1
LEFT JOIN
${AUTO_PVIEWDB}.ref_city_cd t2
ON t1.city_cd = t2.city_cd
LEFT JOIN
${AUTO_PVIEWDB}.ref_country_cd t3
ON t2.country_cd = t3.country_cd
LEFT JOIN
${AUTO_PLGADB}.lga_iata_region t4
ON t3.country_name = t4.country_name
) WITH DATA
PRIMARY INDEX (airport_iata_cd)
ON COMMIT PRESERVE ROWS;
27. UNION 與 UNION ALL
UNION ---自動去除兩個集合合並后重復的記錄
UNION ALL ---保留重復記錄
28. 刪除表
drop table table_name 刪除表中內容及其在數據字典中的定義
delect table_name / delect from table_name 只刪除表中數據
刪除符合某條件的記錄: delect from table_name where age<18
29.表的修改
增加或刪除字段:
alter table table_name add flight_dt varchar(10)
,add summ_dt varchar(10)
alter table table_name drop flight_dt varchar(10)
,drop summ_dt varchar(10)
修改已有字段屬性:
對沒有FALLBACK 的表建立fallback 保護:
ALTER TABLE table_name , FALLBACK
修改約束條件:表中已有的數據如果不符合修改后的約束條件則修改不能成功
添加約束:
Alter table table_name constraint check (age>20 and age<30)
修改約束:
Alter table tbale_name modify constraint age_range(即約束名稱)
Check (age>20 and age<30)
刪除約束:
Alter table table_name drop constraint age_range(即約束名稱)
30.索引
主索引只能在創建表時建立,次索引既可在創建表時建立也可以用create語句建立.
Help index table_name 顯示表table_name 上的所有索引
創建有名稱的唯一次索引:
Create unique index full_naem (last_name,first_name) on table_name
創建非唯一性次索引,且不用命名:
Create index (airline_cd) on table_name
刪除次索引:只有次索引可以被刪除,主索引不能被刪除
Drop index full_name on table_name 利用次索引名刪除次索引
Drop index (airline_cd) on table_name 利用次索引定義刪除此索引
31.向表中插入數據
Insert into table_name (flight_dt,airline_cd,rpt,ask,rev) values (‘20141125’, ‘CA’, 0.57, 0.87, 9999 )
Insert into table_name values (‘20141125’, ‘CA’, 0.57, 0.87)
Insert into table_name_1(flight_dt,airline_cd)
select * from table_name_2
Insert into table_name_1
select * from table_name_2
32.更新數據
Update table_name set flight=’20141125’,airline_cd=’CA’ Where sum_dt=’20141023’
33.數據刪除
Delete from table_name where flight_dt=’20141125’
34.交易完整性
Teradata系統保持交易的完整,在缺省模式下,以分號結束的每個SQL語句都是一個完整的交易;也可以用BT和ET 顯示的定義一個交易。
Select * from table_name_1 ;
Select * from table_name_2 ;
表示兩個交易,一個失敗不影響另一個的執行
BT ;
Select * from table_name_1 ;
Select * from table_name_2 ;
ET ;
表示一個交易,任何一個SQL語句失敗,整個交易都會失敗,系統將主動進行恢復處理。
35. group by 與where 同時使用時,group by 只對符合where限制的記錄進行聚合。(在聚合之前,where已將不符合限制條件的記錄刪除)
在對聚合后的結果進行限制時使用 having (having是對聚合后的結果進行篩選)
Select avg(pax_nb)as pax_1 from table_name having pax_1>999
36.集合操作 (在子查詢中不能使用集合操作)
Union -------保持字段數目相同且對應字段的域兼容 . Union(自動去除重復的記錄) union all(保留重復記錄)
Intersect -----相交操作
Except 、 minus ----排它操作
37.視圖 ----- 視圖定義中不能使用 order by
Create view view_name as select * from table_name
Replace view view_name(flight_dt,rpk) as Select flight_dt , rpk from table_name group by 1
在關系數據庫中,並不是所有的視圖都是可更新的,因為有些視圖的更新不能唯一地有意義地轉換成對相應基本表的更新。
(1) 若視圖是由兩個以上基本表導出的,則此視圖不允許更新。
(2) 若視圖的字段來自字段表達式或常數,則不允許對此視圖執行INSERT和UPDATE操作,但允許執行DELETE操作。
(3) 若視圖的字段來自集函數,則此視圖不允許更新。
(4) 若視圖定義中含有GROUP BY子句,則此視圖不允許更新。
(5) 若視圖定義中含有DISTINCT短語,則此視圖不允許更新。
(6) 若視圖定義中有嵌套查詢,並且內層查詢的FROM子句中涉及的表也是導出該視圖的基本表,則此視圖不允許更新。
38. 系統日歷
系統日歷基礎表 Sys_calendar.Caldates
當前日期字段: current_date (select current_date -----2014/11/27)
包含內容:
calendar_date DATE UNIQUE (標准Teradata日期)
day_of_week BYTEINT, (1-7,星期幾,1代表星期天)
day_of_month BYTEINT, (1-31,本月中的第幾號)
day_of_year SMALLINT, (1-366,本年中的第幾天)
weekday_of_month BYTEINT, (本月中該星期幾出現的次數)
week_of_month BYTEINT, (本月中第幾周,以星期天到星期六為一周。0,表
示月的第一個不完整的周;1表示月的第一個完整的周)
week_of_year BYTEINT, (0-53) (本年中第幾周,0表示第一個不完整的周)
month_of_quarter BYTEINT, (1-3,本季度中第幾月)
month_of_year BYTEINT, (1-12,本年中第幾月)
month_of_calendar INTEGER, (1-n,本日歷中第幾月,從1900年1月起)
quarter_of_year BYTEINT, (1-4,本年中第幾季度)
quarter_of_calendar INTEGER, (本日歷中第幾季度,從1900年1月起)
year_of_calendar SMALLINT, (年份,從1900起)
39. 累計統計 csum( flight_number ,flight_dt)
以 flight_dt 對 flight_number 進行累計
在不同的航線上 按 flight_dt 對flight_number 進行累計 ,即在不同航線上進行重新累計
Select csum( flight_number ,flight_dt) from table_name group by flight_class_name_cn
40.排序函數 rank(flight_profit) ----按flight_profit 的降序進行排序,最高的flight_profit 的序號為1
在不同的航空公司上進行排序:group by 限制排序的組別
Select airline_cd , route_cd , rank(flight_profit) from table_name where flight_dt=’20141127’ group by airline_cd
------為不同的航空公司統計其航線收入排序
對rank后的結果進行條件限制: qualify
Quality 是對列表取前幾列,不看具體的值 Quality>10 是取列表中的前10個,不是取排名的前10
按降序排 rank(flight_profit ASC) 此時Quality>10 就是取列表中的前10行(即flight_profit最低的前10個)
Select rank(flight_profit) as rank_1 from table_name
where flight_dt=’20141127’ group by airline_cd
qualify rank_1>10
選擇排名在前10的數據
41.分位數 (按照order_list 進行升序排列,每條記錄處於位置分位數)
Quantile (quantile_constant , order_list)
quantile_constant ---à定義分位數大小的常量 如100—百分位數 ,4---四分位數
order_list ---à用於分割和排序的列
Quantile (quantile_constant , order_list ASC) 按照order_list的降序排列,最大的在最前面,分位數最小(為0)
Quantile (quantile_constant , order_list_1 ,order_list_2)當 兩條記錄的order_list1值一樣時,按照order_list2的值進行升序排序,然后確定相應的分位數
42.數據采樣
Select * from table_name sample 1000 -------采樣1000條數據
Select * from table_name sample 0.25 -------采樣25%的數據
43.數據導入庫
把外部數據文件保存成CSV格式的excel文件,把CSV文件再保存為txt文本文件
在庫里建立待導入數據的新表
File ---> import data
Insert into new_table_name (‘字段1’,‘字段2’,’字段3’) values(?,?,?)
44.查詢表中的重復數據
Select flight_dt, airline_cd,rpk,ask from table_name where flight_dt=’20141128’ group by 1,2,3,4 having count(*)>1
45.可變臨時表
可以使用 HELP VOLATILE TABLE 命令獲得存在於會話中的所有可變臨時表
的信息。(注意:HELP DATABASE命令不會顯示可變臨時表,因為數據字典沒有記錄可變臨時表。)
可變臨時表不能:使用存取日志、改名、使用 Multiload 或Fastload實用程序裝載
46.非唯一次索引 UNSI
非唯一次索引(NUSI)是Teradata的一種索引,非主索引,索引的列值允許不唯一。典型地,在WHERE子句中使用索引的列,將提高查詢性能。創建非唯一次索引,可以使用CREATE TABLE語法與表一起創建,也可以使用CREATE INDEX語法在建表后創建。如果索引不再需要了,可以使用DROP INDEX刪除索引。
創建了非唯一次索引,每個AMP上都建立了一個子表。子表中存儲了一些記錄,包含每個索引值和基礎表記錄的記錄號(row-id),子表中記錄按照索引值的哈稀值排序存儲。這樣,按照索引值來查找記錄非常方便,但是進行范圍搜索,索引就沒有用了。例如,使用上面的索引,查詢工作代碼為122100的雇員,索引起作用;查詢工作代碼在122000和123000之間的雇員,索引不起作用。
創建非唯一次索引:
(1) 在建表語句后面 直接加上 index(字段1名,字段2名….)
(2) 在表已經存在的情況下創建非唯一次索引
Create index (字段名) on table_name
刪除某表的非唯一次索引:
Drop index(字段名) on table_name
--------按值排序的非唯一次索引
按值排序的非唯一次索引(Value Ordered NUSI)的索引子表按數據值存儲記錄,而不是哈稀值。在按照范圍查詢時,這種索引非常有用。
(1) 在建表語句后 直接加 index(字段名) order by values(字段名)
(2) 表已存在情況下
Create index(字段名) order by values(字段名) on table_name
按值排序的非唯一次索引的列必須是:
! 單一的列
! 屬於索引定義中的列
! 數字列 – 不允許非數字列
! 長度不能大於4個字節 – INT, SMALLINT, BYTEINT, DATE, DEC是有效的。
注:雖然允許DECIMAL數據類型,但長度不能超過4個字節,不能有小數。
--------連接索引
連接索引是一種能夠提高某些類型查詢的性能的索引技術,可以包含一個或多個表中的列。連接索引被創建后,由優化器決定是否使用,用戶不能直接訪問。
連接索引的目的,是從索引子表提供數據,避免訪問基礎表。
CREATE JOIN INDEX cust_ord_ix AS
SELECT (c.cust_id, cust_name) , (order_id, order_status, order_date)
FROM customer c INNER JOIN orders o
ON c.cust_id = o.cust_id
PRIMARY INDEX (cust_id); ---------為連接索引賦予的主索引(缺省時默認第一列為主索引)
連接索引包括兩部分:固定部分(第一個括號內) 和可重復部分 (第二個括號內)。
47.外部數據加載 (數據量不大,字段較少)
(1)將外部的CSV類型的數據文件保存為文本文件 txt
------確保 Teradata assistant 可識別的分隔符為 逗號
Tools---Options---Export/Import Data ----選擇逗號
(2)先建立待導入數據的空表----Import Data -----加載語句
Insert into ptest.corp_name (sort_num,corp_name) values (?,?) ;
48. partition by order by
rank() over (partition by calss order by age )
(按照分組字段對記錄進行排序) 先按照班級分組,然后在每個班級中按照age排序
row_number() over (partition by class order by age )
(按照分組字段對記錄進行排序) 先按照班級分組,然后在每個班級中按照age排序
sum() over (partition by calss order by score )
(按照分組字段對記錄進行聚合) 先按照班級分組,然后對分數求sum
49.Explain (select ……) 返回一個SQL經過優化處理后的執行步驟,只是執行的步驟,並未真正的執行
explain(select airline_cd , dep_airport_cd,arr_airport_cd,sum(pax_num) AS PAX ,sum( gross_pax_rev )
AS REV from PMART.APP_OTH_AIR_BILL
where substr(summ_dt,1,4)='2013' and airline_cd='UA' group by 1,2,3 ORDER BY 2,3)
1) First, we lock a distinct PMART."pseudo table" for read on a
RowHash to prevent global deadlock for PMART.APP_OTH_AIR_BILL.
2) Next, we lock PMART.APP_OTH_AIR_BILL for read.
3) We do an all-AMPs SUM step to aggregate from
PMART.APP_OTH_AIR_BILL by way of an all-rows scan with a condition
of ("(PMART.APP_OTH_AIR_BILL.Airline_Cd = 'UA') AND
((SUBSTR(PMART.APP_OTH_AIR_BILL.summ_dt ,1 ,4 ))= '2013')")
, grouping by field1 ( PMART.APP_OTH_AIR_BILL.Airline_Cd
,PMART.APP_OTH_AIR_BILL.DEP_AIRPORT_CD
,PMART.APP_OTH_AIR_BILL.ARR_AIRPORT_CD). Aggregate Intermediate
Results are computed globally, then placed in Spool 3. The size
of Spool 3 is estimated with no confidence to be 283,494 rows (
12,757,230 bytes). The estimated time for this step is 0.11
seconds.
4) We do an all-AMPs RETRIEVE step from Spool 3 (Last Use) by way of
an all-rows scan into Spool 1 (group_amps), which is built locally
on the AMPs. Then we do a SORT to order Spool 1 by the sort key
in spool field1 (PMART.APP_OTH_AIR_BILL.DEP_AIRPORT_CD,
PMART.APP_OTH_AIR_BILL.ARR_AIRPORT_CD). The size of Spool 1 is
estimated with no confidence to be 283,494 rows (14,741,688 bytes).
The estimated time for this step is 0.03 seconds.
5) Finally, we send out an END TRANSACTION step to all AMPs involved
in processing the request.
-> The contents of Spool 1 are sent back to the user as the result of
statement 1. The total estimated time is 0.14 seconds.