Oracle 学习笔记
Posted wisdo的博客
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Oracle 学习笔记相关的知识,希望对你有一定的参考价值。
一、字符串函数
lower(字符串) 小写
upper(字符串) 大写
initcap(字符串) 首字母大写
concat(列1,列2) 两列合并
length(字符串) 按照字
lengthb(字符串) 按照字节
lengthc(字符串) unicode 的长度
substr(列名,m,n ) m: 开始索引号,n:截取长度
instr(字符串,字符) 字符在字符串中的位置
leading ‘a‘ from ‘aaaaaabababaaaaaaaa‘ 截取连续的前置a
trailing ‘a‘ from ‘aaaaaaababaaaaaaaa‘ 截取连续的后置a
both ‘a‘ from ‘aaaaaaababaaaaaaaa‘ 截取连续的前置和后置a
lpad(字符串,n,字符) 在字符串的左侧添加n个字符
rpad(字符串,n,字符) 在字符串的右侧添加n个字符
replace(字符串,字符1,字符2) 将字符1 替换成字符2
traim(字符串) 去掉字符串两边的空格
ltraim(字符串) 去掉字符串左边的空格
rtraim(字符串) 去掉字符串右边的空格
二、数字操作函数
ROUND(数字,位数) 四舍五入
TRUNC(数字,位数) 小数全部舍弃,取整
CEIL(数字) 小数全部舍弃,取整(上进一位)
ABS(数字) 数字的绝对值
ACOS(数字) 反余弦
COS(数字) 余弦
FOOR(x) 小于或等于x的最大数
LOG(数字) 对数
MOD(x,y) x/y 的余数
POWER(x,y) x的y次幂
SQRT(数字) 平方根
三、 日期操作函数
sysdate 数据库的当前时间
nls_date_format 重新定义日期的显示格式
alter session set nls_date_format=‘yyyy/mm/dd:hh24:mi:ss‘
round(日期1-日期2) 两个日期之间的差,单位天,带小数
months_between(日期1,日期2) 两个日期间的月数
add_months(日期1,月份)
next_day(日期1,“friday”) 从日期1算起,下一个星期5是哪一天
last_day(日期1) 日期1月底是哪一天
extract(year from 日期1) 日期1中特定的部分 , year,month,day,hour,minute,second
日期进位和截取
round(date,‘mm‘)
round(date,‘month‘)
round(date,‘yyyy‘)
round(date,‘year‘)
trunc(date,‘mm‘)
trunc(date,‘month‘)
trunc(date,‘yyyy‘)
trunc(date,‘year‘)
to_char 转换成char 类型
to_date 转换成日期类型
to_number 转换成数字
四、 NULL 操作
NULL 值指,空值,末赋值或不可知的值
NVL(expr1,epxr2) 如果 expr1 为非空,就返回 expr1,否则返回 epxr2, 数据类型要一致
NVL2(expr1,epxr2,epxr3) 如果 expr1 为非空,就返回 expr2, 否则返回 epxr3
NULLIF(expr1,epxr2) 如果 expr1和 epxr2 相同就返回空,否则返回 expr1
COALESCE(expr1,epxr2,...,exprn) 返回第一个非空的值
五、 分支语句
1. CASE 语句
select 列1,列2,列3,
CASE 列4
when ‘值1‘ then ‘返回值1‘
when ‘值2‘ then ‘返回值2‘
when ‘值3‘ then ‘返回值3‘
ELSE
‘值0‘
END ‘新列1‘
2. Decode 语句
Decode 语句和 CASE 语句一样,都是分支语句,Decode 是 Oracle 自定义的,其它数据库不支持
Decode(coll|expression,search1,result1,search2,result2,...,defaul
六、 表的连接
笛卡儿连接: cross join
如果是两个表,第一张表的所有行与第二个表的所有行进行矩阵相乘,得到 n*m 行的结果。 避免笛卡儿连接: 给定一个正确的连接条件 表的别名一旦定义,表的本名就无效
外连接: left/right outer join
外连接分为: 左外连接 left outer join,右外连接 right outer join, outer 可省略
使用 where A.列1 = B.列1,
where A.列1 (+)= B.列1, (等价于 右外连接) 将第一张表,第二张表没有的数据也显示,+号不能同时出现在等号 的两边,只能出现在一边 +号是oracle 特有的,出现在左边指右外连接,在右边指左外连接
自连接: self join
即自身连接。
自然连接: natural join
所有同名的列,都作为等值条件,且数据类型相同,不能加表的前缀 using(列名) 指定列的连接,当有多列同名时,使用其中某一列作为连接条件
七、 DDL 和 DML语句
DDL: 数据定义语言,包括表的创建,修改,删除,验证
DML: 数据修改语言,包括数据行的修改,删除 表是存放数据的最基本对象。
我们将一般的表叫做 heap table (堆表),其含义为杂乱无章的存放数据,堆表是数据库的重要组织形式,它表别于索引表和 cluster 表。
表的名称规则:
标准 ASCII 码可以描述
字母开头 30个字母内
不能是保留字
可以包含大小写字母 ,数字,下画线,$,# 千万不要使用汉字作为表的名称或列的名称,因为汉字是ASCII码所不能描述的, ORACLE 的核心是 ASCII 编写的
在现有表的基础上创建新表: create table t2 as select * from emp; 这个新表会包括数据
如果不想包含数据,加一个false 的条件选择 create table t2 as select * from emp where 1=0;
修改表结构:
如果列为null,可以随意修改列的类型和宽度。 如果有数据,修改会受到限制,但不会破坏数据。
Alter table t2 modify(name varchar(20)); Alter table t2 add(name varchar(50));
修改表的名称: rename t2 to newTableName
修改列的名称: Alter table t2 rename column c1 to newColumnName
表注释: comment on table t2 is ‘注释内容‘
列注释: comment on column c1 is ‘列注释‘
删除表: drop table t2, 在commit 前,表末真正删除
显示回收站的信息: show recyclebin
将回收站的表还原: flashback table t2 to before drop; flashback table t2 to before drop rename to tt2;
清空回收站内指定的表: purge table t2;
清空当前用户的回收站,不影响其它用户的回收站: purge recyclebin; DML 语句
DML,数据操作语言,insert, update, delete, merge
插入数据: insert into t2(c1,c2,c3) values(v1,v2,v3); 在插入时,没有列出的列,就会插入null,如果该列有defalult 值 ,就会使用默认值 当插入日期的时候, 最好强制转换成日期类型,使用to_date 函数
修改数据: update t2 set c1=‘1‘ where 子句
删除行: delete t2 where 子句
事务: 提交事务: commit; 回滚事务: rollback;
约束: 添加约束: alter table t2 add constraint 约束名称 unique(列名)
alter table t2 add constraint 约束名称 primary key(列名)
alter table t2 add constraint 约束名称 check(length(列)>10)
主键不是必需的,可以没有,主键是通过索引实现的,索引的名称和主键的名称相同 外键:
alter table t2 add constraint 名称 foreign key(列名) references 表名(列名)
级连的外键,主表行被删除,子表的相关列自动被赋予 NULL 值
alter table t2 add constraint 名称 foreign key(列名) references 表名(列名) on delete set null
alter table t2 add constraint 名称 foreign key(列名) references 表名(列名) on delete cascade; 子表相关的列的自动删除
序列:
CREATE SEQUENCE 序列名称
MINVALUE 1
MAXVALUE 999
INCREMENT BY 1
START WITH 1
CACHE 20 --NOCACHE
NOORDER
NOCYCLE ;
序列名称.nextval 序列的下一个值 序列名称.currval 序列的当前值 当序列没有值在内存中时,currval 值无效,先 nextval 后,才会有效 序列的不连续问题: 事务回退,序列号不回退 其它语句引用了该序列 Cache n 序列的值到内存中,一次存放n个值, 默认是20个,如果连续使用,可将n 设置大些 NOCACHE 每次取值都要计算 停止数据库后,内存中存放的序列会丢失 order 在单实例中没有差别,它体现在群集 rac 环境中,它的含义是, 为集群中的每个节点相要获得的序列的值都要重新从序列的定义中计算获得, order 和 CACHE 是相互排斥的,一旦使用的 order 项, CACHE 项会无效。 如果使用序列作主键,请设置 NOCYCLE, 不循环 如果要快速发生序列值,将 CACHE 设置大一些 如果序列要很长时间才能用完, 可以考虑使用循环的序列
八、View 视图
视图的定义存在于数据字典中,Oracle 的所有字典都是视图, 视图只是一个定义,没有独立的数据,数据还是存放在表中 为使用提供了方便 增加了数据的负担 降低了数据库的性能 (如果用不当) 限制对数据库的访问 将复杂的查询包起来,化繁为简 提供给用户独立的数据 在同一个表上建立不同的视图,减少视图的个数 可以从 user_views 中查看所有的视图, user_object 查看所有对象 创建视图: create or replace view 视图名称 as select * from t2 WITH 约束项 Read only 只读 check option constraint 约束名称
删除视图 drop view 视图名称
视图上运行 DML Delete 限制
1.有组的函数
2.有group by 子句
3.用了distinct 关键字
4.有rownum 列
Update 限制
1.有组的函数
2.有group by 子句
3.用了distinct 关键字
4.有rownum 列
5.有表达式的列
Insert 限制
1.有组的函数
2.有group by 子句
3.用了distinct 关键字
4.有rownum 列
5.有表达式的列
6.基表中有not null 的列,但该列没有出现在视图的定义里
Top-n 查询 使用 where rownum <=5 -- 前5条
查询结果的集合操作
并集 union / union all
union all 不进行排序,也不去掉重复的行
uion 进行排序,去掉重复的行
交集 intersect 相同的部分,进行排序,去掉重复的行
补集 minus 第一个表有,第二个表没有的行去掉重复的行
九、 分组
group by 分组,在有 group by 的 select 语句中,不是组的列一定要放在 group by 中
对 group by 结果筛选,使用 having 过滤
rollup
rollup分组,一次全表扫描, group by rollup(列1,列2,列3...,列n),结果集共有 n+1 个
Grouping(列名) 表示该列是否参加了分组操作,0:参加; 1: 末参加
cube
group by cube(列1,列2,列3...,列n),结果集共有 2^n 个
树结构查询
start with 子句,处理层次结构的数据
start with(列1=‘val1‘) connect by prior id=父级id
查询时,删除节点,下级保留
select name from t2
where name<> ‘will‘
start with(id=‘004‘)
connect by prior id=fid
删除节点及其子节点
select name from t2
start with(id=‘004‘)
connect by prior id=fid
and name<> ‘will‘
以上是关于Oracle 学习笔记的主要内容,如果未能解决你的问题,请参考以下文章