1. 程式人生 > >teradata sql學習筆記

teradata sql學習筆記

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.