Oracle基础笔记
Posted 当时年少春衫薄
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Oracle基础笔记相关的知识,希望对你有一定的参考价值。
=====================================第一章:oracle数据库基础=============================================
Orace特点:
1.跨操作系统,跨硬件平台的数据操作能力
2.支持多用户,大事务量的处理
3.在保持数据安全性和完整性方面的性能优越
4.支持分布式数据处理,具有可移植性
Sqlserver特点:
1.只能在windows上运行
Oracle和Sqlserver两者的共同点:
1.都是关系型数据库
表空间:
1. 一个表空间可以由多个数据文件组成,但一个数据文件只能属于一个表空间
数据库文件扩展名为:【.dbf】
控制文件的扩展名为:【.ctl】
日志文件的扩展名为:【.log】
-------------------------------------------------------------
数据类型:
char-------1-2000字节,默认是一个字节
varchar2---1-4000字节,可变长度字符串
nchar------国家字符集,用来存储Unicode字符集类型
Nvarchar---可变长的国际字符串
number(p,s)-----【p】表示数字的有效位数[1-38位数之间],从左边第一个不为0的数算起,小数点和负号不计入有效位数
【s】表示数字的小数位数
Date------------使用7字节固定长度,返回了世纪 【SysDate】函数的功能是返回当前的日期和时间
TimeStamp-------用来存储日期的,年,月,日,小时,分钟,秒,精确到小数点后6位
【SysTimeStamp】函数返回的是当前的日期和时区
Lob------------大对象数据类型,可以存储多达4GB的非结构信息
分为:
Clob:存储大量的字符数据,如新闻,内容介绍
Blob:存储较大的二进制对象,如图片,视频,声音等
Bfile:支持的文件最大位4GB,存储的是一个Bfile定位器
BClob:存储大的Nchar字符数据,最大4GB与CLob类似
------------------------伪列--------------------------------------
rowID:
1.返回该行地址
2.能以最快的方式访问表中的一行
3.能显示表的行是如何存储的
4.可以作为表中行的唯一标示
语法: select rowID,eName
from scott.emp
where eName=‘SMITH‘
rowNum:
1.返回一个数值代表行的次序
2.总是从1开始的伪列
3.大于某列查不出数据
4.只能等于1
语法:select emp.* rownum
from scott.emp
where rownum<11
---------------------------------数据定义语音DDL-------------------------------
-------创建表create table-----
语法:
create table Stuinfi
(
stuName varchar2(20) not null,
stuAge number(3,0) not null,
stuID number(18,0) ,
stuSeat number(2,0)
)
-----删除表的记录而不删除表的结构:truncate table-----
语法:
truncate table student
------------------------------数据操纵语言DML-----------------------------------
忽略重复行:[distinct]
语法:
select distinct name,age
from student
创建新表:
create table student_1
as
select*from student
user_all_tables:为系统提供的数据视图
-------------------------------------
查看用户所以数据量大于100的表的信息
select table_name
from user_all_tables a
where a.num_rows>100
------------------------------事务控制语言TCL-------------------------------------
commit:提交事务
rollback:回滚事务
savepoint:在事务中创建存储点
-----------------------------------集合操作符----------------------------
注意事项:
1.通过集合操作符链接的各个查询具有相同的列数,而且对应列的数据类型必须兼容
2.这种查询不应含有long类型的列,列标题来自第一个select语句
Union【并集】:返回两个查询所有不重复的行
UnionAll【并集ALL】:返回两个查询的所有行
intersect【交集】:返回两个查询都有的行
minus【减集】:返回两个查询中第一个查询里面所有的列
语法:
select stuNo from student
union
select stuNo from subject
--------------------------------链接操作符【||】-----------------------
||操作符:
将两个或多个字符串合并成一个字符串,或将一个字符和一个数值合并在一起
示例:
select jon||‘_‘||ename from student
------------------------------函数--------------------------------------
函数的几大类:
1.单行函数
1.字符函数
2.日期函数
3.数字函数
4.转换函数
2.聚合函数
3.分析函数
转换函数:
1.TO_char 转换成字符串类型【dual--伪表】
示例:
select To_char(sysdate,‘ YYYY"年"fmMM"月"fmDD"日" HH24:MI:SS ‘) from dual
结果:2013年7月10日 21:21:22
不使用fm填充 月份会自动补0
2.TO_Date 转换成日期类型
示例:
select To_date(‘2013-03-13‘,‘yyyy-mm-dd‘) from student
结果:
2013-03-13
3.TO_Number 转换成数值类型
其他函数:【转换空值】
nvl(stu-1,stu-2)-----------如果stu-1的值为null,则返回stu_2,否则返回stu-1的值
nvl2(stu-1,stu-2,stu-3)----如果stu-1的值为null,则返回stu-2的值,否则返回stu-3的值
decode(value,if-1,then-1,if-2,then-2,...,else)
如果value的值为if-1,则返回then-1的值,以此类推,否则返回else的值
注意:
任意值与null值进行“+”运算,结果为null
分析函数:
Row_number:返回一个唯一的值,有相同数据时,[按照记录集中的记录的顺序依次递增]
dense_rank:返回一个唯一的值,有相同数据时,[所以相同数据的排名都是一样的]
rank:返回一个唯一的值,有相同数据时,[所以相同数据的排名都是一样的,同时会在最后一条相同记录和下一条不同记录的排名之间空出排名]
语法示例:
select ename,
deptno,
sal,
row_number() over(Partition by deptno order by sal desc) "row_rownum",
dense_rank() over(Partition by deptno order by sal desc) "dense_rank",
rank() over(Partition by deptno order by sal desc) "rank"
from Employee
===============================================第二章=======================================================
***************************************************表空间*******************************************
类别:
1.永久性表空间------>默认安装,用来存储表,视图,过程,索引等
2.临时性表空间------>保持系统短期活动的数据,如排序数据等
3.撤销性表空间------>用来帮助回退未提交的事务数据
--------创建表空间语法:【多个用逗号隔开】----------
create tablespace sample
datafile ‘E:\OracleDB\TableSpace\sample.dbf‘
size 10M
Autoextend on;
---------修改改数据大小的语法:--------------------
alter database
datafile ‘E:\OracleDB\TableSpace\sample.dbf‘
resize 10M
----------向表空间添加数据文件---------------
alter tablespace sample
add datafile ‘E:\OracleDB\TableSpace\sample01.dbf‘
size 5M
Autoextend on
----------添加表空间只读--------------------------
alter tablespace sample readonly;
----------查看表空间信息:-----------------
select file_name,
tablespace_name,
bytes,
autoextensible
from dba_data_files
where tablespace_name=‘表空间名称‘;
----------删除表空间信息------------------
----没数据的时候删除的方法
1:drop tablespace sample
----包含数据时删除的方法【注意备份数据】
2:drop tablespace sample including contents
--------------注意:------------------------------
2.出现错误号01029,使用sysdba登录运行一下脚本
-----步骤1
alter database open;
-----步骤2
alter database datafile ‘E:\java\Oracle\ch02\sample.DBF‘ offline drop;
*******************************************自定义用户管理***********************************************
-----------创建一个新的自定义用户----------------------
create user accp --用户名称
identified by accp --密码
default tablespace sample --物理表空间
temporary tablespace temp; --临时表空间
-----------修改用户信息--------------------------
alter user accp
identified by accp_Pwd
----------删除自定义用户--------------------------------
drop user accp cascade
********************************************数据库权限管理*********************************************
常见的系统权限:
1.create session------------连接到数据库
2.create table--------------创建表
3.create view---------------创建视图
4.create sequence-----------创建序列
对象权限:
1.connect-------连接数据库
2.resource-----可以创建表,数据库,存储过程等
3.dba----------数据库管理员角色,最高权限
-----------------------------授权:分配系统权限--------------------------------------------------
---授予用户创建表,视图,表空间,序列的权限到accp用户
grant create session,
create table,
Create view,
create user,
create Sequence to accp;
--授予单个权限到accp用户
grant create Tablespace to accp;
grant drop Tablespace to accp;
grant drop user accp;
---将链接权限授予所有用户
grant create session to public
--使被授予者进一步将权限或角色授予其他用户或角色
grant create session,
create table,
create view,
create Sequence to accp with admin option --支持管理员选项
--撤销权限-来自accp用户
revoke create user from accp;
----------------------------------授权:对象权限---------------------------------------------
--连接数据库的角色,多个角色有","号隔开
grant connect to accp;
--一般角色
grant resource to accp;
---最高角色
grant dba to accp;
------撤销权限
revoke connect from accp;
--授予用户accp修改System模式下emp表的权限
grant update on scott.emp to accp;
---授予用户accp对于emp表的增删改查权限
grant all on scott.emp to accp with grant option;
---查看权限
select * from DBA_SYS_PRIVS where grantee =‘accp‘;
**********************************************序列********************************************************
-------在accp用户中插入student表
create table accp.student
(
stuNo number not null primary key,
stuName varchar(20) not null,
stuAge number(3) not null
)
----创建序列,从序号10开始,每次增加1,最大位2000,不循环,缓存为30
create sequence accp.seq_stuNo
Start with 10
increment by 1
maxvalue 2000
Nocycle
cache 30;
------删除序列
drop sequence accp.sql_stuNo
-----更改序列:---不能修改start with 参数
alter sequence accp.Seq_Stuno
Increment by 2
-----插入数据[nextval]
insert into accp.student
values(seq_stuNo.nextval,‘小白‘,10)
----查看序列当前值
select accp.Seq_Stuno.Currval from dual
----查看所有序列
select sequence_name from dba_sequences
select sequence_name from ALL_SEQUENCES;
select sequence_name from USER_SEQUENCES;
select sequence_name from DBA_SEQUENCES;
----插入数据
insert into accp.Student values(accp.Seq_Stuno.nextval,‘小白‘,10);
insert into accp.Student values(accp.Seq_Stuno.nextval,‘小白‘,10);
insert into accp.Student values(accp.Seq_Stuno.nextval,‘小白‘,10);
insert into accp.Student values(accp.Seq_Stuno.nextval,‘小白‘,10);
commit;
*******************************************同义词********************************************************
同义词的用途:
1.简化SQL语句
2.隐藏对象的名称和所有者
3.为分布式数据库的远程对象提供了位置透明性
4.提供对对象的公共访问
分类:
1.私有同义词----只能被当前模式的用户访问,创建时必须拥有create synonym系统权限
2.公有同义词----能被所有数据库用户访问,创建时必须拥有create public synonym系统权限
--授予accp创建同义词的权限
grant create synonym to accp;
grant create public synonym to accp;
grant create any synonym to accp;
------创建私有同义词
create or replace synonym stu
for accp.Student
----创建公有同义词
create or replace public synonym stu
for student
select*from stu
-------删除同义词
drop synonym stu
drop public synonym stu
****************************************************视图*************************************************
--获得create view权限
create or replace view v_myorders
as
select *
from orders
where sales_rep_id=(select empno
from employee
where ename=(select user from dual));
select * from v_myorders;
--当前用户a_hr
create or replace view v_employee
as
select empno,ename,e.deptno,dname
from employee e inner join dept d
on e.deptno=d.deptno;
***************************************************索引*************************************************
-----在sample表空间的student表里创建B树索引
create unique index idx_unique_stuNo on Student(stuName)
tablespace sample;
--在sample表空间的student表里创建位图索引
create bitmap index idx_bitmap_stuName on student(Stuage)
tablespace sample;
------------------主键列创建反向键索引
create unique index idx_empno on employee(empno) reverse; --先创建反向键索引
--主键引用反向键索引
alter table employee add constraint pk_empno primary key(empno) using index idx_empno;
----------删除索引
drop index idx_unique_stuNo
---------重建索引:将反向键索引重建成B数索引
alter index idx_uinque_stuNo Rebuild noreverse
-------移动索引到那个表空间里面
alter index idx_unique_stuNo rebuild tablespace sample
*****************************************分区表**********************************************************
分区表的优点:
1.改善表的查询性能
2.更容易管理
3.便于备份和恢复
4.提高了数据的安全性
分区表的几大类:
1.范围分区
2.列表分区
3.散列分区
4.复合分区
5.间隔分区 --oracle 11g的新增特性
6.虚拟分区 --oracle 11g的新增特性
注意:分区删除,里面的数据也会随之删除
------------创建分区表(按范围分区)
create table sales_range1
(sales_id number not null,
product_id varchar2(5),
sales_date date,
sales_cost number(10),
areacode varchar2(5)
)
partition by range(sales_date)
(partition part1 values less than (to_date(‘2011/01/01‘,‘yyyy/mm/dd‘)),
partition part2 values less than (to_date(‘2012/01/01‘,‘yyyy/mm/dd‘)),
partition part3 values less than (to_date(‘2013/01/01‘,‘yyyy/mm/dd‘)),
partition part4 values less than (to_date(‘2014/01/01‘,‘yyyy/mm/dd‘))
)tablespace sample;
--查询分区情况
select table_name,partition_name
from user_tab_partitions
where table_name=upper(‘sales_range1‘);
--插入数据
insert into sales_range1 values (1000,‘p1‘,to_date(‘2011-01-01‘,‘yyyy-mm-dd‘),1000,‘a1‘);
--查询数据
select * from sales_range1 partition (part3);
--------------------以有表创建分区
create TABLE sales_range2
partition by range(sales_date)
(partition part1 values less than (to_date(‘2011/01/01‘,‘yyyy/mm/dd‘)),
partition part2 values less than (to_date(‘2012/01/01‘,‘yyyy/mm/dd‘)),
partition part3 values less than (to_date(‘2013/01/01‘,‘yyyy/mm/dd‘)),
partition part4 values less than (to_date(‘2014/01/01‘,‘yyyy/mm/dd‘))
Partition part5 values less than(maxvalue)
)tablespace sample
as select * from sales_range1;
select*from sales_range2 partition(part2)
-----------------------间隔分区------------------------
create table sales_interval1
(sales_id number not null,
product_id varchar2(5),
sales_date date,
sales_cost number(10),
areacode varchar2(5)
)
partition by range(sales_date)
interval(numtoyminterval(1,‘year‘))
(partition part1 values less than (to_date(‘2011/01/01‘,‘yyyy/mm/dd‘)));
--查询分区情况
select table_name,partition_name,tablespace_name
from user_tab_partitions
where table_name=upper(‘sales_interval1‘);
insert into sales_interval1 values (1000,‘p1‘,sysdate,2000,‘a2‘);
select * from sales_interval1 partition (sys_p142);
--现有表创建新表
create table sales_interval2
partition by range(sales_date)
interval(numtoyminterval(1,‘year‘))
(partition part1 values less than (to_date(‘2011/01/01‘,‘yyyy/mm/dd‘)))
as select * from sales;
/*
===========================================================
| 分区表的管理
============================================================
*/
--查询分区情况
select table_name,partition_name
from user_tab_partitions
where table_name=upper(‘sales_range1‘);
select * from sales_range1 partition (part1);--11前
select * from sales_range1 partition (part2);--12前
select * from sales_range1 partition (part3);--13前
select * from sales_range1 partition (part4);--14前
--插入数据
insert into sales_range1 values (2000,‘p1‘,to_date(‘2014-01-01‘,‘yyyy-mm-dd‘),1000,‘a1‘);
--添加分区
alter table sales_range1 add partition part5 values less than (to_date(‘2015-01-01‘,‘yyyy-mm-dd‘));
alter table sales_range1 add partition part6 values less than (maxvalue);
select * from sales_range1 partition (part5);--15前
--删除分区
alter table sales_range1 drop partition part5
select * from sales_range1 where sales_id=2000;
--移动分区
alter table sales_range1 move partition part1 tablespace tp_sales_bak;
--表空间只读后测试插入数据,失败。
insert into sales_range1 values (3000,‘p1‘,to_date(‘2009-01-01‘,‘yyyy-mm-dd‘),1000,‘a1‘);
--表空间
create tablespace tp_sales_bak
datafile ‘d:\data\tp_sales_bak.dbf‘ size 100m;
alter user a_oe quota unlimited on tp_sales_bak;
--移动完表空间后将表空间设置为只读
alter tablespace tp_sales_bak read only;
alter tablespace tp_sales_bak read write;
==================================================第3章:PL/SQL编程==========================================
PL/SQL:
1.结合了oracle过程语言和结构化查询语言的一种扩展语言
2.能把一组SQL语句放到一个模块中,使其更具模块化程序特点
3.可采用过程语言控制程序的结构
4.对错误进行自动处理
5.具有更好的可移植性
6.减少了网络的交互,有助于提高程序的性能
PL/SQL:【分成三部分】
1.声明部门--declare
2.执行部门--begin end
3.异常处理--exception
属性类型:
%type-------不必知道数据类型
%rowtype----不必知道列的个数和数据类型
赋值方法【两种方式】:
1.v_name:=‘aa‘;
2.select ename into v_name from student where stuno=1;
异常:
1.预定义异常
2.用户自定义异常
--进行预异常处理
declare
v_ename employee.ename%type;
begin
select ename into v_ename
from employee
where empno=1234;
dbms_output.put_line(‘雇员名:‘||v_ename);
exception
when no_data_found then
dbms_output.put_line(‘雇员号不正确‘);
when too_many_rows then
dbms_output.put_line(‘查询只能返回单行‘);
when others then
dbms_output.put_line(‘错误号:‘||sqlcode||‘错误描述:‘||sqlerrm);
end;
----用户自定义异常
declare
v_comm employee.comm%type;
e_comm_is_null exception; --定义异常类型变量
begin
select comm into v_comm from employee where empno=7788;
if v_comm is null then
raise e_comm_is_null;
end if;
exception
when no_data_found then
dbms_output.put_line(‘雇员不存在!错误为:‘||sqlcode||sqlerrm);
when e_comm_is_null then
dbms_output.put_line(‘该雇员无补助‘);
when others then
dbms_output.put_line(‘出现其他异常‘);
end;
--需求:修改编号为7788的雇员所属的部门编号为99。
--前提是要在employee和dept表建立主外键约束
alter table employee
add constraint pk_empno primary key(empno);
alter table dept
add constraint pk_deptno primary key(deptno);
alter table employee
add constraint fk_deptno foreign key(deptno) references dept(deptno);
declare
e_integrity exception;
pragma exception_init(e_integrity,-2291); -- -2291为oracle定义的错误号,违背了主外键约束
begin
update employee set deptno=99 where empno=7788;
exception
when e_integrity then
dbms_output.put_line(‘该部门不存在‘);
end;
select * from employee;
以上是关于Oracle基础笔记的主要内容,如果未能解决你的问题,请参考以下文章