ORACLE数据库sql语言、函数及常用命令444(4)

2019-02-15 22:03

where exists(select *

from d_sj where sjbh='12345678' and dfjsdbh=a.dfjsd);

update d_dfjsd a set yjje=yjje -5

where dfjsdbh in (select dfjsdbh from d_sj where sjbh='12345678’); 特殊提醒,省略引号

select * from student where bh=’12120’ (bh varchar2) //Select * from student where bh=12120 (不能使用索引)

但是,使用省略将不能够使用索引,因此建议大家不要使用省略情况,特别注意在动态形成sql的时候

注意:使用索引的原则为两列比一列好,即一般情况下对某个表的查询不会只查一列,为了加快访问速度,经常查到哪列就把那列建为索引。

二十二、 From 表的顺序和查询速度相关 如果两个表都存在sno索引。

Select * FROM SC, STUDENT s where sc.sno=s.sno 首先检索student所有记录,然后在sc中使用索引 Select * FROM STUDENT s ,sc where sc.sno=s.sno 首先检索sc所有记录,然后在student中使用索引

如果student相比sc数据量大得多,则后面一条语句相比前面那一条速度更快。 也就是,如果两个表进行关联,尽量将数据量少的放在from最后面。

二十三、 关于运行速度参考时间

普通微机作为数据库服务器,table20(20万),table60 (60万,bh为主键),下面语句运行时间可以作为参考: Update table20 set dddd=(select dddd from table60 where table20.bh=bh) ; 运行时间为:100秒. Select ssny,sum(ysfs),count(*) from table20 where ……非索引条件 group by ssny:10秒

Select count(*) from table20 where exists(select ‘’ from table60 where table1.bh=bh and ……) :10秒

如果一个查询语句或者update数据超过20万左右情况下,如果运行时间超过了1分钟,就可能没有使用索引,因此存在优化的可能。 特别注意:如果一个语句不能够使用索引,这句话的操作时间会随着数据量的增加不断变慢,最后达到无法忍受的情况,还是要进行修改优化。特别是pshis历史表相关的查询,速度优化问题必须解决。

二十四、子查询作为select显示数据时的要求 Select sno,c,

(select max(name) from student where sno=sc.sno) name from sc ;

特别介绍报表统计查询语句建议书写格式: T(bh,mc) T1(bh,je11,je12) T2(bh,je21,je22)

1、如果输出内容中T1、t2两个表都需要统计1列以上,且来自同一个表列的统计条件一样。 例如:Bh,mc,sum(je11),sum(je12),sum(je21),sum(je22)

建议格式1:方便阅读,效率低一些。如果一个表统计的数据不超过两三个列建议采用这个格式。 Select c.bh,c.mc ,

(select sum(je11) from t1 where c.bh=bh) je11, (select sum(je12) from t1 where c.bh=bh) je12, (select sum(je21) from t2 where c.bh=bh) je21, (select sum(je22) from t2 where c.bh=bh) je22 from t c

16

建议格式2:不易读,但是速度快,如果一个表的列超过3个以上,建议采用这个格式 Select t.bh,t.mc,je11,je12, je21, je22 from t ,

(select bh,sum(je11) je11,sum(je12) je12 from t1 where …… group by bh) a, (select bh, sum(je21) je21, sum(je22) je22 from t2 where …… group by bh) b Where t.bh = a.bh and t.bh=b.bh

2、如果输出内容中T1表需要统计1列以上且条件一样,t2只有一列。 例如:Bh,sum(je11),sum(je12),sum(je21) 建议格式:

Select bh,sum(je11),sum(je12),(select sum(je21) from t2 where t1.bh=bh) from t1 group by bh 这里需要说明:假设t1输出的行包含t2所有输出行

3、如果输出内容中来自几个表一个列或者同一个表的不同条件。 例如:Bh,sum(je11)条件1,sum(je12)条件2,sum(je21),sum(je31) 建议格式: Select bh,mc,

(select sum(je11) from t1 where t.bh=bh and 条件1 ), (select sum(je12) from t1 where t.bh=bh and 条件2), (select sum(je21) from t2 where t.bh=bh and 条件3), (select sum(je31) from t3 where t.bh=bh and 条件4) from t

二十五、 插入数据INSERT:

格式:INSERT INTO 表名 [(列名,列名,列名)] VALUES(数据,数据,数据); 例如:1.INSERT INTO STUDENT VALUES(01,’JOHN’,10,23);

2.INSERT INTO STUDENT (SNO,SNAME) VALUES(001,’李’); 格式:INSERT INTO 表名 [(列名,列名,列名)]

SELECT列名,列名,列名 FROM …… where ……; 例如:INSERT INTO STUDENT

SELECT * FROM STUDENT1;

// 将表STUDENT1中的数据导入表STUDENT中 INSERT INTO STUDENT

SELECT * FROM USER001.STUDENT;

//将USER001用户下的表STUDENT中的数据导入当前用户下的表STUDENT中 二十六、 修改数据UPDATE:

格式: UPDATE 表名 (只允许一个表)

SET列名= 数据,

列名= 数据, 列名= 数据, 列名= 数据

WHERE ……;

例如: 1.UPDATE COURSE SET COURSE=COURSE+10;

//使所有人的成绩加10

2.update sc set course=course+10

where exists

(select * from student where sage>20 and sc.sno=sno); //将年龄大于20的成绩加上10

17

二十七、 利用表连接修改数据UPDATE: 格式:UPDATE 表名

SET(列名,列名,列名)

=(SELECT 列名,列名,列名 FROM 表名 WHERE……这条语句只能返回一行数据或者不返回(不返回时对应列赋空值),可以通过集合函数变为一行数据,这需要你保证逻辑上合理)

WHERE ……; student:

sno sname course 01 john 1 02 cathy 3 03 cave 1 sc:

sno cname course 01 pascal 10 01 c 20 02 pascal 30

例如1:UPDATE STUDENT

SET (COURSE)=

(SELECT SUM(COURSE) FROM SC WHERE STUDENT.SNO=SNO);

//将表STUDENT中的COURSE字段的值改为:表SC中此学号的成绩之和 结果:student: sno sname course 01 john 30 02 cathy 30

例如2:UPDATE STUDENT

SET (COURSE)=

(SELECT SUM(COURSE)+student.course FROM SC WHERE STUDENT.SNO=SNO);

// 将表STUDENT中的COURSE字段的值改为:表SC中此学号的成绩之和 结果:student: sno sname course 01 john 31 02 cathy 33

例如3:UPDATE STUDENT

SET (COURSE)=

(SELECT SUM(COURSE)+student.course FROM SC WHERE STUDENT.SNO=SNO)

Where exists (SELECT COURSE

FROM SC WHERE STUDENT.SNO=SNO);

//将表STUDENT中的COURSE字段的值改为:表SC中此学号的成绩之和 结果:student: sno sname course 01 john 31 02 cathy 33

特别注意:主句的where是用来限制修改那几行,而子句的where是用来限制如何找到数据。 这两个where绝对不能够相互替代,但是往往被大家弄混,而省略了主句的where。

18

二十八、 验证update正确定的方法

Update t1 Set v1=(select v2 from t2 where ……) Where ……

可以通过下面语句显示要修改的数据前后值:

Select 主句条件中出现的列,主句条件中的子句出现的主表的列,子句条件中出现的主表的列,

v1, (select v2 from t2 where ……) From t1 where ……; 例如:update语句 update student set course=

(select course+student.course from sc where student.sno=sno and sc.cname=’c’)

where exists(select course from sc

where student.sno=sno and sc.name=’c’) and sex=’f’; 则相应的验证UPDATE的方法为: select sno, course,

(select course+student.course from sc where student.sno=sno and sc.cname=’c’), (select sc.cname from sc where student.sno=sno and sc.cname = ’c’), sex

from student

where exists (select course from sc

where student.sno=sno ) and sex=’f’;

二十九、 同一个表中数据替换的例子 Person

Son_no son_name father_no father_name 1 张三 3 无父亲 2 李四 无父亲 3 王五 无父亲 4 姚六 无父亲 5 赵七 无父亲 UPDATE PERSON A SET FATHER_NAME=

(SELECT SON_NAME FROM PERSON WHERE A.FATHER_NO=SON)

WHERE EXISTS(SELECT ‘’ FROM PERSON WHERE A.FATHER=SON)

//将有父亲的人的父亲名字添上。 如果存在下面的情况 Person

Son_no son_name father_no father_name 1 张三 3 无父亲 2 李四 无父亲 3 王五 5 无父亲 4 姚六 无父亲 5 赵七 无父亲 5 赵七 无父亲

19

//上面语句将会出现错误---返回多行数据 需要修改为

UPDATE PERSON A SET FATHER_NAME=

(SELECT max(SON_NAME) FROM PERSON WHERE A.FATHER_NO=SON)

WHERE EXISTS(SELECT ‘’ FROM PERSON WHERE A.FATHER=SON)

注意:为了方便理解上述问题,可以将一个表写成两个,然后这个问题就容易理解了。这也是别名的一个用法。 三十、删除数据DELETE

格式:DELETE FROM 表名 [WHERE ……];

例如:1。DELETE FROM STUDENT;//删除表中所有的数据

2.DELETE FROM STUDENT WHERE SSEX=’女’;// 删除表STUDENT中性别为”女”的记录

操作步骤:

1.Create table a_tmp_course as select * from course;

2.利用Select 条件相关的列 where ;验证是否是想要删除的数据

3.如果上面是你想删除的数据行,将select改为delete,然后执行DELETE;

三十一、 提交生效COMMIT;

PB中的COMMIT格式: Commit;

COMMIT USING SQLCA; COMMIT WORK;

三十二、 回滚作废ROLLBACK;

PB中的ROLLBACK格式: Rollback;

ROLLBACK USING SQLCA; ROLLBACK WORK;

三十三、 Sql的递归用法

格式:Select * from …. Where [结果过滤条件语句]

Start with [and起始条件过滤语句]

Connect by prior [and中间记录过滤条件语句]

例:

Parent child

a b a c b d b e c f

select * from parent start with parent='a'

connect by prior child=parent;//??不对好像 parent=child 显示结果

a b b d b e a c

20


ORACLE数据库sql语言、函数及常用命令444(4).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:超星泛雅文化地理答案(DOC)

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: