参考自下面链接的博主 ,有些地方修改过
添加链接描述# Oracle超详细学习笔记
一、Oracle表的管理
1、创建表
create table 表名()
2、删除表
drop table 表名
3、修改表
alter table 表名
添加列:add (列名 属性)
修改列属性:modify
修改列名:rename column 列名1 to 列名2
删除列:drop column 列名
添加约束:add constraint 约束名 约束内容
4、相关约束
not null
unique
primary key
foreign key
check
5、修改约束名
alter table itlb rename constraint name1 to name2;
6、禁止/激活/删除约束
//禁止约束 (cascaed级联)
alter table itlb disable constraint constaint_name [cascaed];
//激活约束
alter table table_name enable constraint constaint_name ;
//删除约束
alter table table_name drop constraint constaint_name ;
7、显示约束信息
select constraint_ame,table_name,column_name from user_cons_columns where table_name = ‘itlb’;
8、总结
(1)增加unique, parmary key, foreign key, check的时候,必须使用alter table的add子句
(2)增加not null约束,必须使用alter table语句的modify子句
(3)在同一个方案中,约束名必须唯一,并且不能和其他对象重名
二、数据操纵语言(DML)
1、增删改查
与mysql语句相同
2、truncate和delete的区别
1.truncate是DDL(数据定义语言)命令,删除的数据不能恢复,delete是DML命令,删除后的数据可以通过日志文件恢复。
2.如果一个表中数据记录很多,truncate相对较快
三、序列
1、创建序列的方法
create sequence 序列名
[start with num]
[increment by num]
[maxvalue num|nomaxvalue]
[minvalue num|nominvalue]
[cycle|nocycle]
[cache num|nocache]
start with: 从某一个整数开始,升序默认值是 1,降序默认值是-1。
increment by: 增长数。如果是正数则升序生成,如果是负数则降序生成。升序默认值是 1,降 序默认值是-1。 maxvalue/nomaxvalue: 指最大/最小值。
nomaxvalue: 默认最大值是几,升序的最大值是:1027,降序默认值是-1
nominvalue: 默认最小值是几,升序默认值是 1,降序默认值是-1026。
cycle: 循环升序或者降序
nocycle: 不重新开始,序列升序或降序达到峰值后就会报错。默认nocycle。
cache: 使用 cache选项时,该序列会根据序列规则预生成一组序列号。保留在内存中,当使用 下一个序列号时,可 以更快的响应。当内 存中的序列号用完时,系统再生成一组新的序列号,并保 存在缓存中,这 样可以提高生成序列号的效率。Oracle默认会生产 20 个序列号。
nocache: 不预先在内存中生成序列号。
create sequence seqpersonid;
2、获取序列
在创建序列后,用户需要自己获取序列
nextval:取得序列的下一个内容
currval:取得序列的当前内容
dual:Oracle中的虚拟表,用来构成select的语法规则
select seqpersonid.nextval from dual;
select seqpersonid.currval from dual;
3、函数
3.1、单行函数
(1)字符函数
1、ascll(x) 返回字符x的ASCII码。
2、concat(x,y) 连接字符串x和y。
- instr(x, str ,start, [n]) 在x中查找str,可以指定从"start"开始,也可以指定从第n次开始。
- length(x) 返回x的长度。
- lower(x) x转换为小写。
- upper(x) x转换为大写。
- ltrim(x,trim_str) 把x的左边截去trim_str字符串,缺省截去空格。
- rtrim(x,trim_str) 把x的右边截去trim_str字符串,缺省截去空格。
- trim( x from trim_str ) 把x的两边截去trim_str字符串,缺省截去空格。
- replace(x,old,new) 在x中查找old,并替换为new。
- substr(x,start,length) 返回x的字串,从start处开始,截取length个字符,缺省length, 默认到结尾。
- initcap(str) 首字母大写
(2)数字函数
abs(x) x绝对值 abs(-3)=3
acos(x) x的反余弦 acos(1)=0
cos(x) 余弦 cos(1)=1.57079633
ceil(x) 大于或等于x的最小值 ceil(5.4)=6
floor(x) 小于或等于x的最大值 floor(5.8)=5
log(x,y) x为底y的对数 log(2,4)=2
mod(x,y) x除以y的余数 mod(8,3)=2
power(x,y) x的y次幂 power(2,3)=8
round(x[,y]) x在第y位四舍五入 round(3.456,2)=3.46
sqrt(x) x的平方根 sqrt(4)=2
trunc(x[,y]) x在第y位截断 trunc(3.456,2)=3.45
(3)日期函数
1、add_months(d,n) 在日期 d 上,加上月数 n,返回计算后的新日期
2、last_day(d) 返回指定日期当月的最后一天
(4)转换函数
1、select to_date(‘2021-10-29’,‘yyyy-MM-dd’) from table_name
2、tochar(d,fmt)把日期和数字转换为特定格式的字符串,fmt是格式化字符串
3、to_number(x , fmt) 把一个字符串以 fmt 格式转换为一个数字
(5)通用函数
1、nvl(x , value) 如果x为空 , 返回value (备胎) ,否则返回x
2、nav2(x , value1 , value2) 如果x非空 , 返回value1 ,否则返回value2
3、decode 函数,该类函数类似 if…else if…else
decode (col/expression, search1,result1,search2, result2....default);
- col/expression:列名或表达式
- search1,search2…:用于比较的条件
- result1, result2…:返回值
- 如果 col/expression 和 Searchi 匹配就返回 resulti,否则返回 default 的默认值
4、case when
case expr
when comparison_expr1 then return_expr1
when comparison_expr2 then return_expr2
when comparison_exprn then return_exprn
else else_expr
end;
-- 等值判断/范围判断
-- mysql、oracle通用
3.2、聚合函数(多行函数)
AVG 平均值 AVG(表达式)
SUM 求和 SUM(表达式)
MIN、MAX 最小值、最大值 MIN(表达式)、MAX(表达式)
COUNT 数据统计 COUNT(表达式)
四、多表查询
1、基本查询
--查询员工表和部门表
select * from emp,dept;
2、外连接
--列子
左连接:where e.deptno(+) = d.deptno;
右连接:where e.deptno = d.deptno(+);
3、子链接
返回的表当作查询条件
4、Oracle中的伪列
(1)rowid
物理地址
(2)rownum
每次查询都会生成一次的序列号
(3)分页查询
--获取6-10行的数据
select * from
(select rownum rn , e.* from emp e) r
where r.rn >5 and r.rn < 11;
或者
select * from
(select rownum rn , e.* from emp e) r
where r.rn between 6 and 10;
五、Oracle高级
1、视图
创建视图首先需要查询权限:
--查询角色权限sql
select * from role_sys_privs where role='CONNECT';
创建视图的语法:
create view 视图名称 as 子查询
create view empd20 as select * from emp where deptno = 20;
2、索引
触发规则:是where条件必须是索引列的原始值
-- 创建单列索引
CREATE index 索引名 on 表名(列名)
-- 创建多列索引
Create index emp_idx1 on emp(job,ename);
3、PL/SQL
赋值运算符 := Java和C#中都是等号,PL/SQL的赋值是 :=
(1)符号说明
特殊字符 || 字符串连接操作符。
– PL/SQL中的单行注释。
/* , *****/ PL/SQL中的多行注释,多行注释不能 嵌套。
标签分隔符 <<,>> 只为了标识程序特殊位 置。
范围操作符 … 比如:1…5 标识从1到 5
算术运算 符 +,-,*,/ 基本算术运算符。
求幂操作 ** 比如:3**2=9
关系运算 符 >,<,>=,<=,= 基本关系运算符,=表示相等关系,不是 赋值。
不等关系 <>,!=
逻辑运算符 AND,OR,NOT 逻辑运算
(2)变量声明
declare
i number(2) := 66;
begin
dbms_output.put_line(i);
end;
(3)常量声明:constant
declare
pi constant number := 3.14;
r number :=5 ;
area number;
begin
area := power(r,2) * pi;
dbms_output.put_line('圆面积是:' || area);
end;
4、PL/SQL数据类型
(1)标准数据类型
varchar2(长度)
number(精度,小数)
date
timestamp :日期类型
char(长度)
long
boolean
binary_integer
pls_integer :比上一个速度更快
natural
naturaln :不能为空
positive :binary_integer的子类型,正整数
positiven :和positive 一样,但是不为null
real :浮点数
int,integer,smallint :整数
signtype :值有1,-1,0
string :和varchar2相同
(2)属性数据类型
当声明一个变量的值是数据库中的一行或者是数据库中某列时,可以直接使用属性类型来声明。
%rowtype :行
%type :列
5、PL/SQL条件控制和循环控制
(1)条件控制
- if-then
- if-then-else
- if-then-elseif-else
- case :相当于switch
(2)循环控制
loop-end :无条件循环
LOOP
--循环体
END LOOP;
while :循环
WHILE 条件 LOOP
--循环体
END LOOP;
for
FOR 循环变量 IN [REVERSE] 循环下限..循环上限 LOOP
--循环体
END LOOP;
(3)游标
CURSOR 游标名 [ (参数名 数据类型,参数名 数据类型,...)] IS SELECT 语句;
列子:
cursor c1 is select ename from emp;
declare
cursor pc is
select * from emp;
pemp emp%rowtype;
begin
open pc;
loop
fetch pc
into pemp;
exit when pc%notfound;
dbms_output.put_line(pemp.empno || ' ' || pemp.ename);
end loop;
close pc;
end;
六、PL/SQL中动态执行SQL语句
execute immediate 动态语句字符串
[into 变量列表]
[using 参数列表]
七、PL/SQL的异常处理
1、预定义异常
异常名称 异常码 描述
DUP_VAL_ON_INDEX ORA-00001 试图向唯一索引列插入重复值
INVALID_CURSOR ORA-01001 试图进行非法游标操作。
INVALID_NUMBER ORA-01722 试图将字符串转换为数字
NO_DATA_FOUND ORA-01403 SELECT INTO语句中没有返回任何记录。
TOO_MANY_ROWS ORA-01422 SELECT INTO语句中返回多于1条记录。
ZERO_DIVIDE ORA-01476 试图用0作为除数。
CURSOR_ALREADY_OPEN ORA-06511 试图打开一个已经打开的游标
2、语法
BEGIN
--可执行部分
EXCEPTION -- 异常处理开始
WHEN 异常名1 THEN
--对应异常处理
WHEN 异常名2 THEN
--对应异常处理
……
WHEN OTHERS THEN
--其他异常处理
END;
3、自定义异常
异常定义:myexception EXCEPTION;
异常引发:RAISE myexception;
4、子程序
--语法:
create [or replace] procedure 过程名[(参数名 in/out 数据类型)]
{is|as}
--声明部分
begin
--可执行部分
[exception]
--异常处理部分
end [过程名];