Oracle操纵数据综述.docx

上传人:b****2 文档编号:516008 上传时间:2023-04-29 格式:DOCX 页数:31 大小:30.86KB
下载 相关 举报
Oracle操纵数据综述.docx_第1页
第1页 / 共31页
Oracle操纵数据综述.docx_第2页
第2页 / 共31页
Oracle操纵数据综述.docx_第3页
第3页 / 共31页
Oracle操纵数据综述.docx_第4页
第4页 / 共31页
Oracle操纵数据综述.docx_第5页
第5页 / 共31页
Oracle操纵数据综述.docx_第6页
第6页 / 共31页
Oracle操纵数据综述.docx_第7页
第7页 / 共31页
Oracle操纵数据综述.docx_第8页
第8页 / 共31页
Oracle操纵数据综述.docx_第9页
第9页 / 共31页
Oracle操纵数据综述.docx_第10页
第10页 / 共31页
Oracle操纵数据综述.docx_第11页
第11页 / 共31页
Oracle操纵数据综述.docx_第12页
第12页 / 共31页
Oracle操纵数据综述.docx_第13页
第13页 / 共31页
Oracle操纵数据综述.docx_第14页
第14页 / 共31页
Oracle操纵数据综述.docx_第15页
第15页 / 共31页
Oracle操纵数据综述.docx_第16页
第16页 / 共31页
Oracle操纵数据综述.docx_第17页
第17页 / 共31页
Oracle操纵数据综述.docx_第18页
第18页 / 共31页
Oracle操纵数据综述.docx_第19页
第19页 / 共31页
Oracle操纵数据综述.docx_第20页
第20页 / 共31页
亲,该文档总共31页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

Oracle操纵数据综述.docx

《Oracle操纵数据综述.docx》由会员分享,可在线阅读,更多相关《Oracle操纵数据综述.docx(31页珍藏版)》请在冰点文库上搜索。

Oracle操纵数据综述.docx

Oracle操纵数据综述

1,表管理

(1)创建表

语句:

CREATETABLEtable_name

(field1datatype,//field:

指定列名datatype:

指定列类型

field2datatype,

(2)oracle常用数据类型

①char(size):

定长,字母占一字节,汉字占两字节,最大2000个字符。

如:

createtabletest1(namechar(32))//在name列,最多只能放32个字符,如果超过会报错,如果不够,则用空格补全。

②varchar2(size):

变长,最大可存放4000个字符。

③nchar(size):

定长,编码方式是unicode,汉字和字母都占一个字符,最大字符2000

④nvarchar2(size):

变长,uinicode编码,最大可存放4000个字符

⑤clob:

字符型大对象,变长,最大8tb

⑥blob:

变长,最大8tb,可存放声音,图片等对象

说明:

实际应用中很少把文件存放到数据库(效率问题),当需要考虑文件安全时才放入。

⑦number(p,s):

可存放整数和小数,变长,,p表有效位,s表小数位.

保存数据范围:

-1E-130<=numbervalue<=1e126,1<=p<=38,-84<=127,保存机器数范围:

1~22bytes,

如:

number(5,2)存入的数范围在-999.99—999.99,若s位超出2,会自动四舍五入,

当s是负数时,则往左取,如number(5,-2),输入数123.45时实际存入的是100

⑧date日期类型:

用于表示时间(年/月/日/时/分/秒)

oracle添加时的默认格式是‘dd-mm-yyyy’;

(2)表修改

语句:

altertabletable_nameadd(column_namedatatype);//添加新字段

altertabletable_namemodify(column_namedatatype);//修改字段类型

altertabletable_namedropcolumncolumn_name;//删除字段

renameold_nametonew_name;//修改表名

2.oracle的crud操作:

c(create),r(retrieve/read),u(update),d(delete)

(1)添加(insert)

语句:

insertintotable(column[,column...])values(value[,value...]);

1插入的数据应与字段的数据类型相同,且要在规定范围内。

2在values中列出的数据位置必须与被加入的列的排列顺序相对应。

3字符和日期数据应包含在单引号中。

4若给表每列都添加值,可以不带列名。

(2)修改(update)

语句:

updatetable_namesetcolumn_name=表达式where条件;

1set子句指示要修改哪些列和要改成什么值,where子句指定要更新哪些行,如没有,则更新所有行。

(3)删除(delete)

语句:

deletefromtb_namewhere条件;

1如果不使用where子句,将删除表中所有数据。

2delete语句不能删除某一列的值(可使用update)。

3删除数据的几种方法比较:

a)deletefrom表名:

