仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1045|回复: 8
打印 上一主题 下一主题

[学习教程] MYSQL网页设计心得共享:Oracle履历技能集锦

[复制链接]
愤怒的大鸟 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 22:43:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
你可以配置MySQL运行在微小的嵌入式应用程序中,处理的数据可能不足1Mb??而你也可以用它来处理数Tb的数据。MySQL获得这种可扩展性的路径之一是通过一个人们所熟知的存储过程,这是一个运行在程序之外的微型、预编译程序。oracle|技能|心得
1.删除表空间

DROPTABLESPACETableSpaceName[INCLUDINGCONTENTS[ANDDATAFILES]]

2.删除用户

DROPUSERUser_NameCASCADE

3.删除表的注重事项

在删除一个表中的全体数据时,须利用TRUNCATETABLE表名;由于用DROPTABLE,DELETE*FROM表名时,TABLESPACE表空间该表的占用空间并未开释,重复几回DROP,DELETE操纵后,该TABLESPACE上百兆的空间就被耗光了。



4.having子句的用法

having子句对groupby子句所断定的行组举行把持,having子句前提中只同意触及常量,聚组函数或groupby子句中的列。

5.内部连接"+"的用法

内部连接"+"按其在"="的右边或右侧分左连接和右连接.若不带"+"运算符的表中的一个行不间接婚配于带"+"预算符的表中的任何行,则前者的行与后者中的一个空行相婚配并被前往.若两者均不带’+’,则两者中没法婚配的均被前往.使用内部连接"+",能够替换效力非常低下的notin运算,年夜年夜进步运转速率.比方,上面这条命令实行起来很慢

用外连接进步表毗连的查询速率

在作表毗连(经常使用于视图)时,常利用以下办法来查询数据:

SELECTPAY_NO,PROJECT_NAME
FROMA
WHEREA.PAY_NONOTIN(SELECTPAY_
NOFROMBWHEREVALUE>=120000);

----可是若表A有10000笔记录,表B有10000笔记录,则要用失落30分钟才干查完,次要由于NOTIN要进行一条一条的对照,共必要10000*10000次对照后,才干失掉了局。该用外连接后,能够延长到1分摆布的工夫:

SELECTPAY_NO,PROJECT_NAME
FROMA,B
WHEREA.PAY_NO=B.PAY_NO(+)
ANDB.PAY_NOISNULL
ANDB.VALUE>=12000;

6.settransaction命令的用法

在实行年夜事件时,偶然oracle会报出以下的毛病:

ORA-01555:snapshottooold(rollbacksegmenttoosmall)

  这申明oracle给此事件随机分派的回滚段太小了,这时候能够为它指定一个充足年夜的回滚段,以确保这个事件的乐成实行.比方

settransactionuserollbacksegmentroll_abc;
deletefromtable_namewhere...
commit;

  回滚段roll_abc被指定给这个delete事件,commit命令则在事件停止以后作废了回滚段的指定.



7.数据库重修应注重的成绩

  在使用import举行数据库重修过程当中,有些视图大概会带来成绩,由于布局输出的按次大概形成视图的输出先于它低条理表的输出,如许创建视图就会失利.要办理这一成绩,可接纳分两步走的办法:起首输出布局,然后输出数据.命令举比方下(uesrname:jfcl,password:hfjf,hoststing:ora1,数据文件:expdata.dmp):

impjfcl/hfjf@ora1file=empdata.dmprows=N
impjfcl/hfjf@ora1file=empdata.dmpfull=Ybuffer=64000
commit=Yignore=Y

  第一条命令输出一切数据库布局,但无纪录.第二次输出布局和数据,64000字节提交一次.ignore=Y选项包管第二次输出既使工具存在的情形下也能乐成.

selecta.empnofromempawherea.empnonotin(selectempnofromemp1wherejob=’SALE’);

  倘使使用内部连接,改写命令以下:

selecta.empnofromempa,emp1b
wherea.empno=b.empno(+)
andb.empnoisnull
andb.job=’SALE’;

能够发明,运转速率分明进步.

8.从已知表新建另外一个表:

CREATETABLEb
ASSELECT*(能够是表a中的几列)
FROMa
WHEREa.column=...;

9.查找、删除反复纪录:

法一:用Groupby语句此查找很快的

