oracle

oracle部分整理

一、子查询

 查询的注意地方   

1. 括号
2. 合理的书写风格
3. 可以在主查询的where select having from后面都可以放置子查询
4. 不可以在group by放置子查询
5. 强调from后面的子查询
6. 主查询和子查询可以不是同一张表;只要子查询返回的结果主查询可以使用 即可
7. 一般不在子查询中排序;但在top-n分析问题中,必须对子查询排序
8. 一般先执行子查询,再执行主查询;但相关子查询例外
9. 单行子查询只能使用单行操作符;多行子查询只能使用多行操作符
10. 子查询中null(参考http://www.cnblogs.com/lulu638/p/4498098.html)

SQL> --6. 主查询和子查询可以不是同一张表;只要子查询返回的结果主查询可以使用 即可
SQL> --查询部门名称是SALES的员工
SQL> select *
  2  from emp
  3  where deptno=(select deptno
  4                from dept
  5                where dname='SALES');
SQL> --SQL优化原则: 理论上,尽量使用多表查询
SQL> host cls
SQL> --in 在集合中
SQL> --查询部门名称是SALES和ACCOUNTING的员工
SQL> select *
  2  from emp
  3  where deptno in (select deptno from dept where dname='SALES' or dname='ACCOUNTING');
SQL> --any:和集合中的任意一个值比较
SQL> --查询工资比30号部门任意一个员工高的员工信息
SQL> select *
  2  from emp
  3  where sal > any (select sal from emp where deptno=30);
SQL> --all: 和集合中的所有值比较
SQL> --查询工资比30号部门所有员工高的员工信息
SQL> select *
  2  from emp
  3  where sal > all (select sal from emp where deptno=30);

分页的例子:

 --第5-8条记录
 select *
 from     (select rownum r,e1.*
     from (select * from emp order by sal) e1
      where rownum <=8
    )
 where r >=5;

相关子查询:

需求:员工表中薪水大于本部门平均薪水的员工

SQL> --相关子查询: 将主查询中的值作为参数传递给子查询
SQL> select empno,ename,sal,(select avg(sal) from emp where deptno=e.deptno) avgsal
  2  from emp e
  3  where sal > (select avg(sal) from emp where deptno=e.deptno);

sql类型

 SQL的类型:
1. DML(Data Manipulation Language 数据操作语言): select insert updete delete
2. DDL(Data Definition Language 数据定义语言): create table,drop table,truncate table
                                                 create/drop view,sequence,index,synonym(同义词)
3. DCL(Data Control Language 数据控制语言): grant(授权) revoke(撤销权限)

 海量拷贝数据(移动数据)

1.  数据泵(导出 导入 拷贝): PLSQL程序

2.  SQL*Loader SQL>

3.  外部表(external table)

 delete和truncate的区别:

1. delete逐条删除;truncate先摧毁表,再重建 

2.(根本)delete是DML(可以回滚)  truncate是DDL(不可以回滚)

3. delete不会释放空间 truncate会  (原因:undo表空间 undo数据) 

4. delete会产生碎片 truncate不会 

5. delete可以闪回(flashback) truncate不可以

Oracle中事务的标志
1. 起始标志: 事务中第一条DML语句
2. 结束标志: 提交: 显式 commit
                   隐式 正常退出exit
                   回滚     显式 rollback
                   隐式 非正常退出,掉电,宕机

数据库对象

 视图

·视图是一种虚表

·必须建立在已有表的基础上

·不能存储数据,只能通过操作查看数据

·只能简化查询,不能提高查询的性能

·视图只能创建替换与删除,不能修改

SQL> create or replace view empinfoview
  2  as
  3  select e.empno,e.ename,e.sal,e.sal*12 annsal,d.dname
  4  from emp e, dept d
  5  where e.deptno=d.deptno
  6  with read only;

视图已创建。

序列化

可供多个用户来产生唯一数值的数据库对象

·自动提供唯一的数值

·共享对象

·主要用于提供主键值

·将序列装入内存可以提高访问效率

SQL> create sequence myseq;

序列已创建。

nextval和currval伪列
nextval:返回序列中下一个有效的值,任何用户都可以引用

currval:中存放序列的当前值

nextval应在currval之前定义,二者应同时有效。

使用序列

序列在以下情况会出现裂缝:

·回滚

·系统异常

·多个表同时使用同一个序列

索引

· 通过指针加速oracle的查询速度

·删除一个表时,所有基于该表的索引会自动删除

·通过快速定位数据的方法,减少磁盘的i/o

·索引一旦建立,有oracle统一管理

原理图

自动创建:主要用于定义primary key 或unique约束后系统自动在相应的列上创建唯一性索引

手动创建:用户在其他列上创建非唯一性的索引,以加速查询

创建索引的要求

·列中的数据分布范围 广

·列经常在where子句或链接条件中出现

·列经常被访问而且数量巨大,访问的数据大概占总量的2%到4%

SQL> --索引 index
SQL> create index myindex
  2  on emp(deptno);

索引已创建。

同义词
·方便访问其他用户的对象

·缩短对象名称的长度

SQL> --为hr.employees表取别名---> 同义词
SQL> create synonym hremp for hr.employees;
create synonym hremp for hr.employees

后续 PLSQL&存储过程存储函数&触发器--链接 

PLSQL&存储过程存储函数&触发器.rar

http://files.cnblogs.com/files/lulu638/PLSQL%26%E5%AD%98%E5%82%A8%E8%BF%87%E7%A8%8B%E5%AD%98%E5%82%A8%E5%87%BD%E6%95%B0%26%E8%A7%A6%E5%8F%91%E5%99%A8.rar

原文地址:https://www.cnblogs.com/lulu638/p/4498374.html