Oracle
DDL
- 数据类型:
- CHAR(n): 定长字符串
- VARCHAR2(n): 可变长字符串,对中文支持比较好
- LONG: 可变长字符数据,最大2G
- NUMBER(m,n): 可变长数值列m是有效数字位数(默认11), n是保留小数位数, Oracle保留int和double它们是NUMBER子集,
- DATE: 默认的显示和匹配格式是’日-月-年'
- alter session set NLS_DATE_FORMAT = ‘yyyy-mm-dd’修改会话中date类型数据的显示格式
- 步进是一天,支持减法操作
- BLOB: 二进制数据 CLOB: 字符型数据 BFILE: 二进制文件
- ROWID: 行地址
- delete是逐条删除表内容,truncate是直接摧毁表然后重建,
- delete是dml语言(支持闪回),truncate是ddl语言(不支持闪回)
- delete会产生碎片,truncat不会产生碎片
- delete不会释放空间,truncate会释放空间,所以当确定表不再使用后应该使用truncate
- alter talbe t1 rename xxx to xxx 重命名列名
- alter table t1 drop column xxx 删除列
- alter table t1 modify 列 类型 --当存在多列时, 用括号
- rename t2 to t2 重命名表名,rename可以重命名oracle中的其他对象,所以不需要加table
- flashback table t2 to before drop; 可以闪回处于回收站中的表
- drop table t2 purge;表示永久删除表
- purge recyclebin 清空回收站
- 注意sys用户没有回收站,只有普通用户有回收站
- alter table xxx add xxx date default sysdate;增加一行,默认值是系统时间
- create table <tablename> as select * from <tablename> where 1=2表示创建一个相同表结构的空表
DML
DELETE是dml语言, 逐行删除, 支持回滚, 不会释放空间, 会产生碎片 TRUNCAT是ddl语言, 摧毁表后重建, 不支持回滚, , 会释放空间, 不会产生碎片 insert into <tablename> valuse(&arg1, &arg2,…)这种插入方式可以,所有dml语句都可以
DQL
外连接: 支持使用join进行外连接, 同时也支持在 where中 想要保留一方后添加(+)实现
order by col|表达式(函数)|结果集中列的别名|结果集中列的序号 asc null last , col , desc
- oracle默认null值既不是空也不是数, 也不是无穷大升序默认排最后, 降序默认排最前, 使用null last参数指定null值一定在最后
where的条件判断是从后往前的判断的
null值的运算结果一定为null
nvl(a,b)若a为null返回b, 否则返回a
null值不能出现在not in 集合中
CASE [EXP]
WHEN ... THEN ...
END
当判断条件为等号时,可以将列名填在exp上 在when中指定等值条件即可,
注意ORACLE中除了起别名,其他的必须使用单引号
sqlplus break on <column> skip 2; <column>列相同只显示1列, 往后分组换两行继续显示 语句执行时间记录开关 set timing on/off 语句回显开关: set feedback on/off 就是显示多少行
- 单行函数: 使用
select 函数 from dual
来测试这些函数LOWER(varchar str)
: 小写转换UPPER(varchar str)
: 大写转换INITCAP(varchar str)
: 首字母大写, 以空格作为单词定界符CONCAT(varchar str,varchar str)
连接字符串oracle支持使用 ‘a’ || ‘b’方式拼接多个字符串SUBSTR(varchar str, int pos ,int len)
从1位置截取3个字符, 3省略截取到末尾INSTR(varchar str , varchar str)
查找字符串出现位置LPAD(varchar str, int, varchar fill)
若str不足len则在字符串左边填充字符fill, 同理有RPADTRIM(varchar str)
去除str首尾的空格, 高级玩法: TRIM(varchar from varchar)表示去除字符串首尾指定字符串REPLACE(varchar str , varchar old , varchar new)
替换ROUND(number n, number)
四舍五入, 第二个参数为保留小数位数, 使用负数保留的整数位数(例如-1 , 51,50)TRUNC(number n, number precision)
: 数字截取, 第二个参数为保留数字尾部截去数字个数. 和round不同的是他不进行四舍五入MOD(int, int)
取模CEIL(double)
向上取整FLOOR(double)
向下取整TO_CHAR(number , varchar_format)
NUMBER转varchar: ‘L9,999’ ; 本地数字货币格式TO_CHAR(date, varchaar_format)
date转varchar: ‘yyyy-mm-dd hh24:mi:ss “今天是” day’ , 加上fm去0TO_NUMBER(varchar, varchar_format)
varchar转int: ‘L9,999’ 本地数字货币格式TO_DATE(varchar, varchar_format)
varchar转date: ‘yyyy-mm-dd hh24:mi:ss “今天是” day’MONTH_BETWEEN(date, date)
日期月差精确值.ADD_MONTHS(date, integer)
日期加法LAST_DAY(date)
指定日期的当月最后一天.NEXT_DAY(date)
指定日期的下一个星期几SYSDATE
DECODE(expr|column, search1, ret1, search2, ret2,...)
是oracle
- 聚集函数: 聚集函数通常用于包含group by子句的SQL语句中用于统计查询
AVG()
:SUM()
:MAX()
:MIN()
:COUNT()
:
ORACLE的事务
oracle事务不需要手动开启,
- 事务提交
- COMMIT提交事务
- 执行了ddl语句、会话正常退出、设置了set autocommit on后执行了dml语句
- 事务回滚
- ROLLBACK [TO SAVEPOINT XXX] oracle支持保存点操作使用命令SAVEPOINT设置保存点
- 掉电、宕机、会话异常退出
- 隔离级别:Oracle支持以下事务隔离级别
- 读已提交: oracle默认级别,只能读到最新的已提交结果
- 串行化:
- 只读模式:
ORACLE对象
表、视图、索引、序列、同义词 存储过程、存储函数、触发器、包、包体、数据库链路、快照
序列
create sequence myseq, 通过mysql.nextval 可以直接取下一个序列的值,在同一个语句中它的返回值是相同的
select myseq.currval from dual; --查看当前值
select myseq.nextval from dual; --查看下一值,调用了nextval后下一次再获取将自增1,同一条语句中多次调用nextval获得的值是相同的
drop sequence myseq
视图
简化复杂查询、隔离数据访问, 视图可以insert、update、delete但是不推荐,他违背了视图隔离数据的本意 创建视图需要权限,管理员调用grant create view to xxx 使用视图可以:隔离敏感字段(例如薪水)、保证分布式数据查询时数据的一致性(总部查主表、分部查视图)
CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW name
WITH READ ONLY
同义词
表的别名,简化查询、隔离数据 创建同义词需要权限grant create synonym to xxx create synonym 表1 for 表2 drop synonym xxx
索引
在列上构建btree提高查询效率 创建索引后,oracle会自动创建一个索引表,该索引表由oracle进行维护,该索引表其实是记录一个列中某个值的所有行的行地址 create index 索引名 on 表(创建索引的列,…) tablespace xxx; drop index 索引名;
- 注意事项
- 当数据分布范围广、列经常在where出现或用作连接条件推荐使用索引
- 当表很小、数据经常更新的不推荐使用索引
- 单行查询和模糊查询都会影响索引的触发
- 复合索引中第一列为优先检索列,包含优先检索列才能触发复合索引,
存储过程
in/out默认值为in,指明传入参数还是传出参数,传出参数必须使用out修饰,否则会出错
CREATE [OR REPLACE] PROCEDURE 过程名[(参数名 in/out 参数类型)]
IS
BEGIN
PLSQL子程序体
END
存储函数
存储函数有返回值,
CREATE [OR REPLACE] FUNCTION 函数名(参数名)
触发器
PLSQL
declear
xx 类型 = xx;
xx 类型 = ⅈ
cursor xx is <query>
begin
if xx then
elsif xx then
else
end if;
while xx loop
end loop;
loop
exit when
end loop;
for i in 1..10 loop
end loop;
end