ORCALE 相关操作

◇◆丶佛笑我妖孽 提交于 2020-04-02 15:12:24

卸载:
1,关闭oracle所有的服务。
打开注册表:regedit
打开路径:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\
删除该路径下的所有以oracle开始的服务名称

 

2,打开注册表
路径:
HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE
删除该oracle目录

3,删除注册表中关于oracle的事件日志注册项:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Application\
删除以oracle开头的所有内容

4,删除环境变量path中关于oracle的内容。
重新启动操作系统
删除Oracle_Home下的所有数据
删除C:\Program Files下oracle目录

5,删除开始菜单下oracle项
C:\Documents and Settings\All Users\「开始」菜单\程序\Oracle - Ora92

--Orcale启动与关闭
------------------------------------------------------

--启动oracle数据库服务
net start oracleserviceora92

--启动oracle监听服务
lsnrctl start

--停止oracle监听服务
lsnrctl stop

--停止oracle数据库服务
net stop oracleserviceora92

--启动数据库
SQL> startup;

--挂接数据库(只启动参数文件,不能建立数据库)并显示SGA(system global area Oracle的内存空间结构)
SQL> startup nomount;

--加载控制文件(可以转存日志文件)
SQL> alter database mount;

--完全打开数据库
SQL> alter database open;

--强制启动数据库
SQL> startup force;

--关闭Oracle系统服务
SQL>shutdown;

--关闭数据库(等待事务完毕)
SQL> shutdown immediate;

--直接关闭数据库(不安全关闭数据库)
SQL> shutdown abort;

--断开当前连接
SQL> disconnect;

------------------------------------------------------
--Oracle基本命令
------------------------------------------------------

--使用sqlplus,只进入,不连接数据库
sqlplas /nolog

--sys超级管理员登录
sql>conn sys/aaa as sysdba

--普通管理员登录
sqlplus system/manager

--普通用户登录
scott/tiger

--创建用户
create user test identified by abc;
create user aaa identified by "1109056";

--分配给用户基本权限connect(基本连接)和resource(程序开发)
grant connect,resour to test;

--收回分配给用户的权限
SQL> revoke connect,resource from yangjuqi;

--删除用户test1(以管理员身份)
SQL> drop user test1 cascade;

--用户test访问远程数据库实例ABC(连接本机去掉@ABC)
conn test/abc

--强制系统日志切换
SQL> alter system switch logfile

--创建表
SQL> create table tblemp
2 (
3 empid number(4) primary key,
4 empname varchar2(30) not null,
5 empemail varchar2(50) not null,
6 empdate date,
7 levelid number(4)
8 ); //建立表 tblemp

SQL> create table tbllevel
2 (
3 levelid number(4),
4 levelname varchar(30)
5 ); //建立表 tbllevel

