Oracle随记笔记

1.oracle去除表重复数据

delete from tb where rowid not in (select max(rowid) from tb group by col1,col2...)

2.获取当前年份所有月份集

with temps as

 (select to_char(sysdate, 'yyyy') || lpad(level, 2, 0) mon

    from dual

  connect by level < 13)

select mon from temps

3.导入导出数据

1> impdp/expdp 命令

3.1.1 整库导

导入:impdp userid='system/oracle@orcl' schemas=users directory=DATA_FILE_DIR dumpfile=imp.dmp version=10.2.0.1.0

导出:expdp userid='system/oracle@orcl' schemas=users directory=DATA_FILE_DIR dumpfile=exp.dmp version=10.2.0.1.0

@userid 用户名/密码@实例名 @schemas 导入/导出的用户 @directory 导入/导出系统路径(获取来源,数据库表dba_directories,可在此表自定义数据,设置个性化路径) @dumpfile 文件名称(.dmp后缀) @version 若数据库版本不同,需添加导出/导入版本(注意:若导出语句注明了版本号,则导入时也许注明版本号,否则导入会包版本兼容错误)

@expdp content(all:对象+数据行,data_only:只导出对象,metadata_only:只导出数据的记录)

3.1.2 导出指定表

expdp userid='system/oracle@orcl' directory=DATA_FILE_DIR dumpfile=exp.dmp tables='table1','table2' version=10.2.0.1.0

@schemas 导出用户; tables 导出表

2> exp/imp命令

3.2.1 导出指定表

导出:exp userid=system/oracle@orcl tables=(tablename) file=E:\test.dmp

导入:imp userid=system/oracle@orcl tables=(tablename) file=E:\test.dmp

@userid 用户名/密码@实例名 tables 表名 @file 文件路径

导出多表命令

exp userid=system/oracle@orcl tables=('tablename1', 'tablename2', 'tablename3') file=E:\test.dmp

3.2.2 整库导

unix下:

exp \'sys/口令 as sysdba\' file=a.dmp owner=导出用户 rows=N

imp \'sys/口令 as sysdba\' file=a.dmp fromuser=导出用户 touser=导入用户

windows下:

exp 'sys/口令 as sysdba' file=a.dmp owner=导出用户 rows=N

imp 'sys/口令 as sysdba' file=a.dmp fromuser=导出用户 touser=导入用户

@rows=y表示数据和结构都导出;rows=n只导出结构,不导数据

3> 同一个数据库下,数据在用户之间迁移

a.执行

  expdp userid='system/oracle@orcl' schemas=users directory=DATA_FILE_DIR dumpfile=exp.dmp

命令导出库

b.执行

  impdp userid='system/oracle@orcl' directory=DATA_FILE_DIR dumpfile=exp.dmp REMAP_SCHEMA = users:user2
命令将a命令导出的users用户数据导入到user2用户

Oracle10g提出的数据泵技术(impdp/expdp),在以下几个方面优于exp/imp命令:

  1、数据泵工具运行于服务器端,相比客户端的exp/imp其性能更好,并能实现exp/imp的全部功能。

  2、通过使用exclude,include,content等参数,数据泵可以为数据及数据对象提供更细微级别的选择性。

  3、通过设定数据库版本号,数据泵可以兼容老版本的数据库系统。

  4、并行执行。

  5、通过estimate_only参数,数据泵可以预估导出作业所需的磁盘空间。

  6、支持分布式环境中通过数据库连接实现导入\导出。

  7、支持导入时重新映射功能(即将对象导入到新的目标数据文件、架构及表空间等)。

  8、支持元数据压缩及数据采样。

4.处理除数为0

decode(column2, 0, '0%', round(column1column2 * 100, 2)||'%') as column

@column2除数、column1 被除数

5.四舍五入

round(column1 column2 * 100, 2)||'%'

6.显示小数时处理个位数为0时不显示

select to_char(0.1,'fm9999990.9999') from dual; /* 利用fm强制转换*/

7.解锁修改

select t2.username,t2.sid,t2.serial#,t2.logon_time from v$locked_object t1,v$session t2 where t1.session_id=t2.sid;---查询sid

alter system kill session '73,2098';----输入sid,serial#解锁

作用类似于: select * from dual for update;

8.排列分组(根据某列分组后,再已某列排序)

select * from

  (select row_number() over(partition by columns1 order by to_number(cokumns2) desc) rn,

               d.* from table d)

 where rn = 1;

@columns1 分组字段; cokumns2 排序字段

9.过滤非纯数字

select code from table where regexp_replace(code,'^[-\+]?\d+(\.\d+)?$','') is not null;

10.单引号“’”转义

