Oracle各种Tips

一、SQL优化

1.*与列名,尽量使用列名		-- 原因:如果使用*,Oracle先要解析一下*是代表哪些列名

2.where解析顺序是从右-->左	-- and条件尽量把假的放前面,or条件尽量把真的放前面

3.多表查询和子查询之间,尽量使用多表查询

下面两句SQL语句等价,但尽量使用多表查询	-- 原因:下面的子查询最终是转换成上面的多表实现查询的,可以通过SQL执行计划看出

select e.* from emp e,dept d where e.deptno = d.deptno and dname='SALES';
select * from emp where deptno=(select deptno from dept where dname='SALES');

二、SQL中的null

1.包含null的表达式结果都为null	-- 此时需要滤空函数:nvl(a,b)、nvl2...

2.null永远不等于null

3.如果集合中含有null,不能使用not in,可以使用in	-- 原因:not in(1,2,null)的时候是解析成xxx=1 and xxx=2 and xxx=null,而xxx=null为假,整个语句没有意义
-- 可以使用 xxx<>1 and xxx <>2 and xxx is not null来实现

三、字符串大小写敏感、日期格式敏感

字符串:

SQL> select * from emp where ename='JAMES';

     EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO  
---------- ---------- --------- ---------- -------------- ---------- ---------- ----------          
                                                                    
                                                            
      7900 JAMES      CLERK           7698 03-12月-81            950           		 30  
			

SQL> select * from emp where ename='James';	-- 如果在MySQL中运行是正确的,因为MySQL不区分字符串大小写;

日期格式:

SQL> select * from emp where hiredate='03-12月-81';

     EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM 
---------- ---------- --------- ---------- -------------- ---------- ---------- 
    DEPTNO                                                                      
----------                                                                      
      7900 JAMES      CLERK           7698 03-12月-81            950            
        30                                                                      
                                                                                
      7902 FORD       ANALYST         7566 03-12月-81           3000            
        20                                                                      
                                                                                

SQL> select * from emp where hiredate='1981-12-03';
select * from emp where hiredate='1981-12-03'
                                 *
第 1 行出现错误: 
ORA-01861: 文字与格式字符串不匹配 

四、转义字符的使用

例如:想要模糊查询名字中带有_的人

select * from emp where ename like '%_%';	-- 这样会查出所有的人

-- 此时就需要转义字符了

select * from emp where ename like '%\_%' escape '\';	-- escape '\'表示声明\为转义字符

五、Oracle中事务是自动开的,也就是说,我们随时可以回滚(rollback)

六、多行子查询的使用

in

查询部门是SALES和ACCOUNTING中所有人的工资

select * from emp where deptno in (select deptno from dept where dname='SALES' or dname='ACCOUNTING');
可以使用多表查询来实现
select e.* from emp e,dept d where e.deptno = d.deptno and (dname='SALES' or dname='ACCOUNTING');

any

查询工资比30部门任意一个员工高的员工信息

select * from emp where sal > any (select sal from emp where deptno=30);

all

查询工资比30部门所有员工高的员工信息

select * from emp where sal > all (select sal from emp where deptno=30);

七、行号(rownum)

1、rownum永远按照默认的顺序生成		
2、rownum只能使用< <=;不能使用> >=		-- 原因:rownum永远从1开始,>和>=连1都没有,怎么判断

-- 原因:当我们order by的时候,会生成一个临时表,并没有修改原来的表,所以行号还是按照原来的表的行号整的

八、单双引号

好像只有在起别名的时候,使用“”,其他时候都用‘’

九、触发器的查询和删除

select trigger_name from all_triggers where table_name='XXX';	-- 查询xxx表中所有的触发器
select text from all_source where type='TRIGGER' AND name='TR_XXX';	-- 根据trigger_name查询出触发器详细信息

DROP TRIGGER 触发器名;	-- 删除触发器

十、临时表(了解)【标准表、索引表??】

1.create global temporary table 临时表名;
2.自动创建:排序(order by)
特点:当事务或会话结束时,表中数据自动删除

事务提交后,一定会保存数据吗?? 	答:不一定,还有临时表

十一、审计(了解)

1.强制审计
2.标准审计
3.基于值的审计
4.细粒度审计
5.管理员审计

十二、导入导出数据库

-- 创建表空间

create tablespace dgpdg
logging 
datafile 'D:\app\x5456\oradata\orcl\dgpdg_01.dbf' 
size 1500m 
autoextend on 
next 100m maxsize 10000m 
extent management local;

-- 创建用户,绑定表空间dgpdg

create user dgpdgltfirst identified by 5456 DEFAULT TABLESPACE dgpdg;


-- 用户赋权

GRANT 
  CREATE SESSION, CREATE ANY TABLE, CREATE ANY VIEW ,CREATE ANY INDEX, CREATE ANY sequence,CREATE ANY PROCEDURE,
  ALTER ANY TABLE, ALTER ANY sequence,ALTER ANY PROCEDURE,
  DROP ANY TABLE, DROP ANY sequence,DROP ANY VIEW, DROP ANY INDEX, DROP ANY PROCEDURE,
  SELECT ANY TABLE, INSERT ANY TABLE, UPDATE ANY TABLE, DELETE ANY TABLE
TO dgpdgltfirst;

-- 使用cmd命令进行导入dmp文件

--imp dgpdgltfirst/5456@localhost/orcl file="C:\Users\x5456\Desktop\运维管理系统和运维库\运维库备份2.2.9\exp\dgpdgltfirst20171025.dmp" full=y ignore=y statistics=none


imp dgpdgltfirst/5456@127.0.0.1/orcl file="D:\dgpdgltfirst20171025.dmp" log="D:\dgpdgltfirst20171025.log" full=y ignore=y statistics=none






----------------------------------异常1----------------------------------

IMP-00013: 只有 DBA 才能导入由其他 DBA 导出的文件
IMP-00000:为成功终止导入

用sys 登录,给用户授权grant dba to 用户名;

以上图为例: grant dba to dgpdgltfirst;  授权后在重新执行导入命了即可.




sqlplus dgpdgltfirst/5456



grant connect,resource to dgpdgltfirst;

-- 导出数据库

exp dgpdg/pass@192.168.1.33/ORCL file=D:\gd_base.dmp log=D:\gd_base.log(不要加full=y,会把整个数据库倒下来)

十三、嘻嘻

  程序包   存储过程
dbms_output.put_line('hello,world');

十四、遇到的2个问题

ORA-12560: TNS: 协议适配器错误

https://blog.csdn.net/sixandsix/article/details/69396784



PLSQL程序中,起的变量名不要与数据库表中的字段名相同。

十五、Oracle的死锁

 

posted @ 2018-07-10 11:31  想54256  阅读(242)  评论(0编辑  收藏  举报