• 1. Oracle Sql培训王敬明 2009-11-14
  • 2. 一、sql的基础知识 SQL(Structured Query Language,结构查询语言)是一个功能强大的数据库语言。 SQL通常使用于数据库的通讯。SQL是关系数据库管理系统的标准语言。 SQL语句通常用于完成一些数据库的操作任务,比如在数据库中更新数据,或者从数据库中检索数据。Sql培训
  • 3. 使用SQL的常见关系数据库管理系统有:Oracle、 Sybase、 Microsoft SQL Server、 Access、 MySql等等。虽然绝大多数的数据库系统使用SQL,但是它们同样有它们自立另外的专有扩展功能用于它们的系统。 标准的SQL命令,比如"Select"、 "Insert"、 "Update"、 "Delete"、 "Create"和 "Drop"常常被用于完成绝大多数数据库的操作Sql培训
  • 4. Sql被称为第五代编程语言,有着良好的语法结构,通过观察语句,可以很容易的了解其实际意义。 但是,不象其它的语言,如C、Pascal等,SQL没有循环结构(比如for、do-while),以及函数定义等等的功能。而且SQL只有一个数据类型的固定设置,换句话说,你不能在使用其它编程语言的时候创建你自己的数据类型Sql培训
  • 5. SQL功能强大,但是概括起来,它可以分成以下几组: DML(Data Manipulation Language,数据操作语言):用于检索或者修改数据; DDL(Data Definition Language,数据定义语言): 用于定义数据的结构,比如 创建、修改或者删除数据库对象; DCL(Data Control Language,数据控制语言):用于定义数据库用户的权限。Sql培训
  • 6. DML组可以细分为以下的几个语句: SELECT,INSERT,UPDATE,DELETE DDL语句可以用于创建用户和重建数据库对象。下面是DDL命令: CREATE TABLE ,ALTER TABLE DROP TABLE ,CREATE INDEX … DCL命令用于创建关系用户访问以及授权的对象。下面是几个DCL命令: GRANT ,REVOKESql培训
  • 7. Sql培训二、pl/sql的主要扩展 PL/SQL是ORACLE对标准数据库语言的扩展,ORACLE公司已经将PL/SQL整合到ORACLE 服务器和其他工具中。 PL/SQL是对标准sql不足的补充。 PL/SQL作为oracle的一部分可以和容易的和oracle中的sql进行交互。它对sql的调用的简易性远胜于一般的编程语言。
  • 8. Sql培训 PL/SQL扩充了sql的功能,实现了一些高级语言中才有的过程,函数,触发器,包,自定义对象等概念。而且可以实现循环,变量定义等功能。使sql可以实现过去只能靠编程才能实现的功能,而且明显提高了效率。 同时PL/SQL还对基本的sql进行了扩展,定义了大量的分析函数和特殊语法,简化了过去一些复杂sql的编写,甚至使原来基本无法用sql实现的逻辑也可以很简单的通过一句sql实现。
  • 9. Sql培训 三、常见的sql命令的使用 i.select Select的功能是从数据库的表中提取数据。 Select语句是sql中涉及到的知识点最多也最富变化的一个语句。 基本的select语句 select col1,col2 .. from table1 , table2 where 连接 + 条件 order by … 一些技巧可能会提高效率:如表的连接顺序,变量绑定等。
  • 10. Sql培训 1.1sql的嵌套 两种方式 1.select a.*,b.dwmc from ( select * from ys_dba01 where rq=? and dwdm=? ) a,ys_daa01 b where a.jh=b.jh 2.select a.*, (select dwmc from ys_daa01 where jh=a.jh)dwmc from ys_dba01 a Where rq=? and dwdm=?
  • 11. Sql培训 1.2一些常用的语法 标准sql关键字 not,and, or, between and,>,<,>=,<=,<>,!=, in,is null,is not null,exists,nvl 日期函数 to_char,to_date,sysdate,trunc,round,last_day,month_between,add_months,+,- 常见的日期格式 yyyy,mm,d,dd,ddd,hh,hh24,mi,ss,month,day,cc 字符串函数 Substr,instr,length,to_number(强制类型转换) 数字函数 Round,trunc,to_char 控制函数 Decode,case when
  • 12. Sql培训 1.3表连接 表连接是用来在进行多表查询时,指定各表之间的关系。 表连接大体分为以下几种 交叉连接,内连接和外连接 其中外连接又分为左连接,右连接和全连接 写法 select * from a cross join b交叉连接 select * from a inner join b on a.id=b.id 内连接 select * from a left outer join b on a.id=b.id 左连接 select * from a right outer join b on a.id=b.id 右连接 select * from a full outer join b on a.id=b.id 全连接 (Hash Join,sort merge join)
  • 13. Sql培训 oracle过去的写法 select * from a,b交叉连接 select * from a,b where a.id=b.id 内连接 select * from a,b where a.id=b.id(+)左连接 select * from a,b where a.id(+)=b.id右连接 oracle原先的写法不支持全连接
  • 14. Sql培训 1.4Union,union all,minus,intersect 以上的这几个语句都是用来对两个结果集进行布尔操作,即合并,取差和取交集 要求进行操作的两个结果集必须字段数量和数据类型一致(或者后面的结果集的字段类型可以强制转化为前一个结果集的数据类型)。 union需要对重复的结果集进行剔除,因此与union all相比会多一次排序和剔重的操作,因此效率会低一些。
  • 15. Sql培训 1.5 oracle的sql分组(group by) 分组函数,顾名思义就是对已有结果即进行分组后进行相应运算后得出结果。 因为要按照某一字段进行分组,因此结果记得数量一般会减少。 select dwdm,count(distinct jh),sum(rcyl1) from ys_dba01 where rq>sysdate-1 group by dwdm 分组后对选取字段的要求:只有group by后出现的字段才能够被直接查询,其他的字段必须通过汇总函数进行查询。
  • 16. Sql培训 常用的分组函数 count,sum,max,min,avg,stddev,variance等 注意,汇总函数有且只能有一个参数,除count的参数可以为*以外,其他的函数的参数必须为一个确定的字段(或字段的计算值)。 汇总函数会忽略所有的空值,这一点在count执行时最为明显,执行sum时容易被忽略,因对对sum来说忽略与否结果是一样的。 但是一定要注意avg等函数,avg求平均时,控制是不被计数的。 包括max,和min在内也会忽略空值。
  • 17. Sql培训 只有当所有的相关记录的值都为空时,汇总函数的结果才为空。 distinct的使用。Distinct可以用于剔除相同的数据。灵活运用distinct可以使sql书写更方便。
  • 18. Sql培训 group by的一些特殊写法 1.对group by的强化 cube,rollup和grouping sets select a,b,c,count(*) from table1 group by cube(a,b,c) 可以领过结合这些写法,得到任意复杂的结果集 另外可以借助函数grouping_id获得具体某一行的分组方式。 2.Having子句
  • 19. Sql培训 1.6 oracle分析函数 oracle分析函数是oracle对sql的扩展,灵活运用分析函数可以大大简化sql的编写,并且可以实现一些过去必须通过编程才能实现的功能,对使用报表工具进行开发的项目变得更加灵活。并且灵活运用分析函数还会在一定程度上提高sql的执行效率。 常用的分析函数 row_number,rank,dense_rank,lead,lag, first_value,last_value,first,last,max,min 以下举例说明
  • 20. Sql培训 1.7 oracle中的递归connect by select res_id,level lvl, lpad(‘ ’,(level-1)*4)||res_desc from u_resource connect by prior res_id=parent_d start with parent_id=0 order siblings by res_order 注意level伪列的使用 另外oracle10g中增加了伪列connect_by_isleaf,用于判断是不是叶子节点,并且加入了对递归循环的处理,并且可以通过伪列connect_by_iscycle来判断是否存在环。
  • 21. Sql培训 1.8 几个sql的写作技巧 1.使用decode(或case when)实现行转制列 select dwdm, count(decode(rq, trunc(sysdate-3),jh))js1, count(decode(rq, trunc(sysdate-2),jh))js2, count(decode(rq, trunc(sysdate-1),jh))js3 from ys_dba01 where rq between trunc(sysdate-3) and trunc(sysdate-1) group by dwdm 2.使用decode(或case when)实现一条sql多种条件的汇总结果 select rq, sum(case when 正常井 then 1 end)zjs, sum(case when 正常开井 then 1 end)kjs from ys_dba01,ys_daa01 where ys_dba01.jh=ys_daa01.jh and rq=? group by rq
  • 22. Sql培训ii Insert Insert是往数据库中插入记录的语句。 主要有两种写法 insert into table(col1,col2,col3…) values(val1,val2,val3…) insert into table(col1,col2,col3…) select col1,col2,col3… from table where .. 注意 1.Table后的参数列表如果不写,oracle会按照数据字典中表中字段的顺序进行排列,由于表结构可能发生变化,所以建议不要省去这部分。 2.insert语句会锁定更新的表,产生行锁或表锁,因此执行完后要及时提交或回滚,避免出现表竞争甚至死锁。
  • 23. Sql培训iii update update table set col1=val1,col2=val2,col3=val3… where … 使用update实现多行更新的写做技巧 由于oracle不支持关联后的结果集的直接更新,因此使多表之间的关联赋值编的比较复杂。 update customers a   -- 使用别名 set    (city_name,customer_type)=( select b.city_name,b.customer_type  from   tmp_cust_city b  where  b.customer_id=a.customer_id )where  exists ( select 1 from   tmp_cust_city b where  b.customer_id=a.customer_id )对表b进行了两次全表扫描
  • 24. Sql培训Merge语句的使用 merge into table_name table_alias using table on (join cnodition) when matched then update set col1 =col_val1, col2 = col_val2 when not matched then insert (column_list) values (column_values);