SQL-Teradata基礎


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.

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM