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(column1 / column2 * 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;