【开发日记】Oracle 常用操作及解决方案

2023-09-25 14:56:01 浏览数 (2)

Oracle

基本操作

代码语言:javascript复制
--查询表说明和对应的表名
select t.table_name,f.comments from user_tables t inner join user_tab_comments f on t.table_name=f.table_name where f.comments like '%十周年%'

--修改语句
update 表名 set 列名=‘值’where 条件


--插入数据
insert into 表名 (字段1,字段2)values ('xxxxx','xxxxx');

--时间日期格式插入
    Sysdate --生成当前时间
    to_char(sysdate,'yyyy-mm-dd') --生成当前时间并规定样式 (时间格式可自定义)
    to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') --date类型转字符串类型
    to_date('2018/1/3 00:00:01','yyyy/mm/dd,hh24:mi:ss') --字符串类型转date类型
    --样例:
    insert into 表名 (字段1,字段2,字段3)values (sysdate,to_char(sysdate,'yyyy-mm-dd'),to_date('2018/1/3 00:00:01','yyyy/mm/dd,hh24:mi:ss'));

--创建索引 
    create index 索引名称 on 表名 (字段名称);

--删除索引 
    drop index 索引名;


--创建组合索引 
    create index 索引名 on 表名(列名1,列名2);


--在数据库中查找表名 
    select * from user_tables where table_name like 'tablename%';


--查看该表的所有索引 
    select * from all_indexes where table_name = 'tablename';


--查看该表的所有索引列 
    select* from all_ind_columns where table_name = 'tablename';


--修改表名
    alter table table1 rename to table2

--添加列
    alter table 表名 add (列名 列类型,列名 列类型);

--删除列
    alter table 表名 drop column 列名

表分区

此表分区是两个案例,根据某个字段的值的大小范围进行分区或者根据时间范围进行分区

代码语言:javascript复制
--表分区
    --创建表分区  
     --注意:创建分区表之后可以添加索引,但是如果某列即使分区条件列又要添加主键,那么表中不能有数据,需在空表中添加主键
     --表分区:
    --Createtable-创建表
        create table表名(
        id varchar(36),
        name varchar(36),
        value varchar(36),
        creat_date date
        )
    
    --创建分区,单表中不能有多种类型的分区
        --该分区为范围分区
            partition by range(id)(
            partition 分区名 values less than('200') tablespace 表空间, --该分区为以id分区0-200的区间
            partition 分区名 values less than('400') tablespace 表空间 --该分区为以id分区200-400的区间,如需添加以此类推
            )
            tablespace表空间;
        --该分区为时间分区,自动以时间分区
            partition by range (creat_date)  ---分区的依据字段
            INTERVAL (NUMTOYMINTERVAL(1,'MONTH'))  --自动增加分区的间隔,MONTH可替换为day,yesr等
            (
            partition  p1  valueslessthan(to_date('2020-08-01','yyyy-mm-dd'))
            )
            tablespace 表空间 ;
    
    --查询单个分区的数据
    select * from 表名 partition (分区名);
    
    ALTER TABLE SALES ADD PARTITION P3 VALUES LESS THAN(TO_DATE('2018-09-01','YYYY-MM-DD'));

视图

代码语言:javascript复制
--创建视图

    create or replace view 试图名称 as (select  -------)
--创建双表查询合并
     create or replace view 试图名称 as  (
        select    a,b,c from 表1  
        union  all
            select  
            a1 as a ,
            (casse states 
                when 'i1'  then 'O1'
                when 'i2'  then 'O2'
                else  b1 end
            )as b,
            ' ' as c
            from 表2
            )
         
         
--说明:
--(casse states 
-- when 'i1'  then 'O1'
-- when 'i2'  then 'O2'
-- else  b1 end
--)as b,
--其中该部分为 第二个表匹配第一个表的字段,如果第二个表的值为
--i1 则对应显示O1
--同理i2对应显示O2
--如果没有其中条件则按原数值显示


--删除视图
drop view 视图名称;
--查看表实际占用空间
select * from (select segment_name, sum(bytes)/1024/1024/1024 "共占用(G)" from user_segments group by segment_name) where segment_name  in ('table_name');

数据恢复

我们经常删错数据或者改错数据,这种情况一般都会重新造数据,但是oracle可以记录修改之前的数据,根据这一点就可以还原操作之前的数据

代码语言:javascript复制
--oracle数据表恢复

--第一步 查询对应表的提交记录
    select * from v$sql where sql_text like '%表名%' ORDER BY FIRST_LOAD_TIME DESC;

--查询到之后有该表的提交时间与提交记录以及提交条件

--第二步 查询到提交时的记录,按照当时提交的条件,查询到以提交的数据。

select  * from 表名 as of timestamp to_timestamp('时间','yyyy-mm-dd hh24:mi:ss') where 条件(此条件为第一步查询到的执行条件);

高级查询-案例

案例1

代码语言:javascript复制
--查询,对应数值 显示对应的列与值
SELECT
    id,
  ( CASE Sex
  WHEN'1'THEN'男'
  WHEN'0'THEN'女'
  ELSE' 未知'
  END)asSex,  
from 表名

--该功能为当数据库存储的性别为  1-男  0-女  时可以匹配查询到的数据为对应值

案例2

代码语言:javascript复制
--截取函数 (功能为截取某位前或后的字符)
SUBSTR()

--配合规则函数使用(功能为返回该字符串中对应字符或字符串的位置信息)
INSTR()

--substr函数:截取某字符串
    substr(string,start,[length])
    
    --参数以及说明
    --string :表示要截取的字段或者字符串
    --start:表示开始位置,如果start是负数,则从string的末尾算起
    --length:【可选项】 表示要截取的长度


--instr函数:返回字符串中某个值的位置
    instr(string,ch_string,[start],show_time)

    --参数以及说明
    --string :表示字符串 
    --ch_string:要查找的字符串例如 ‘/’或者‘-’
    --start:【可选项】开始查找位置,默认1 ,如果为-1 则从右向左找
    --show_time:表示要查找的字符串第几次出现在原字符串中 

--案例
//该sql为查找最后一个‘/’之后的所有字符
select  SUBSTR('123/456/789',INSTR('123/456/789','/',-1,1) 1) from bual

0 人点赞