删除所有记录,表结构还在,写日志,可以恢复,速度慢。

步骤:

设置保存点:

savepointxx;滚回保存点:

rollbacktoxx。

b)droptable表名:

删除表的数据和结构。

c)truncatetable表名:

删除表中所有记录,表结构还在,不写日志,无法找回,速度快。

(4)查询(select)

语法:

select[distinct]*|{col1,col2...}fromtable[条件][orderby字段];

1select指定查询哪些列的数据。

2distinct可选,指显示结果时是否剔除重复数据。

3oracle语句不区分大小写,内容区分大小写。

4处理null,用nvl(字段,值a)函数,若字段不为空则返回字段值,为空则返回值a。

5使用列别名:

如selectename“姓名”,sal*12年收入fromemp;//别名可加双引号也可不加。

6连接字符串:

如selectename||’爱’||jobfromemp;//显示结果为:

ename爱job.

7%表0或多个字符,_代表一个字符,如selectename,salfromempwhereenamelike‘S%’;//表示查询以s开头员工的工资。

8where条件中使用in:

select*fromempwhereempnoin(123,345,800);

9where条件中使用between..and...:

select*fromempwheresalbetween2000and2500;

10isnull使用:

判断一数值是否为空时不能直接等于null.

如select*fromempwheremgrisnull;

11使用逻辑运算符:

or和and.

如select*fromempwhere(sal>500orjob=’MANAGER’)and(enamelike‘J%’);

12orderby(排序)使用:

排列方式有降序(desc)和升序(acs),默认是acs。

如select*fromemporderbysal[asc/desc];//没写排序方式,则默认升序排列。

注:

orderby后面跟数字时,表示按第几个字段排序,所跟数不能超出列数。

13使用列的别名排序:

selectename,sal*12年薪fromemporderby年薪;

14分页查询

3.oracle表复杂查询

(1)数据分组

①常用函数max,min,avg,sum,count。

max取最大值,min取最小值,avg取平均值,sum取和,count统计数量。

count(*)返回的是所有数据条数量,count(字段)返回有值的数据条数量。

2groupby...having使用:

按条件将数据分组

如:

selectavg(sal)deptnofromempgroupbydeptno,joborderbydeptno;//得到每个部门每个工作的平均工资并排序。

selectavg(sal)deptnofromempgroupbydeptnohavingavg(sal)<2000;

③在选择列中如果有列、表达式和分组函数,那么这些列或表达式必须有一个出现groupby子句中。

④sql执行在默认情况下是从右到左执行。

如:

selectename,jobfromempwheresal=(selectmax(sal)fromemp);

(2)多表查询

①多表查询如果不带任何条件,则出现笛卡尔集,多表查询得条件至少不能少于表的个数-1.

如:

selectemp.ename,emp.sal,dept.dnamefromemp,deptwhereemp.deptno=dept.deptno;

②多表查询时,如果两表的列同名,则需加表名区分。

③自连接:

在同一张表的连接查询,将一张表当成两张表看。

如:

selectw.ename,b.enamefromempw,empbwherew.mgr=b.empno(+);

(3)子查询:

是指嵌入在其它sql语句中的select语句,也叫嵌套查询。

①单行子查询:

只返回一行数据的子查询语句。

如select*fromempwheredeptno=(selectdeptnofromempwhereename=’SMITH’)andename!

=’SMITH’;//子句只返回一个数据;

②多行子查询:

返回多行数据的子查询。

如select*fromempwherejobin(selectdistinctjobfromempwheredeptno=10);

all的使用:

select*fromempwheresal>all(selectsalfromempwheredeptno=30);

any的使用:

select*fromempwheresal>any(selectsalfromempwheredeptno=30);

③多列子查询:

子查询中返回多列。

如:

select*fromempwhere(deptno,job)=(selectdeptno,jobfromempwhereename=’SMITH’);

④from子句中使用子查询:

将查询结果当做一个临时表对待。

如selectt1.*fromempt1,(selectavg(sal)myavg,deptnofromempgroupbydeptno)t2wheret1.deptno=t2.deptnoandt1.sal>t2.myavg;//显示高于自己部门平均工资的员工信息。

(3)分页查询

①各数据库分页查询语句:

如演示取出数据5到12数据。

mysql:

select*fromuserslimit5,8;

sqlserver:

selecttop8*fromuserswhereidnotin(selecttop4idfromusers);

oracle:

selectt2.*from(selectt1.*,rownumrmfrom(select*fromemp)t1whererownum<=12)t2wheret2.rm>=5;//t1是第一层过滤语句得到数据的结果集,t2是第二层过滤得到前12条数据,第三层过滤后得到5到12的8条数据。

