0
点赞
收藏
分享

微信扫一扫

Oracle超详细学习笔记

豆丁趣 2022-01-07 阅读 125

参考自下面链接的博主 ,有些地方修改过
添加链接描述# 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。

  1. instr(x, str ,start, [n]) 在x中查找str,可以指定从"start"开始,也可以指定从第n次开始。
  2. length(x) 返回x的长度。
  3. lower(x) x转换为小写。
  4. upper(x) x转换为大写。
  5. ltrim(x,trim_str) 把x的左边截去trim_str字符串,缺省截去空格。
  6. rtrim(x,trim_str) 把x的右边截去trim_str字符串,缺省截去空格。
  7. trim( x from trim_str ) 把x的两边截去trim_str字符串,缺省截去空格。
  8. replace(x,old,new) 在x中查找old,并替换为new。
  9. substr(x,start,length) 返回x的字串,从start处开始,截取length个字符,缺省length, 默认到结尾。
  10. 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 [过程名];
举报

相关推荐

0 条评论