sadsafsafsaf
safsaffffffffffffffffwqwfsafafasfddddddddddddddd
ddddddddddddddddddddddddd 谢谢 下了不顶不好意思~ thankyou 谢谢楼主,,,多谢分享 谢谢 :victory: 谢谢啦~ 1. 基本查询命令select from tablename
where
group by
having
order by
where字句可使用运算符:=、<>、!=、>=、<=、in、between、like(%_)、is null 或is not null、not、or、and。
order by:asc(升序)或desc(降序),缺省升序。
group by:将查询结果分组,在包含group by 子句的查询中,select 子句的列表中的所有个体值(除聚组函数avg、count等外)必须是groub by子句中的表达式或常量。
having:如果需要对各个组返回的结果进行筛选,查询满足一定条件的分组值,可以使用having。例如:
select deptno,sum(sal)
from emp
group by deptno
having sum(sal)>9000;
2. 数据更新
insert intotablename(l1,l2)
values(v1,v2); 可以带&
insert into tablename(列表)
select 语句;
updatetablename
set列名1=,列名2=
where
delete fromtablename where
3. 事物控制
commit
set autocommit on
rollback
savepoint 保存点 3.2如何杀掉吊死session
(1) 找出吊死session
Select sid,serial#,program,machine,lockwait from v$session;
(2) 杀死session
Svrmgrl>alter system kill session 'init1,init2';
其中init1为sid,init2为serial#。
3.3如何修改字符集
以sys用户执行如下命令
Update props$ set value$='新字符集'
Where ltrim(name)='NLS_CHARACTERSET';
commit;
注意:如果有数据,不要修改数据集。
3.4如何追加表空间
以sys用户:
Alter tablespace 表空间 add datafile 文件名(带路径)size Xm;
3.5如何加大表的maxextents值
Alter table 表名 storage(maxextents 新值)
3.6如何查询无效对象
(1) 以sys用户登录SQL Plus
(2) 查询无效对象
Selectsubstr(object_name,1,30) object_name,object_type
from user_objects
wherestatus ='INVALID'
(3) 恢复失效存储过程
对于存储过程,如果存储过程或函数脚本中某个表或所调用的存储过程被drop或重新编译,则此存储过程可能变为invalid,正常情况下,再次调用此存储过程时,系统会自动编译使其变为valid,也可以手工编译:Alter procedure 名称 compile;
3.7怎样分析SQL语句是否用到索引
Oracle提供的策略分析器Explain plan能很好地分析SQL语句使用索引情况,分析步骤如下
(1) 检查当前用户下是否存在策略分析表plan_table
(2) 检查表结构是否正确(建立数据库时只有sys用户下存在此表),若没有,需要在当前用户下建此表:
CREATE TABLE PLAN_TABLE
(
STATEMENT_ID VARCHAR2(30),
TIMESTAMP DATE,
REMARKS VARCHAR2(80),
OPERATION VARCHAR2(30),
OPTIONS VARCHAR2(30),
OBJECT_NODE VARCHAR2(128),
OBJECT_OWNER VARCHAR2(30),
OBJECT_NAME VARCHAR2(30),
OBJECT_INSTANC NUMBER(38),
OBJECT_TYPE VARCHAR2(30),
OPTIMIZER VARCHAR2(255),
SEARCH_COLUMNS NUMBER(38),
ID NUMBER(38),
PARENT_ID NUMBER(38),
POSITION NUMBER(38),
COST NUMBER(38),
CARDINALITY NUMBER(38),
BYTES NUMBER(38),
OTHER_TAG VARCHAR2(255),
OTHER LONG
);
(3) 执行分析语句:
sql>delete from plan_table;
sql>explain plan for
sql>select * from tab where tname like 'T%';
sql>select object_name,options,operation from plan_table;
执行完上述三步,可查看“select * from tab where tname like 'T%'”语句where条件是否用到索引。 ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾。
例如:
(低效,执行时间156.3秒)
SELECT …
FROM EMP E
WHERE SAL > 50000
AND JOB = ‘MANAGER’
AND 25 < (SELECT COUNT(*) FROM EMP
WHERE MGR=E.EMPNO);
(高效,执行时间10.6秒)
SELECT …
FROM EMP E
WHERE 25 < (SELECT COUNT(*) FROM EMP
WHERE MGR=E.EMPNO)
AND SAL > 50000
AND JOB = ‘MANAGER’;
6. SELECT子句中避免使用 ‘ * ’
当你想在SELECT子句中列出所有的COLUMN时,使用动态SQL列引用 ‘*’ 是一个方便的方法。不幸的是,这是一个非常低效的方法。 实际上,ORACLE在解析的过程中, 会将‘*’ 依次转换成所有的列名, 这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间。
7.减少访问数据库的次数
当执行每条SQL语句时, ORACLE在内部执行了许多工作: 解析SQL语句, 估算索引的利用率, 绑定变量 , 读数据块等等。 由此可见, 减少访问数据库的次数 , 就能实际上减少ORACLE的工作量。
例如,以下有三种方法可以检索出雇员号等于0342或0291的职员。
方法1 (最低效)
SELECT EMP_NAME , SALARY , GRADE
FROM EMP
WHERE EMP_NO = 342;
SELECT EMP_NAME , SALARY , GRADE
FROM EMP
WHERE EMP_NO = 291;
方法2 (次低效)
DECLARE
CURSOR C1 (E_NO NUMBER) IS
SELECT EMP_NAME,SALARY,GRADE
FROM EMP
WHERE EMP_NO = E_NO;
BEGIN
OPEN C1(342);
FETCH C1 INTO …,..,.. ;
OPEN C1(291);
FETCH C1 INTO …,..,.. ;
CLOSE C1;
END;
方法3 (高效)
SELECT A.EMP_NAME , A.SALARY , A.GRADE,
B.EMP_NAME , B.SALARY , B.GRADE
FROM EMP A,EMP B
WHERE A.EMP_NO = 342
AND B.EMP_NO = 291;
注意:
在SQL*Plus , SQL*Forms和Pro*C中重新设置ARRAYSIZE参数, 可以增加每次数据库访问的检索数据量 ,建议值为200. 最高效的删除重复记录方法 ( 因为使用了ROWID)
DELETE FROM EMP E
WHERE E.ROWID > (SELECT MIN(X.ROWID)
FROM EMP X
WHERE X.EMP_NO = E.EMP_NO);