selectcount(num),max(name)fromstudent--查找表中num列反复的,列出反复的纪录数,并列出他的name属性
groupbynum
havingcount(num)>1--按num分组后找出表中num列反复,即呈现次数年夜于一次
deletefromstudent(下面Select的)

如许的话就把一切反复的都删除。-----稳重

法二:当表对照年夜(比方10万条以上)时,这个办法的效力之差使人没法忍耐,必要另想举措:

----实行上面SQL语句后就能够显现一切DRAWING和DSNO不异且反复的纪录

SELECT*FROMEM5_PIPE_PREFAB
WHEREROWID!=(SELECTMAX(ROWID)FROMEM5_PIPE_PREFABD--D相称于First,Second
WHEREEM5_PIPE_PREFAB.DRAWING=D.DRAWINGAND
EM5_PIPE_PREFAB.DSNO=D.DSNO);

----实行上面SQL语句后就能够h除一切DRAWING和DSNO不异且反复的纪录

DELETEFROMEM5_PIPE_PREFAB
WHEREROWID!=(SELECTMAX(ROWID)FROMEM5_PIPE_PREFABD
WHEREEM5_PIPE_PREFAB.DRAWING=D.DRAWINGAND
EM5_PIPE_PREFAB.DSNO=D.DSNO);



10.前往表中[N,M]笔记录:


获得某列中第N年夜的行

selectcolumn_namefrom
(selecttable_name.*,dense_rank()over(orderbycolumndesc)rankfromtable_name)
whererank=&N;

 假设要前往前5笔记录:

  select*fromtablenamewhererownum<6;(或是rownum<=5或是rownum!=6)

假设要前往第5-9笔记录:

select*fromtablename
where…
andrownum<10
minus
select*fromtablename
where…
andrownum<5
orderbyname

选出了局后用name排序显现了局。(先选再排序)

注重:只能用以上标记(<、<=、!=)。

select*fromtablenamewhererownum!=10;前往的是前9笔记录。

不克不及用:>,>=,=,Between...and。因为rownum是一个老是从1入手下手的伪列,Oracle以为这类前提不建立,查不到纪录.

别的,这个办法更快:

select*from(
selectrownumr,afromyourtable
whererownum<=20
orderbyname)
wherer>10

如许掏出第11-20笔记录!(先选再排序再选)

要先排序再选则须用select嵌套:内层排序外层选。

rownum是跟着了局集天生的,一旦天生,就不会变更了;同时,天生的了局是顺次递减的,没有1就永久不会有2!

rownum是在查询汇合发生的过程当中发生的伪列,而且假如where前提中存在rownum前提的话,则:

1:假设判断前提是常量,则:

只能rownum=1,<=年夜于1的天然数,=年夜于1的数是没有了局的,年夜于一个数也是没有了局的

即当呈现一个rownum不满意前提的时分则查询停止  thisisstopkey!

2:当判断值不是常量的时分

若前提是=var,则只要当var为1的时分才满意前提,这个时分不存在stopkey,必需举行fullscan,对每一个满意其他where前提的数据举行判断

选出一行后才干往选rownum=2的行……



11.疾速编译一切视图


----当在把数据库倒进到新的服务器上后(数据库重修),必要将视图从头编译一遍,由于该表空间视图到别的表空间的表的毗连会呈现成绩,能够使用PL/SQL的言语特征,疾速编译。

SQL>SPOOLON.SQL
SQL>SELECT‘ALTERVIEW‘||TNAME||’
COMPILE;’FROMTAB;
SQL>SPOOLOFF

然后实行ON.SQL便可。

SQL>@ON.SQL

固然,受权和创立同义词也能够疾速举行,如:

SQL>SELECT‘GRANTSELECTON’
||TNAME||’TOUSERNAME;’FROMTAB;
SQL>SELECT‘CREATESYNONYM
‘||TNAME||’FORUSERNAME.’||TNAME||’;’FROMTAB;

12.读写文本型操纵体系文件

----在PL/SQL3.3以上的版本中,UTL_FILE包同意用户经由过程PL/SQL读写操纵体系文件。以下:

DECALRE
FILE_HANDLEUTL_FILE.FILE_TYPE;
BEGIN
FILE_HANDLE:=UTL_FILE.FOPEN(
‘C:’,’TEST.TXT’,’A’);
UTL_FILE.PUT_LINE(FILE_HANDLE,’
HELLO,IT’SATESTTXTFILE’);
UTL_FILE.FCLOSE(FILE_HANDLE);
END;

13.在数据库触发器中利用列的新值与旧值

----在数据库触发器中几近老是要利用触发器基表的列值,假如某条语句必要某列修正前的值,利用:OLD就能够了,利用某列修正后的新值,用:NEW就能够了。如:OLD.DEPT_NO,:NEW.DEPT_NO。

14.数据库文件的挪动办法

当想将数据库文件挪动到别的一个目次下时,能够用ALTERDATABASE命令来挪动(比ALTERTABLESPACE合用性强):

1.利用SERVERMANAGER封闭实例.

SVRMGR>connectinternal;
SVRMGR>shutdown;
SVRMGR>exit;

2.利用操纵体系命令来挪动数据库文件地位(假定这里操纵体系为SOLARIS2.6).在UNIX顶用mv命令能够把文件挪动到新的地位,

#mv/ora13/orarun/document.dbf/ora12/orarun

3.装载数据库并用alterdatabase命令来改动数据库中的文件名.

SVRMGR>connectinternal;
SVRMGR>startupmountRUN73;
SVRMGR>alterdatabaserenamefile
>‘/ora13/orarun/document.dbf’
>‘/ora12/orarun/document.dbf’;

4.启动实例.

SVRMGR>alterdatabaseopen;



15.毗连查询了局:

表a列a1a2

纪录1a

1b

2x

2y

2z

用select能选成以下了局:

1ab

2xyz

上面有两个例子:

1.利用pl/sql代码完成,但请求你组合后的长度不克不及超越oraclevarchar2长度的限定

createorreplacetypestrings_tableistableofvarchar2(20);
/
createorreplacefunctionmerge(pvinstrings_table)returnvarchar2
is
lsvarchar2(4000);
begin
foriin1..pv.countloop
ls:=ls||pv(i);
endloop;
returnls;
end;
/
createtablet(idnumber,namevarchar2(10));
insertintotvalues(1,Joan);
insertintotvalues(1,Jack);
insertintotvalues(1,Tom);
insertintotvalues(2,Rose);
insertintotvalues(2,Jenny);
columnnamesformata80;
selectt0.id,merge(cast(multiset(selectnamefromtwheret.id=t0.id)asstrings_table))names
from(selectdistinctidfromt)t0;
droptypestrings_table;
dropfunctionmerge;
droptablet;

2.地道用sql:

表dept,emp

要失掉以下了局

deptno,dname,employees

---------------------------------

10,accounting,clark;king;miller
20,research,smith;adams;ford;scott;jones
30,sales,allen;blake;martin;james;turners

每一个dept的employee串起来作为一笔记录前往

Thisexampleusesamaxof6,andwouldneedmorecutnpastingtodomorethanthat:
SQL>selectdeptno,dname,emps
2from(
3selectd.deptno,d.dname,rtrim(e.ename||,||
4lead(e.ename,1)over(partitionbyd.deptno
5orderbye.ename)||,||
6lead(e.ename,2)over(partitionbyd.deptno
7orderbye.ename)||,||
8lead(e.ename,3)over(partitionbyd.deptno
9orderbye.ename)||,||
10lead(e.ename,4)over(partitionbyd.deptno
11orderbye.ename)||,||
12lead(e.ename,5)over(partitionbyd.deptno
13orderbye.ename),,)emps,
14row_number()over(partitionbyd.deptno
15orderbye.ename)x
16fromempe,deptd
17whered.deptno=e.deptno
18)
19wherex=1
20/

DEPTNODNAMEEMPS

------------------------------------------------------------

10ACCOUNTINGCLARK,KING,MILLER

20RESEARCHADAMS,FORD,JONES,ROONEY,SCOTT,SMITH

30SALESALLEN,BLAKE,JAMES,MARTIN,TURNER,WARD



16.在Oracle中建一个编号会主动增添的字段,以利于查询

1、创建序列:

CREATESEQUENCEcheckup_no_seq
NOCYCLE
MAXVALUE9999999999
STARTWITH2;

2、创建触发器:

CREATEORREPLACETRIGGERset_checkup_no
BEFOREINSERTONcheckup_history
FOREACHROW
DECLARE
next_checkup_noNUMBER;
BEGIN
--Getthenextcheckupnumberfromthesequence
SELECTcheckup_no_seq.NEXTVAL
INTOnext_checkup_no
FROMdual;

--usethesequencenumberastheprimarykey
--fortherecordbeinginserted
:new.checkup_no:=next_checkup_no;
END;

17.检察工具的依附干系(好比视图与表的援用)

检察视图:dba_dependencies纪录了相干的依附干系

查器材不晓得要检察哪一个视图时,能够在DBA_Objects里看,

selectobject_namefromdba_objectswhereobject_namelike%ROLE%(假设检察ROLE相干)

然后DESC一下就大致上晓得了。

18.要找到某月中一切周五的详细日期

selectto_char(t.d,YY-MM-DD)from(
selecttrunc(sysdate,MM)+rownum-1asd
fromdba_objects
whererownum<32)t
whereto_char(t.d,MM)=to_char(sysdate,MM)--找出以后月份的周五的日期
andtrim(to_char(t.d,Day))=礼拜五

--------

03-05-02

03-05-09

03-05-16

03-05-23

03-05-30

假如把whereto_char(t.d,MM)=to_char(sysdate,MM)改成sysdate-90,即为查找以后月份的前三个月中的每周五的日期。
DBaaS并不意味着解决方案提供者要让自己失业。与其他系统一样,在实施DBaaS解决方案时,客户可能需要部署、迁移、支持、异地备份、系统集成和灾难恢复等方面的帮助。
乐观 该用户已被删除
沙发
发表于 2015-1-17 07:37:25 | 只看该作者
SP4包括用于以下SQLServer2000组件的程序包:Database组件(下载文件:SQL2000-KB884525-SP4-x86.EXE)更新SQLServer2000的32位Database组件,包括数据库引擎、复制、客户端连接组件及工具。有关其他信息,请参阅ReadmeSql2k32Sp4.htm。AnalysisServices组件(下载文件:SQL2000.AS-KB884525-SP4-x86.EXE)更新SQLServer2000的32位AnalysisServices。
金色的骷髅 该用户已被删除
板凳
发表于 2015-1-20 14:52:28 | 只看该作者
这是一个不错的新特性。虽然索引的附加字段没有索引键值效率高,但是相对映射到数据表中效率还是提高了很多。我做过试验,在我的实验环境中会比映射到表中提高30%左右的效率。
冷月葬花魂 该用户已被删除
地板
发表于 2015-1-29 11:00:08 | 只看该作者
不好!如果出了错;不好调试;不好处理!其实web开发将代码分为3层:web层;业务逻辑层和数据访问层;一般对数据库的操作都在数据访问层来做;这样便于调试和维护!而且将来如果是换了数据库的话;你只需要改数据层的代码;其他层的基本可以不变!要是你在jsp中直接调用sql数据库;那么如果换了数据库呢?岂不都要改?如果报了异常呢?怎么做异常处理?
再见西城 该用户已被删除
5#
发表于 2015-2-6 00:27:26 | 只看该作者
换言之,只有在不断的失败中尝试成功,而关于失败的总结却是很少的
精灵巫婆 该用户已被删除
6#
发表于 2015-2-14 15:53:14 | 只看该作者
原来公司用过MYSQL自己也只是建个表写个SQL
飘灵儿 该用户已被删除
7#
发表于 2015-3-4 07:42:42 | 只看该作者
同样会为索引视图等应用带来麻烦。看看行级和事务级的快照数据放在tempdb中,就能感觉到目前架构的尴尬。
活着的死人 该用户已被删除
8#
发表于 2015-3-19 05:30:13 | 只看该作者
一个百万级别的基本信息表A,一个百万级别的详细记录表B,A中有个身份证id,B中也有身份id;先要找出A中在B的详细记录。
若相依 该用户已被删除
9#
发表于 2015-3-27 08:14:13 | 只看该作者
你觉得我的非分区索引无法对起子分区,你可以提醒我一下呀!没有任何的提醒,直接就变成了非分区表。不知道这算不算一个bug。大家也可以试试。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-5-3 06:51

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表