--插入数据
insert into tblemp values(1,'aa,'aa@126.com',to_date('1982-11-07','yy-mm-dd'),1);
insert into tblemp values(2,'bb','bb@126.com',to_date('1980-12-20','yy-mm-dd'),1);
--提交(增,删 ,改的时候需要提交)
commit;

--修改数据
SQL> update tbl_1 set semail='110' where sid=1;

--删除数据
SQL> delete from tbl_1 where sid=1;

--删除表中的全部数据(释放表空间)
truncate table tblstudent;

--查询表tblemp
SQL> select * from tblemp;

--查询前10条记录
SQL> select * from tblstu where rownum<11;

--查看表结构
SQL> desc tblstudent;

--为基表添加新列(为tbl_1表添加age列,数据类型number)
SQL> alter table tbl_1
2 add(age number(3));

--修改基表列定义
SQL> alter table tbl_1
2 modify(age number(2));

--删除表tbl_1及其所有的约束条件
drop table tbl_1 cascade constraints;

--执行文件(写好的sql代码)
SQL> @C:\1.sql execute;

--将表中的数据写入文件(如果指定的文件不存在,系统将新建文件)
SQL> spool c:\1.txt
SQL> select * from tt;
SQL> spool off

--在查询信息中 列出伪列rowid(行的内存地址)
SQL> select rowid,t.* from (select * from tblemp) t;

--分页查询数据(查询第6,7,8,9,10共5条记录)
SQL> select * from (select rownum rid,t.* from tblemp t where rownum <=10) where rid>5;

--向一个表中插入另一个表的记录
SQL> insert into t select * from tblemp;

--设置回滚点
SQL> savepoint tl;

--回滚事务
SQL> rollback;

--连接字符串
SQL> select '中国人'||'我也是' from dual;

--复制表结构
SQL> create table ttt as select * from emp where 1=2;

--将表tblemp的所有操作权限授于aaa用户
SQL> grant all on tblemp to aaa;

--查询其他用户的表
SQL> select * from yangjuqi.tblemp;

--创建同义词aaa_tblemp
SQL> create synonym aaa_tblemp for yangjuqi.tblemp;

--通过同义词查询表tblemp
SQL> select * from aaa_tblemp;

--删除同义词
SQL> drop synonym aaa_tblemp;

--创建序列
SQL> create sequence ssl;

--创建序列(从100001开始每次加1)
SQL> create sequence list_1
2 start with 100001
3 increment by 1;

--创建序列
create sequence mysequence
increment by 2 --增长的幅度
start with 1 --基数
maxvalue 20 --最大值
cycle --允许循环
cache 2 --使用缓存

--查看序列的当前值
SQL> select ssl.currval from dual;

--查看序列的下一个值
SQL> select ssl.nextval from dual;

--删除序列
SQL> drop sequence ssl;

--创建视图
SQL> create or replace view view_1
2 as
3 select empname,empsex,empdate,empaddr,depname
4 from tblemp a,tbldep b
5 where a.depid=b.depid;

--重新编译视图(在视图修改后)
SQL> alter view view_1 compile;

--删除视图
SQL> drop view view_emp;

--创建唯一索引
SQL> create index index_s on tblss(ssdate);

--创建组合索引
SQL> create index index_s1 on tblss(ssname,ssdate);

--创建位图索引
SQL> create bitmap index bit_sex on tblss(sex);

--删除索引
SQL> drop index index_s;

--使用%rowcount进行修改和删除行统计
begin
update aaa set aaname='accp'
where aaid='1';
Dbms_Output.put_line('更新了' || sql%rowcount || '行');
end;
commit;

--定义时间戳类型数据
declare
date_1 timestamp with time zone; --声明一个变量为时间戳类型
begin
date_1:=to_timestamp_tz('2006-09-30 09:02:01','yyyy-mm-dd hh:mi:ss');
dbms_output.put_line(date_1); --输出语句
end;

--大字符类型clob操作
create table tblb
(
bid number(4),
bname varchar(20),
bmsg clob
)

insert into tblb values (2,'aaa','我爱你美丽的上海');
commit

declare
str clob;
strs varchar2(255); --定义一个字符串类型变量,用于存放clob类型的内容
length int:=255; --读取255个字符的数据
startfrom int:=1; --一次读取一个字符
begin
select bmsg into str from tblb where bid=2;
--使用dbms_lob.read()方法读取clob数据
dbms_lob.read(str,length,startfrom,strs);
dbms_output.put_line(strs);
end;

--自定义类型的使用(面向对象)
create or replace type ADDRESS_1 as object(
shengfen varchar2(20),
chengshi varchar2(20),
jiedao varchar2(20)
)

declare
a address_1:=address_1('陕西省','西安市','南二环东段');
begin
dbms_output.put_line('省份(shengfen):' || a.shengfen);
dbms_output.put_line('城市(chengshi):' || a.chengshi);
dbms_output.put_line('街道(jiedao):' || a.jiedao);
end;

--引用类型(%type)列引用
declare
name_1 tblemp.empname%type;--指定变量name_1和tblemp.empname是同一个类型,具体是是么类型则不声明
begin
select empname into name_1 from tblemp where empid=7;
dbms_output.put_line(name_1);
end;

--引用类型(%rowtype)行引用
declare
cursor my_cur is select * from tblemp;
--cursor定义的是显式游标,手动打开关闭;sql是隐式游标,自动打开关闭()
myrs tblemp%rowtype;--myrs是一个对象,包含一个表中某一行的各字段的值
begin
open my_cur;
loop
fetch my_cur into myrs;--用游标将指向的记录的各字段值赋给myrs
dbms_output.put_line(myrs.empname);--输出myrs的empname属性的值
exit when my_cur%notfound;--loop循环中的满足条件退出循环语句
end loop;
dbms_output.put_line('The count of rs are:' || my_cur%rowcount);--rowcount为游标四个属性之一
close my_cur;
end;

--异常处理
declare
empname tblemp.empname%type;
begin
--查询一条不存在的记录并赋值,赋值失败
select empname into empname from tblemp where empid=200;
--本语句的结果集中若不足或超过1条记录则报错,因为要把记录的某一字段的值赋给变量
exception
when no_data_found then--捕获异常
dbms_output.put_line('没有找到记录,赋值失败!');
end;

--自定义异常
declare
money tblemp.money%type;
myexp exception;--自定义异常类型
begin
select money into money from tblemp where empid=100;
if money<5000 then
raise myexp;--raise关键字用于抛异常
end if;
exception--异常捕获和处理
when no_data_found then--异常类型no_data_found
dbms_output.put_line('没有找到数据!');
when myexp then--异常类型myexp
dbms_output.put_line('money的值太小!');
end;

--自定义异常编号
declare
null_money exception; --声明自定义异常
pragma exception_init(null_money,-20001);--将自定义异常和异常编号绑定
begin
declare
c_money number;
begin
select money into c_money from tblemp where empid=&empid;--从键盘获取参数
if c_money is null then
--如果查询结果为空,抛出异常
raise_application_error(-20001,'error');
else
dbms_output.put_line('有工资');
end if;
end;
exception
when null_money then
dbms_output.put_line('不知道工资');
end;

--隐式游标(sql%)--特点:1自动打开,自动关闭 2只应用于查询语句 3有sql%notfound sql%found sql%isopen sql%rowcount 四种属性
begin
delete from tblemp where empid=15;
if sql%notfound then
dbms_output.put_line('没有找到数据');
else
dbms_output.put_line('找到并删除!');
end if;
end;

declare
money tblemp.money%type;
begin
select money into money from tblemp where empid=14;
if sql%rowcount=1 then
dbms_output.put_line('工资是:' || money);
else
dbms_output.put_line('查询出多条记录!');
end if;
exception
when no_data_found then
dbms_output.put_line('没有任何数据!');
end;

--显式游标
declare
addmoney int:=100;
cursor myemp is select empname from tblemp; --声明游标
myname tblemp.empname%type;
begin
open myemp; --打开游标
loop
fetch myemp into myname; --使用游标循环更新数据
update tblemp set money=money+addmoney where empname=myname;
--addmoney:=addmoney+100;
exit when myemp%notfound;
end loop;
dbms_output.put_line('工资已经递增更新!');
close myemp; --关闭游标
end;

commit

declare
cursor test is select * from tblemp where empname='寇勇';
myrs tblemp%rowtype; --引用类型,行类型
begin
open test;
loop
fetch test into myrs;
exit when test%notfound;
end loop;
dbms_output.put_line('表中共有:'||test%rowcount);
close test;
end;

--循环游标(自动打开和关闭)
declare
cursor mycur is select depid from tblemp;
ind number:=0;
begin
for rsc in mycur
loop
ind:=ind+1;
end loop;
dbms_output.put_line('总共有记录:'||ind);
end;

create table temp
(
empid number(4),
empname varchar2(30),
money number
)

declare
cursor emp_cur is select empid,empname,money from tblemp;
begin
for ss in emp_cur loop
insert into temp values(ss.empid,ss.empname,ss.money);
end loop;
end;

select * from temp;

--触发器(表级触发器)
create or replace trigger mytrigger
before insert or update of money --当插入或更新影响到money列的时候触发
on tblemp
referencing old as old_value --old和new 是oracle的特殊表相当于sqlserver的inserted 和deleted
new as new_value
for each row
when (new_value.empid>10)
begin
dbms_output.put_line('打印一句话');
end;

update tblemp set money=2900 where empid=12

--触发器(插入,更新,删除)
create or replace trigger trigger_2
before insert or update or delete
on tblemp
referencing new as new_value
for each row --每执行一行都触发
begin
dbms_output.put_line(:new_value.empname);--宿主变量
dbms_output.put_line(:old.empname);
end;

select * from tblemp;

insert into tblemp values (17,'党小东',1,to_date('1979-10-25','yyyy-mm-dd'),'陕西省周至县',4,2680);
update tblemp set money=5600 where empid=15;
delete from tblemp where empid=17

--触发器(判断用户权限)
create or replace trigger trigger_3
before insert or update or delete
on tblemp
begin
if user not in('YANGJUQI') then --如果当前用户不是YANGJUQI就抛出系统异常
raise_application_error(-20008,'您无权修改该表记录!');
end if;
end;

update tblemp set money=5800 where empid=15;

--删除触发器
drop trigger trigger_1;

--禁用
alter trigger trigger_1 disable;

--启用
alter trigger trigger_1 enable;

--禁用一张表上的所有触发器
alter table tblemp disable all triggers;

--启用一个表的所有触发器
alter table tblemp enable all triggers;

--查看所有用户触发器信息
select * from user_triggers;

--引用游标(ref 无返回值)
declare
type r1_cur is ref cursor;--定义一个游标类型
var1 r1_cur;--定义一个游标对象
ono varchar2(30);
no number;
qord number;
begin
no:='&no';--从键盘接收值
if no=1 then

open var1 for select empname from tblemp where empid=14;--将游标和sql语句绑定
fetch var1 into ono;
dbms_output.put_line('姓名是:'||ono);
close var1;
else
open var1 for select money from tblemp where empid=12;

loop
fetch var1 into qord;
exit when var1%notfound;
dbms_output.put_line('工资是:'||qord);
end loop;
close var1;
end if;
end;

--引用游标(ref 有返回值)
declare
--定义一个记录类型
type ordertype is record(
depid number(2),
dname varchar(14));
order_rec ordertype;

type ordercur is ref cursor return tbldep%rowtype;
order_cv ordercur;

begin
--通过游标将查询出的结果便利并显示出来
open order_cv for
select * from tbldep
where depid=3;
loop
fetch order_cv into order_rec;
exit when order_cv%notfound;
dbms_output.put_line('这些值是'|| order_rec.depid ||' ' || order_rec.dname );
end loop;
close order_cv;
end;

--过程(无返回值)
create or replace procedure UpdateMoney(per number,var_empid number)
is
empname tblemp.empname%type;
money tblemp.money%type;
oldmoney tblemp.money%type;
begin
--保存原来的工资
select money into oldmoney from tblemp where empid=var_empid;
--根据参数更新员工的工资
update tblemp set money=money+(money*per) where empid=var_empid;
--获得更新后的工资
select empname,money into empname,money from tblemp where empid=var_empid;
--输出原来的工资和更新后的工资
dbms_output.put_line(empname || '原来的工资是:¥'|| oldmoney || ',更新后的工资是:¥'|| money);
exception
when no_data_found then
dbms_output.put_line('没有找到数据!');
end;

--(在命令窗口)执行过程
execute UpdateMoney(0.2,1);

--函数(有返回值而且必须返回值)
create or replace function
fhanshu(a out int,b int) return int
as
begin
a:=a+1;
return b+1;
end fhanshu;

--执行函数
declare
a int:=10;
c int;
begin
c:=fhanshu(a,10);
dbms_output.put_line(c);
dbms_output.put_line('a>>'||a);
end;

--程序包的创建和使用

--创建程序包主体-----------第一步
create or replace package testpak
is
n int:=10;
procedure mysub(n int);
function myfunc(n int) return varchar2;
end testpak;

--创建程序包主体,包体中的资源都是私有的----------第二步
create or replace package body testpak
as
procedure mysub(n int)
is
begin
dbms_output.put_line(n*n);
end mysub;

function myfunc(n int) return varchar2
is
begin
return n+1;
end myfunc;
end testpak;

--调用包中的过程和方法----------第三步
declare
begin
testpak.mysub(10);
end;

--调用包中的函数---------------第四步
declare
c varchar2(20);
begin
c:=testpak.myfunc(2);
dbms_output.put_line(c);
end;

--基于游标(有问题,需要处理)
create or replace package cur_pack is
cursor tbldep_cur return tbldep%rowtype;
procedure showNo(var_tbldepno int);
end cur_pack;
/

create or replace package body cur_pack
is
cursor tbldep_cur return tbldep%rowtype is select * from tbldep;
procedure showNo(var_tbldepno int) is
tbldep tbldep%rowtype;
begin
open tbldep_cur;
loop
fetch tbldep_cur into tbldep;
exit when tbldep_cur%notfound;
dbms_output.put_line(tbldep.dname);
end loop;
end showNo;
end cur_pack;
/

exec cur_pack.showNo(1);
/

--dbms_output包
declare
buf varchar2(255);
st integer;
begin
--dbms_output.enable(100000);--缓冲区大小
--dbms_output.put_line('welcome');
--dbms_output.put('to');
--dbms_output.put('xf');
--dbms_output.new_line; --换行输出(光标定位于下一行)
--dbms_output.put_line('center');
--dbms_output.get_line(buf,st);
--dbms_output.put_line(buf);
--dbms_output.put_line(st);
end;

------------------------------------------------------------------------------------------
-- Oracle流程控制
------------------------------------------------------------------------------------------

--条件语句(if)
--使用(变量 数据类型:=值)的方法赋值
--使用(变量 || '字符')的类型连接字符串
declare
n1 int:=10;
n2 int:=5;
begin
if n1>n2 then
dbms_output.put_line(n1 || '>' || n2);
else
dbms_output.put_line(n1 || '<' || n2);
end if;
end;

--条件语句(case)
declare
a int:=100;
b int:=200;
po char:='/';
begin
case po
when '*' then dbms_output.put_line(a*b);
when '/' then dbms_output.put_line(a/b);
when '+' then dbms_output.put_line(a+b);
when '-' then dbms_output.put_line(a-b);
else dbms_output.put_line('不能计算');
end case;
end;

--使用条件语句case返回数据
SELECT avg(case
when a.money > 3000 THEN a.money
when a.money > 4000 then 4000
when a.money > 5000 then 5000
else 0
end) "平均工资"
from tblemp a

--循环语句(for)
declare
i int:=1;
n int:=0;
begin
for i in reverse 1..10--这里reverse的意思是i的取值反过来,即从10到1(可以不使用)
loop
n:=n+1;
dbms_output.put_line(n);
end loop;
end;

--循环语句(loop)
declare
i number:=100;
begin
loop
i:=i+10;
dbms_output.put_line(i);
exit when i=200;
end loop;
dbms_output.put_line('---------');
dbms_output.put_line(i);
end;

--循环语句(while)
declare
a number:=100;
begin
while a<250
loop
a:=a+25;
end loop;
dbms_output.put_line(to_char(a));
end;

------------------------------------------------------------------------------------------
-- Oracle查看系统及用户信息
------------------------------------------------------------------------------------------
--查询系统日志文件
SQL> select * from v$logfile;

--查询系统控制文件
SQL> select * from V$controlfile;

--查询系统数据文件
SQL> select * from v$datafile;

--查询日志文件状态
SQL> select * from v$log;

--查看日志归档模式
SQL> archive log list;

--查看后台进程
SQL> select * from v$bgprocess;

--查看回滚段的名称和大小
select segment_name, tablespace_name, r.status,
(initial_extent/1024) InitialExtent,(next_extent/1024) NextExtent,
max_extents, v.curext CurExtent
From dba_rollback_segs r, v$rollstat v
Where r.segment_id = v.usn(+)
order by segment_name ;

--查看正在使用的后台进程
SQL> select * from v$bgprocess where paddr<>'00';

--查看当前用户
SQL> show user;

--查看数据库所有的角色
SQL> select * from dba_roles;

--查看当前用户的角色(oracle9i2数据库sys初始角色27行)
SQL> select * from user_role_privs;

--查看当前用户的系统权限(oracle9i2数据库sys初始系统权限139行)
SQL> select * from user_sys_privs;

--查看当前用户的表级权限(oracle9i2数据库sys初始表级权限11834行)
SQL>select * from user_tab_privs;

--查看当前用户所有的表
SQL>select * from user_tables;

--查看数据库版本
SQL> select version from product_component_version where substr(PRODUCT,1,6)='Oracle';

--查看当前有多少数据库连接(以管理员身份查询)
SQL> select username,sid from v$session where serial#>1;

--查看系统日期
SQL> select sysdate from dual;

--查看当前有那些用户从那台机器连接到数据库
SQL> select machine,username,terminal from v$session order by machine;

--查看数据库SID
SQL> select name from v$database;
SQL>select instance_name from v$instance;

--查询数据库中所有的对象
SQL> select * from dba_objects;

--查看所有的数据库(管理员身份)
SQL> select * from v$database;

--查看当前用户对象
SQL> select * from user_objects;

--查看当前用户下所有表
SQL> select * from user_Objects where Object_type='TABLE';

--查看数据库创建日期和归档方式
SQL> Select Created, Log_Mode, Log_Mode From V$Database;

--查看数据库中所有的过程,函数和程序包
SQL> select object_name,object_type from user_objects
2 where object_type in('PROCEDURE','FUNCTION','PACKAGE');
------------------------------------------------------
--Orcale标量函数与分析函数
------------------------------------------------------

---------------------日期函数------------------------

--返回当前日间加上指定月数后的日期值
SQL> select add_months(sysdate,2) from dual;

--返回两个日期之间的月数(如果两个时间的日期相同则返回整数,否则为小数,也可能是负数)
SQL> select months_between(sysdate,to_date('2006-6-27','yy-mm-dd')) from dual;

--返回指定日期所在月份的最后一天
SQL> select last_day(sysdate) from dual;

--返回指定日期的四舍五入值(四舍五入到最近的星期日)
--如果将参数‘day’该为‘year’将四舍五入到最近的年份如果晚于7月1日将到下一个年份
--如果将参数‘day’该为‘month’将四舍五入到最近的月份如果晚于15日将到下一个月份
SQL> select round(sysdate,'day') from dual;

--返回指定的下一个星期几的日期
SQL> select next_day(sysdate,'星期日') from dual;

--返回指定日期的特定部分
SQL> select extract(year from sysdate) from dual;

-- 修改会话的默认日期格式
ALTER SESSION SET nls_date_format = 'YYYY-MM-DD';

-- 显示日期和时间部分
ALTER SESSION SET nls_date_format = 'YYYY-MM-DD HH24:MI:SS';

-- 临时改变一下会话的默认语言, 以识别类似 '12-MAY-05' 的日期格式
alter session set nls_date_language = 'AMERICAN';

-- 改回简体中文语言:
alter session set nls_date_language = 'SIMPLIFIED CHINESE';

---------------------字符串函数------------------------

--首字母大写
SQL> select initcap('hello') from dual; Hello

--转换成小写
SQL> select lower('YangJuQi') from dual; yangjuqi

--转换成大写
SQL> select upper('Yangjuqi') from dual; YANGJUQI

--左裁剪
SQL> select ltrim('yangjuqi','yang') from dual; juqi

--右裁剪
SQL> select rtrim('yangjuqi','qi') from dual; yangju

--替换指定字符串中指定的字符
SQL> select replace('yangjuqi','yang','aaaaa') from dual; aaaaajuqi

--查找字符位置
SQL> select instr('yangjuqi','j') from dual; 5

--取出指定位置的字符串
SQL> select substr('yangjuqi',5,2) from dual; ju

--连接两个字符串
SQL> select concat('accp','yangjjuqi') from dual; accpyangjuqi

---------------------数学函数------------------------

--返回绝对值
SQL> select abs(25.25) from dual;

--向上取整
SQL> select ceil(45.256) from dual;

--向下取整
SQL> select floor(125.365) from dual;

--正旋
SQL> select sin(2) from dual;

--余旋
SQL> select cos(2) from dual;

--m的n次方
SQL> select power(4,4) from dual;

--取余数
SQL> select mod(10,3) from dual;

--四舍五入(后面的参数是小数保留的位数,该例保留两位小数)
SQL> select round(120.258,2) from dual;

--截断(将小数位截断并不进行四舍五入,用法同上)
SQL> select trunc(120.268,2) from dual;

--开方
SQL> select sqrt(2) from dual;

--指数运算
Declare
I int;
Begin
I := 4**2; --指数运算
dbms_output.put_line(I);
End;

---------------------转换函数------------------------

--完整显示日期和时间
SQL> select to_char(sysdate,'YYYY"年"fmMM"月"fmDD"日" HH24:MI:SS') from dual;

--如果将空值转换成指定的值(如果第一个为null,返回第二个值)
SQL> select nvl(null,0) from dual;

--如果第一个值不为空返回第二个值,否则返回第三个值
SQL> select NVL2('A',0,1) from dual;

--如果两个值相等返回空值,否则返回第一个值
SQL> select nullif('a','b') from dual;

---------------------聚合函数------------------------

--平均值
SQL> select avg(empid) from tblemp;

--最大值
SQL> select max(empid) from tblemp;

--最小值
SQL> select min(empid) from tblemp;

--总合值
SQL> select sum(empid) from tblemp;

--总行数
SQL> select count(*) from tblemp;

---------------------分析函数------------------------

--根据某列排序并显示序号row_number() over(order by 列名 desc)
SQL> select t.*,row_number() over(order by empage desc) as 序号 from emp t;

--计算一个值在一组值中的排位rank() over (partition by 列名 order by 列名 desc) rank
SQL> select t.*,rank() over (partition by empsex order by empage desc) rank from emp t;

--分类排名dense_rank() over(partition by 列名 order by 列名 desc)
SQL> select t.*, dense_rank() over (partition by class order by subject1 desc) 分类排名 from students t;

--将可能出现的空值通过nvl(列名,0)转换
SQL> select roll_no,name,class,nvl(subject1,0) subject1,nvl(subject2,0) subject2,nvl(subject3,0) subject3 from students;

-----------------------------------------------------------------------------------------
--oracle表空间及分区操作
-----------------------------------------------------------------------------------------
--创建表空间
create tablespace tp1
datafile 'd:\aa.dbf' size 5M
extent management local
uniform size 1M
;

--创建表空间
create tablespace myspace
datafile 'd:\aa.dbf' size 5M
extent management dictionary
default storage(
initial 100k
next 100k
pctincrease 10)
;

--创建一个名为stephen的用户,密码为stephen,使用的表空间为USERS
create user stephen
identified by stephen
DEFAULT TABLESPACE USERS
TEMPORARY TABLESPACE TEMP;

--删除表空间(表空间必须没有存储数据,如果有数据需要先删除数据)
drop tablespace myspace including contents and datafiles;

--查看表空间名称和大小及
SQL> select tablespace_name, file_name,
2 round(bytes/(1024*1024),0) total_space
3 from dba_data_files
4 order by tablespace_name
5 ;

--查看表空间
SQL> select * from dba_tablespaces;

--查看表空间的使用情况
select sum(bytes)/(1024*1024) as free_space,tablespace_name
from dba_free_space
group by tablespace_name;

--范围分区
create table ta
(
aid number(2),
adate date not null,
aaddr varchar2(50)
)
PARTITION BY RANGE(adate)
(
PARTITION sd1 VALUES LESS THAN (to_date('2001-01-01','yyyy-mm-dd')) tablespace tp1,
PARTITION sd2 VALUES LESS THAN (to_date('2002-01-01','yyyy-mm-dd')) tablespace tp2,
PARTITION sd3 VALUES LESS THAN (to_date('2003-01-01','yyyy-mm-dd')) tablespace tp3,
PARTITION sd4 VALUES LESS THAN (to_date('2004-01-01','yyyy-mm-dd')) tablespace tp4
)
;

--散列分区(hash分区)
CREATE TABLE tb
(
EmpID VARCHAR2 (5),
EmpName VARCHAR2 (15),
Department VARCHAR2 (10)
)
PARTITION BY HASH (EmpID)
(
PARTITION e1 tablespace tp1,
PARTITION e2 tablespace tp2,
PARTITION e3 tablespace tp3
);

--列表分区
CREATE TABLE tc
(
DepID varchar2 (5),
Dept_Name varchar2 (20)
)
PARTITION BY LIST (Dept_Name)
(
Partition D1 values ('会计部') tablespace tp1,
Partition D2 values ('管理层') tablespace tp2,
Partition D3 values ('人力资源部') tablespace tp3
);

--复合分区(范围分区和散列分区的结合)
CREATE TABLE td
(
Branch_ID varchar2 (5) not null,
Branch_name varchar2(10) not null,
Address varchar2(20)
)
PARTITION BY RANGE (Branch_Id)
SUBPARTITION BY HASH (Branch_name)
SUBPARTITIONS 2
(
PARTITION S1 values LESS THAN ('B005')
(SUBPARTITION sd1,SUBPARTITION sd2),
PARTITION S2 VALUES LESS THAN ('B010')
(SUBPARTITION sd3,SUBPARTITION sd4),
PARTITION S3 VALUES LESS THAN ('B015')
(SUBPARTITION sd5,SUBPARTITION sd6),
PARTITION S4 VALUES LESS THAN ('B020')
(SUBPARTITION sd7,SUBPARTITION sd8)
);

--根据表空间查询数据
SQL> select * from ta partition(sd1);

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!