此博客內容簡介及目錄
http://www.cnblogs.com/weibaar/p/6644261.html
最近在TERADATA環境學習SQL。在這里記錄一下學習中查過的知識點,作為備案。
目錄:
- 關於SQL學習及所用在線數據庫
- 表聯合 (join)
- SQL子查詢
- 在select時創建新字段 (as, case when)
- 數據分組 (group by + 聚合函數count, sum, avg等)
- 利用over (partition by)進行數據分組並創建新字段
- 樣本選擇
1、關於SQL學習及所用在線數據庫
之前有看過一些SQL學習的書。但如果從學習效率來說,跟着書學習SQL,不如直接看生產環境的工作代碼,遇到語句不懂時搜索引擎查找相應語句,效率會更高(例如本文就是此類的集中體現)。
當然,除了零星的知識點以外,網上還存在一些在線練習SQL取數的網站,在這里列舉如下:
1)基礎SQL測試: http://www.w3school.com.cn/quiz/quiz.asp?quiz=sql
2)基本語法練習-CodeCamdy: https://www.codecademy.com/zh/learn/learn-sql
3)在線直連數據庫練習 http://www.sqlcourse.com
https://livesql.oracle.com/apex/livesql/file/index.html
當然,我們也可以去下一些基礎練習數據庫,安裝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。以下代碼均以此為實例改寫。下圖為兩個表概覽
2、表聯合
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
3、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++等代碼編輯器里,看到具體查詢嵌套關系,再一層一層反推取數邏輯。
4、在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
5、數據分組並統計
一般數據分組用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
6、利用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
7、數據分組並篩選: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
8、數據分組並排序並篩選選出最近一批的數據
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
可以批量看有哪些字段