②测试分页查询效率

快速建表(从emp表中复制数据):

createtablemytestasempno,enamefromemp;

自我复制(快捷形成海量数据表):

insertintomytest(empno,ename)selectempno,enamefrommytest;

(4)合并查询

①union:

用于取得两个结果集的并集,会自动去掉结果集中重复行,并自动排序。

②unionall:

与union相似,但不会取消重复行,且不会排序。

③intersect:

取两结果的交集。

④minus:

取两结果的差集,即并集与交集的差。

(5)使用子查询完成迁移的需求

如createtabletemp#asselectempno,enamefromempwhereenamelike‘S%’;

(6)使用子查询完成更新

如updateempset(job,sal,comm)=(selectjob,sal,commfromempwhereename=’SMITH’)whereename=’SCOTT’;//把scott的工作,工资,补助改成更smith一样

4.oracle表的内连接和外连接

(1)内连接:

就是利用where子句对两张表形成的笛卡尔集筛选,只显示匹配的数据。

如selectemp.ename,dept.dnamefromemp,deptwhereemp.deptno=dept..deptno;

等价于selectemp.ename,dept.dnamefromempinnerjoindeptonemp.deptno=dept.deptno;

(2)外连接

①左外连接:

左侧表完全显示,右侧表显示匹配数据。

如selectd.deptno,d.dname,e.enamefromdeptdleftjoinempeond.deptno=e.deptno;//此时会把没人的40部门也显示出来。

其他写法:

selectd.deptno,d.dname,e.enamefromdeptddeft,empewhered.deptno=e.deptno(+);

3右外连接:

右侧表完全显示,左侧显示匹配数据。

如selectd.deptno,d.dname,e.enamefromemperightjoindeptdond.deptno=e.deptno;

selectd.deptno,d.dname,e.enamefromempe,deptdwhered.deptno(+)=e.deptno;

③完全外连接:

完全显示两个表,没有匹配的记录置为空。

如selectd.deptno,d.dname,e.enamefromdeptdouterjoinempeond.deptno=e.deptno;

5.维护数据的完整性

定义:

数据完整性可以使用约束,触发器,应用程序(过程,函数)三种方法来实现,约束是维护数据完整性的首选

(1)约束:

用于确保数据库数据满足特定的商业规则

a)notnull(非空)

i.用于指定某列值不能为空

b)unique(唯一)

i.指定列值不能重复,但是可以为null

c)primarykey(主键)

i.用于唯一的标示表行的数据,指定列不但不能重复,而且不能为null

ii.一张表可以有多个unique,但最多只能有一个主键

d)foreignkey(外键)

i.用于定义主表和从表之间的关系

ii.外键约束要定义在从表上,主表则必须具有主键约束或是unique约束

iii.要求外键列数据必须在主表的主键列存在或是为null

e)check(约束)

i.用于强制数据必须满足的条件

(2)用法举例

createtablegoods(

goodsIdnumberprimarykey,--设置主键

goodsNamevarchar2(36)notnull,--商品名字不能为空

unitpricenumbercheck(unitprice>0),--单价要大于0

categoryvarchar2(64)check(categoryin('食物','日用品')),

createtablecustomer(

customerIdnumberprimarykey,

cusNamevarchar2(32)notnull,

emailvarchar2(64)unique),--电邮不能重复

sexchar

(2)default'男'check(sexin('男','女')),--性别只能选男或女,默认是男

createtablepurchase(

customerIdnumberreferencescustomer(customerId),

goodsIdnumberreferencesgoods(goodsId),

numsnumbercheck(nums>0)

(3)表约束修改

a)修改语句:

altertable表名modify字段约束;

b)添加语句:

altertable表名addconstraintxxx约束(字段)

(4)删除约束

a)语句:

altertable表名dropconstraintxxx(字段);

b)当两张表存在主从关系时,那么删除主表的主键约束时,必须带上cascade,如altertable表名dropprimarykeycascade;

(5)列级定义和表级定义

a)列级定义:

列级定义是在定义列的同时定义约束

b)表级定义时指在定义了所有列后,再定义约束,需要注意的是:

notnull约束只能在列级定义

c)一般情况下使用列级定义即可,但当含复合主键时要用表级定义

(6)序列(sequence):

用于处理自动增长列

a)可以为表中的列自动产生值,一般用于主键或唯一列

b)由用户创建数据库对象,并可由多个用户共享

c)案例说明:

创建一个序列

i.createsequencemyseq--创建序列名