sql语句单引号转义使用'单引号',sql语句中单引号括的字符串只包含最外层的一对,内部的单引号都是转义符,但是此转义符只对单引号有用,eg: select '''' from dual;输出:‘; select '11''' from dual;输出:11‘; select '''11' from dual;输出:‘11;

11.行转列(pivot)

select * from () pivot (fun() for column in ('','',...))

12.用于存在父子,祖孙,上下级等层级关系的数据表进行层级查询

select...start with... connect by ...prior

{ CONNECT BY [ NOCYCLE ] condition [AND condition]... [ START WITH condition ]
  | START WITH condition CONNECT BY [ NOCYCLE ] condition [AND condition]...}

1>     connect by中的条件就表示了父子之间的连接关系,比如 connect by id=prior  pid

2>     prior,表示在一表上,prior所在列pid的某一值A的记录行的父亲是列id上值等于列pid上值A的记录行。

3>     LEVEL伪列表示树的深度(或叫高度)。

4>     oracle中的select语句可以用START WITH...CONNECT BY子句实现递归查询(或叫树状查询),connect by 是结构化查询中用到的;

select ... from <TableName>

where <Conditional-1>     --过滤条件,用于对返回的所有记录进行过滤。

start with <Conditional-2>         --该限定条件,表示查询结果以谁作为起始根结点的。当然可以放宽该限定条件,以取得多个根结点,实际就是多棵树。

connect by <Conditional-3>        --连接条件,即表示不同节点间以该连接条件构成一个父子关系

Eg:select id, pid, name

from table

start with  pid = ‘ROOT’

connect by prior id = pid

1)       查找树中的所有顶级父节点(辈份最长的人)。

SELECT  *  FROM  flfl  WHERE sjflid  IS  NULL; 

2)       查找一个节点的直属子节点(所有儿子)。

SELECT  *  FROM  flfl  WHERE sjflid  =  819459;  

3)       查找一个节点的所有 直属子节点(所有后代)。

SELECT  *  FROM  flfl  START  WITH  ID = 819459 CONNECT BY sjflid = PRIOR ID; 

4)       查找一个节点的直属父节点(父亲)。

SELECT  b.*  FROM  flfl  a  JOIN  flfl  b  ON a.sjflid = b.ID WHERE a.ID = 6758;  

5)       查找一个节点的所有直属父节点(祖宗)。

SELECT * FROM flfl START WITH ID = 6758 CONNECT BY PRIOR sjflid = ID;

请参考:https://blog.csdn.net/qiange520/article/details/50515317

13.oracle将数据按逗号拆分成多行

select t1.id,wmsys.wm_concat(t2.name) replyname from (select * from (select id,regexp_substr(reply, '[^,]+', 1, level, 'i') as replyfrom table1connect by level <=length(nvl(reply, ' ')) - length(regexp_replace(nvl(reply, ' '), ',', '')) + 1) group by id,reply) t1 left join table2 t2 on t1.reply = t2.id group by t1.id

14.表空间

查看表空间下数据文件路径:select * from dba_data_files where tablespace_name = 'USERS'

添加表空间数据文件:alter tablespace USERS add datafile 'D:\APP\ADMINISTRATOR\ORADATA\ORCL\USERS04.DBF' size 2000M autoextend on;

一、创建一个表空间my_space,该表空间有两个数据文件,f:\oradata\myo1.dbf(5M)和f:\oradata\my02.dbf(10M)自动增长,每次增长1M,最大增长至20M

create tablespace my_space datafile 'f:\oradata\my01.dbf' size 5M autoextend off,'f:\izoradata\my02.dbf' size 10M autoextend on next 1M maxsize 20M;

二、系统运行了一阵时间,表空间容量不够需要扩充,决定将数据文件f:\oradata\my01.dbf从5M调整到20M

alter database datafile 'f:\oradata\my01.dbf' resize 20M

三、系统继续运行,表空间容量再次紧张而且F盘也没有足够的空间扩容,决定为表空间在E盘增加一个数据文件e:\oradata\my01.dbf(10M),不自动增长

alter tablespace my_space add datafile 'E:\oradara\my03.dbf' size 10M autoextend off;

删除表空间;

drop tablespace 表空间名称

15.新建对象

1>     新建表空间

create tablespace user_space_1 datafile 'E:\Test\user_1.dbf' size 20M

--user_space_1表对象名(自定义) 'E:\Test\user_1.dbf'存储位置(自定义) 20M表对象大小

--其他均为固定语法

2> 新建用户

create user jy identified by 123456 default tablespace user_space_1

--jy(用户名) 123456(密码) user_space_1所属表空间

--其他均为固定于法

3> 为用户赋权限

grant connect,create table,unlimited tablespance to jy

-- grant dba to jy 一般赋予dba权限

-- grant 权限名称 to 用户名称

4> 移除权限

revoke 权限名称 from 用户名称

16.直接在windows窗口运行sql文件

start E:\Test\sql.sql

17.修改表结构

增加列

alter table 表名 add 列名 数据类型 约束

alter table 表名 notity

主外键

创建表时:

1.列名 references 表名(列名)

2.constraint fk_type foreign key(列名) references 表名(列名)

创建临时表

create global temporary table 表名(列名、列名...)(只存活于一次事务之间)

create global temporary table 表名(列名、列名...) on commit preserve rows(只存活于一次会话之间)

伪列

select rowId,product.* from product

select distinct,product.* from product

18.自定义转义符

标识红色字符为自定义转义符

sqlEnd.build("and path not like '%$_fb.doc' ESCAPE '$'");

19.修改非空数据表的表结构

//先缓存表

CREATE TABLE temp_cache_table AS SELECT * FROM dbi_report_report;

//删除原表所有数据

DELETE FROM dbi_report_report;

//修改字段

ALTER TABLE dbi_report_report MODIFY SQLSCRIPT long;

alter table dbi_report_report modify SQLSCRIPT clob;

--ALTER TABLE orguser MODIFY username VARCHAR2(200 BYTE);

//插入原数据

INSERT INTO dbi_report_report SELECT * FROM temp_cache_table;

//删除缓存表

DROP TABLE temp_cache_table;

猜你喜欢

转载自www.cnblogs.com/hualuo-sign/p/9396793.html