- oracle常用基本数据类型:
- 字符型
- Char:固定长度字符串,占2000个字节
- Varchar2:可变长度字符串,占4000个字节
- Nvarchar2:占2000个字符
- 大对象型(lob)
- Blob:二进制数据,最大长度4G,用于存图片,视频,文件
- Clob:字符数据,这大长度4G
- 数值型
- Integer:整数类型
- Float:浮点数类型
- Real:实数类型
- Number(p,s):包含小数位的数值类型。p表示精度,s表示小数后的位数
- 日期类型
- Date:DD-MM-YY(HH-MI-SS)
- Timestamp:精确到微秒,精确范围0~9,默认6
- 字符型
- id,rowid,rownum区别
rowid物理位置的唯一标识。 而id是逻辑上的唯一标识,所以rowid查找速度要快于id,是目前最快的定位一条记录的方式。 rowid和rownum都是"伪数列",所谓“伪数列”也就是默认隐藏的一个数列。 rownum用于标记结果集中结果顺序的一个字段,它的特点是按顺序标记,而且是连续的,换句话说就是只有有rownum=1的记录,才可能有rownum=2的记录。 rownum关键字只能和<或者<=直接关联,如果是>或者=则需要给他起个别名
- 主键和唯一索引的区别
在创建主键的同时会生成对应的唯一索引,主键在保证数据唯一性的同时不允许为空,而唯一可以有一个为空数据项。
一个表中只能有一个主键,但是一个主键可以有多个字段,一个表中可以有多个唯一索引。 - 存储过程
- 概述:可以包含逻辑判断的sql语句集合,经过预编译存在于数据库中,通过调用指定存储过程的名字(可有参,可无参)来执行
- 优点:
- 简化了复杂的业务逻辑,根据需要可重复执行
- 屏蔽底层细节,不需要暴露表信息即可完成操作
- 降低网络通信量,多条语句可封装到一个存储过程来执行
- 设置访问权限来提到安全性
- 提到执行效率,因为它是预编译以及存储在数据库中
- 缺点
- 可移植性差,相同的存储过程并不能跨多个数据库操作
- 大量使用存储过程,会使服务器压力增大,维护难度增加
- oracle中存储过程语法
--下面是在oracle数据库下最基本的语法 --仅创建一个名为testProcedure 的无参的存储过程 --IS也可以是AS --如果已经存在名为 testProcedure 的存储过程,下面的语法会出现 名称已被使用的错误 --解决办法: --第一句可以写成 create or replace procedure testProcedure --这样会替换原有的存储过程 --NULL表示任何可以正确执行的sql 语句,但至少一句 create procedure testProcedure IS BEGIN NULL END; 存储过程的参数的分类: IN OUT INOUT 注意: 存储过程之间可相互调用 存储过程一般修改后,立即生效。
- oracle分页
select * from ( select A.* rownum rn from(select * from t_name) A where rowmum<10 )
where rn >=5 - 表数据复制到另一张表
- 另一张表不存在时
create table t2 as select * from t1
- 另一张表存在
insert into t2 select 字段 from t1
- 另一张表不存在时
- inner join
select 查找信息 from 表名 1 inner join 表名2 on 表名1.列名 = 表名2.列名
- left join
select 查找信息 from 表名1 left join 表名2 on 表名1.列名 = 表名2.列名
- right join
select 查找信息 from 表名1 right join 表名2 on 表名1.列名 = 表名2.列名
- 查询树形遍历结构
select * from extmenu start with pid=1 connect by prior id = pid
快速删除父节点以及父节点下的所有节点:
Delete from extmenu where id in (
select * from extmenu
start with pid=1
connect by prior id = pid
)
- exists替换in---进行联表查询
select * from dept where exists (select * from emp where emp.deptno=dept.deptno) 或 select * from dept d inner join emp e on d.deptno = e.deptno(只查询出两表共同拥有的字段数据)
- 删除表中重复数据
delete from xin a where a.rowid != ( select max(b.rowid) from xin b where a.name = b.name )
-
row_number(),rank() over ,dense_rank() over 按工资排序
select sal, row_number() over(order by sal desc) rank1, rank() over(order by sal desc) rank, dense_rank() over(order by sal desc) drank from emp
-
select * from (select emp.* from( dense_rank() over(partition by departNo order by sal desc) rk from emp ) Where rk=4