此博客内容简介及目录html
http://www.cnblogs.com/weibaar/p/6644261.htmlsql
最近在TERADATA环境学习SQL。在这里记录一下学习中查过的知识点,做为备案。数据库
目录:oracle
一、关于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。如下代码均以此为实例改写。下图为两个表概览
二、表联合
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
能够批量看有哪些字段