ii.startwith1--从1开始

iii.incrementby1--每次增长1

iv.maxvalue9999//NOMAXVALUE--设置最大值9999//不设最大值

v.minvalue1--最小值

vi.cycle//NOCYCLE--循环//一直累加,不循环

vii.nocache;--缓存

viii.创建后在表中使用:

createtabletest1(idnumberprimarykey,namevarchar2(32));

insertintotest1values(myseq.nextval,’tang’)

可用myseq.currval返回当前的序列值,必须在调用了次nextval后才可用

用myseq.nextval增加序列值,然后返回

6.索引

(1)单列索引:

基于单个别所建立的索引

语法:

createindexindex_nameontable(columnname);

(2)复合索引:

基于两列或是多列的索引。

在同一张表上可以有多个索引,但要求列的组合必须不同。

语法:

createindexindex_nameontable(col_name,col_name);

注:

①在大表上建立索引才有意义

②在where子句或是连接条件上经常引用的列上建立索引

③索引的层次不要超过4层

④在逻辑类型字段上,或者值就固定几种的列上也不索引

(3)索引的缺点:

a)建立索引,系统要占用大约为表的1.2倍的硬盘和内存空间来保存索引

b)更新数据的时候,系统必须要又额外的时间来同时对索引更新,一维持数据和索引的一致性。

7.oracle的pl/sql编程

(1)概念

pl/sql是在标准sql语句基础上扩展的一种对oracle数据库进行编程的语句。

可以定义常量和变量,而且可以使用条件语句和循环语句。

(2)pl/sql编程优点

a)提高应用程序的运行性能

b)模块化的设计思想[分页的过程,订单的过程,转账的过程...]

c)减少网络传输量

d)提高安全性

(3)缺点是移植性不好

(4)案例解析:

①创建一简单的存储过程,可以完成向某表添加一条记录

createprocedurepro1(in_empnonumber,in_enamevarchar(16))is

begininsertintoemp(empno,ename)values(in_empno,in_ename);

end;/

②调用存储过程

execpro1(3333,’juan’);

(5)pl/sql作用

pl/sql可以开发过程、函数、包(包体)、触发器。

他们的基础编程单元是块

(7)编写规范

a)注释:

单行注释--;多行注释/*...*/

b)标识符号的命名规范

i.定义变量时,建议用v_作为前缀如v_sal

ii.定义常量时,建议用c_作为前缀如c_rate

iii.当定义游标时,建议用_cursor作为后缀如emp_cursor

iv.当定义例外时,建议用e_作为前缀如e_error

(8)pl/sql块结构

a)pl/sql块由三部分构成:

i.declare//定义部分---定义常量、变量、游标、例外、复杂数据类型

ii.begin//执行部分---要执行的pl/sql语句

iii.exception//例外不理部分---处理运行的各种错误

iv.end;//declare和exception部分是可选的,begin是必须的

b)案例解析

i.declare

1.v_enamevarchar2(16);--格式:

变量名变量的类型

ii.begin

1.selectenameintov_enameformempwhereempno=&empno;---把ename值放入变量,&表示要接收从控制台输入的变量

2.dbms_output.put_line(‘雇员名是’||v_ename);--输出v_ename

3.exception---异常处理语法:

when异常名称then

4.whenno_data_foundthendbms_output.put_line(‘未找到该编号的雇员’);

5.end;/

注:

在默认情况下,结果不输出,需要设置setserveroutputon

no_data_found异常要在含select...into的语句下才可捕获

块执行完就消失,所以应融入过程中

案例解析2:

createprocedurepro2(in_empnonumber)is

v_enamevarchar2(8);

begin

selectenameintov_enamefromempwhereempno=in_empno;

dbms_output.put_line(‘雇员名是’||v_ename);---||表示把两个字符串拼接

end;

(9)过程详解

a)oracle过程,可以指定参数是输入的参数,还有输出的参数

b)基本语法:

createprocedure过程名(变量名in变量类型...变量名out变量类型)is...

c)调用过程方法:

①exec过程名(参数值)②call过程名(参数值)

d)案例解析:

i.createorreplaceprocedurepro3(in_enameinvarchar2,in_new_salinnumber)is---加orreplace时,当方案中已存在pro3时会字段替换

ii.begin

iii.updateempsetsal=in_new_salwhereename=in_ename;

iv.end;/

e)当出现错误时,可以输入showerror来显示具体错误

8.pl/sql基础知识

(1)函数:

用于返回特定的数据,在头部必须包含return子句,在函数体内必须包含return语句返回的数据。

(2)案例分析:

a)

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2