TERADATA SQL學習隨筆<一>

此博客內容簡介及目錄html

http://www.cnblogs.com/weibaar/p/6644261.htmlsql

 

最近在TERADATA環境學習SQL。在這裏記錄一下學習中查過的知識點,做爲備案。數據庫

目錄:oracle

  1. 關於SQL學習及所用在線數據庫
  2. 表聯合 (join)
  3. SQL子查詢
  4. 在select時建立新字段 (as, case when)
  5. 數據分組 (group by + 聚合函數count, sum, avg等)
  6. 利用over (partition by)進行數據分組並建立新字段
  7. 樣本選擇

 

一、關於SQL學習及所用在線數據庫編輯器

以前有看過一些SQL學習的書。但若是從學習效率來講,跟着書學習SQL,不如直接看生產環境的工做代碼,遇到語句不懂時搜索引擎查找相應語句,效率會更高(例如本文就是此類的集中體現)。函數

固然,除了零星的知識點之外,網上還存在一些在線練習SQL取數的網站,在這裏列舉以下:學習

1)基礎SQL測試: http://www.w3school.com.cn/quiz/quiz.asp?quiz=sql 測試

           http://sqlzoo.net/優化

2)基本語法練習-CodeCamdy: https://www.codecademy.com/zh/learn/learn-sql網站

3)在線直連數據庫練習 http://www.sqlcourse.com

           https://livesql.oracle.com/apex/livesql/file/index.html

           http://www.sql-ex.ru/

固然,咱們也能夠去下一些基礎練習數據庫,安裝mySql等進行練習。不過通常入門,學語法比學怎麼裝數據庫更重要。見仁見智吧。

另外,相比於簡單易懂的SQL語法學習,如何優化SQL語句效率,如何理解數據庫結構等等更加劇要。這也是下一步我學習的重點。 具體參考這個連接 https://www.zhihu.com/question/20116482

 

那麼接下來,我選用oracle數據庫來練習最近查閱的知識點。

在這個網站註冊 https://livesql.oracle.com/apex/livesql/file/index.html 後,在code library選擇【EMP and DEPT 】數據源導入,會在咱們本身帳戶裏建立如下表: dept, emp。如下代碼均以此爲實例改寫。下圖爲兩個表概覽

 

二、表聯合

select job,loc,dname from emp, dept where emp.deptno=dept.deptno

select job,loc,dname from emp join dept on dept.deptno = emp.deptno

 如上,上面兩個表都是用deptno聯合的,但一個是選擇了全部表,再篩選,另外一個是作一個join

最經常使用的仍是join

 

三、SQL的子查詢

select  loc, dname from
 (select job,loc,dname from emp 
        join dept on dept.deptno = emp.deptno
        where loc = 'DALLAS' OR loc = 'New York'    )

查詢套查詢,在實際工做環境中挺常見的。不是很難,就是用()把子查詢括起來。

能夠把代碼拷貝到如notepad++等代碼編輯器裏,看到具體查詢嵌套關係,再一層一層反推取數邏輯。

 

四、在select裏建立新字段

select建立新字段,能夠直接用...as 建立字段

select ename, loc, 'DALLAS & NY' as city from emp 
        join dept on dept.deptno = emp.deptno
        where loc = 'DALLAS' OR loc = 'New York'

同理,也能夠用case when建立有條件判斷的字段,只須要加上括號便可。這個貌似還挺常見的

select ename, job, 
(case when sal >2000 then 'high'
                        when sal <1000 then 'low'
                        else 'middle'
                    End) as salary_level
    from emp

固然,case when還能夠用於分組統計時建立字段,與group by聯合使用。

---按job統計薪水大於1500的有多少人
select job, 
sum(case when sal >1500 then 1
                        
                        else 0
                    End) as salary_gt1500,
count(*) as people_vol
    from emp
    group by job

如要具體瞭解case when其餘用法,還可再查看如下博文:

http://blog.sina.com.cn/s/blog_4c538f6c01012mzt.html

http://www.cnblogs.com/cyrix/articles/1750184.html

 

五、數據分組並統計

通常數據分組用group by分組,基本與聚合函數配合使用。

原則是select後面的全部列,若是沒有用聚合函數,那麼必須在group by裏重寫一遍。

舉例以下面兩段代碼,第一段會報錯

---錯誤:使用聚合函數count但沒有group by,或只group by一列
select mgr, job, count(*) as people_vol from emp
group by mgr
---正確:group by後引用完整列
select mgr, job, count(*) as people_vol from emp
group by mgr, job

具體可參閱如下博文: http://www.cnblogs.com/gaiyang/archive/2011/04/01/2002452.html

 

六、利用over (partition by)分組並算相應值

以前的group by主要用於分組統計,而如sum, count等則是與group by組合輸出同組的一行數據。

若是咱們要對每一行數據都輸出統計量,咱們能夠用over (partition by)進行分組並輸出。

這個能夠用於:分組排序,或分組聚合等等。

舉例可看如下代碼

---按job分組並給每一個emp排序
select job, ename, sal,
row_number() over (Partition by job order by sal desc) as ranking
from emp
---分組並按job求各組平均值
select job, ename, sal,
avg(sal) over (Partition by job) as average_salary
from emp

具體用法,建議參閱如下博客:

http://www.cnblogs.com/lanzi/archive/2010/10/26/1861338.html

http://www.cnblogs.com/fxgachiever/archive/2010/09/15/1826792.html

 

七、數據分組並篩選:where與having

用where進行數據篩選在SQL裏最多見。其工做環境中,主要嵌套子查詢、或者多條件(and or聯合)使用。注意結構就能夠。

另外還有一種數據篩選是在分組之後進行,即group by .... having.... 之因此引用having,是由於where語句沒法對聚合函數進行篩選

典型示例以下:

SELECT A COUNT(B) FROM TABLE GROUP BY A HAVING COUNT(B)>2

where 子句的做用是在對查詢結果進行分組前,將不符合where條件的行去掉,即在分組以前過濾數據,條件中不能包含聚組函數,使用where條件顯示特定的行

having 子句的做用是篩選知足條件的組,即在分組以後過濾數據條件中常常包含聚組函數,使用having 條件顯示特定的組,也可使用多個分組標準進行分組。

——引用自 http://www.cnblogs.com/gaiyang/archive/2011/04/01/2002452.html

咱們能夠用如下示例嘗試

---按mgr, job分組,並選出職工數>1的組 
---(因爲select是sql運行最後一步,比group by晚執行。因此having裏不能直接用empl_vol)
select mgr, job, count(*) as empl_vol from emp group by mgr, job having count(*) > 1

 

八、數據分組並排序並篩選選出最近一批的數據

 

Group BY XXXX HAVING
SUM(filteraaa) > 3 QUALIFY RANK () OVER(PARTITION BY aa_ID ORDER BY MONTH_ID) =1;

 

Qualify rank 優化。報表執行順序,確保每一步過濾掉足夠多的信息

 

http://blog.sina.com.cn/s/blog_4d281a0301016jw2.html

 

http://community.teradata.com/t5/Database/qualify-rank-over-partition-question/td-p/47965

 

http://blog.sina.com.cn/s/blog_62d120530101h7vi.html

 

關於QUALIFY RANK() over組合應用

 

查閱搜索引擎發現,qualify rank() over用法彷佛是teradata獨特的用法之一。

相似於以前查閱的row_number() over….只不過這裏qualify …能夠直接=1=2得到首位排序帳戶

 

sql 語句執行順序

http://www.cnblogs.com/summer_adai/archive/2011/10/28/2227605.html

 

補充

show select * from TABLEAAA

能夠批量看有哪些字段

相關文章
相關標籤/搜索