Oracle常用语句总结
- 一、查看表空间占用情况
- 1. 查看表空间占用情况
- 2. 创建表空间
- 二、数据库情况查询
- 1. 查询数据库版本
- 2. 查询连接数
- 2.1 数据库连接数
- 2.1.1 查询数据库当前进程的连接数
- 2.1.2 查询数据库当前session会话的连接数
- 2.1.3 数据库的并发连接数
- 2.1.4 查看当前数据库建立的会话情况
- 2.1.5 查看数据库允许的最大连接数
- 2.1.6 修改最大连接数
- 3. 查找数据表被哪些存储过程调用过
- 4. 查找存储过程被哪些其他存储过程调用过
- 5. 查找含有某个字段的表名
- 6. 查询表之间的关联
- 6.1 查询表的键的约束(例如主键约束)
- 6.2 查询所有应用到该键的记录
- 7. PL/SQL提示资源正忙,或者表被锁住
- 7.1 找出被锁的对象,定位具体是哪一个session
- 7.2 查看造成锁的索引
- 7.3 杀死占用资源的session
- 8. 使用sysdba用户:查询整体oracle
- 8.1 查询有哪些数据库
- 8.2 查询实例名
- 8.3 查询数据库域名
- 8.4 查询数据库服务器
- 8.5 数据库服务名
- 三、数据库用户
- 1. 查看用户
- 2. 创建用户
- 3. 修改用户密码
- 4. 用户授权
- 4.1 授予用户登录权限
- 4.2 授予用户使用表空间的权限
- 4.3 授予用户删除表的权限
- 4.4 授予用户插入表的权限
- 4.5 授予用户修改表的权限
- 4.6 授予用户查询表的权限
- 4.7 授予用户创建视图的权限
- 4.8 授予用户三种标准角色
- 4.8.1 connect角色
- 4.8.2 resource角色
- 4.8.3 dba角色
- 4.9 授权函数使用权限
- 4.10 取消授权
- 4.11 查看用户权限
- 5. 用户删除
- 6. 解锁用户
- 6. 查看当前用户属性
- 7. 查看当前表空间角色
- 8. 查看当前用户的缺省表空间
- 9. 查看当前有哪些用户正在使用数据
- 四、数据库表
- 1. 创建表
- 2. 备份表
- 3. 更新表
- 3.1 方法一:末尾加 for update(容易把表锁住)
- 3.2 方法二:加rowid(推荐)
- 五、Oracle函数
- 1. over():开窗函数
- 2. rownum:加序号
- 3. row_number():加序号
- 4. hextoraw() :十六进制字符串转换为raw串
- 5. rawtohex():将raw串转换为十六进制
- 6. 获取系统时间年月日
- 7. sys_guid():生成全球唯一16字节的标识符
- 8. substr():字符串截取
- 9. instr():字符串查找返回位置下标
- 10. listagg():列记录聚合为一条记录,实现列转行
- 11. regexp_??():正则表达式
- 11.1 regexp_like():模糊匹配
- 11.2 regexp_instr():模糊匹配的位置下标
- 11.3 regexp_substr():模糊匹配截取字符串
- 11.4 regexp_replace():模糊匹配替换字符串
一、查看表空间占用情况
1. 查看表空间占用情况
SELECT a.tablespace_name "表空间名",b.total/1024/1024 表空间大小M,a.free/1024/1024 表空间剩余大小M,(b.total-a.free)/1024/1024 表空间使用大小M,ROUND((b.total-a.free)/b.total,4)*100 "使用率 %"FROM(SELECT tablespace_name,SUM(bytes) free FROM DBA_FREE_SPACE GROUP BY tablespace_name ) a,(SELECT tablespace_name,SUM(bytes) total FROM DBA_DATA_FILES GROUP BY tablespace_name) bWHERE a.tablespace_name=b.tablespace_name;
2. 创建表空间
create tablespace 表空间名datafile 'C:\oracledata\表空间存储的位置名.dbf' --表位置size 100m-- 表空间大小 autoextend on -- 自动扩容 next 10m; --扩容大小
二、数据库情况查询
1. 查询数据库版本
select * from v$version;
2. 查询连接数
2.1 数据库连接数
2.1.1 查询数据库当前进程的连接数
select count(*) from v$process;
2.1.2 查询数据库当前session会话的连接数
select count(*) from v$session;
2.1.3 数据库的并发连接数
select count(*) from v$session where status='ACTIVE';
2.1.4 查看当前数据库建立的会话情况
select sid,serial# as session的序列号,username,program,machine,status from v$session;
2.1.5 查看数据库允许的最大连接数
select value from v$parameter where name='processes';
2.1.6 修改最大连接数
alter system set processes=最大连接数值 scope=spfile;
- 修改processes和sessions值,需要重启oracle生效
shutdown immediate;--关闭实例startup; --启动实例
3. 查找数据表被哪些存储过程调用过
select *from user_dependencies r where r.referenced_name = '表名';
4. 查找存储过程被哪些其他存储过程调用过
select *from user_source a where a.text like '%存储过程名%'
5. 查找含有某个字段的表名
select * from dba_tab_columns where column_name = '字段名'
6. 查询表之间的关联
6.1 查询表的键的约束(例如主键约束)
select *from user_constraints e where e.table_name='表名'
6.2 查询所有应用到该键的记录
select b.table_name, b.column_name from user_constraints a inner join user_cons_columns b on a.constraint_name = b.constrain_name where a.r_constraint_name = '上条sql查出的具体键对应的约束名'
7. PL/SQL提示资源正忙,或者表被锁住
7.1 找出被锁的对象,定位具体是哪一个session
select i.session_id, o.owner, o.object_name from v$locked_object i, dba_objects o where i.object_id = o.object_id;
7.2 查看造成锁的索引
select s.username, s.sid, s.serial#, s.logon_time from v$locked_object o, v$session s where o.session_id = s.sid order by s.logon_time desc;
7.3 杀死占用资源的session
sid和serial从上一条sql可获取到
alter system kill session '具体的sid, 具体对应的serial'
8. 使用sysdba用户:查询整体oracle
8.1 查询有哪些数据库
select name,dbid from v$database;-- 或者 show parameter db_name;
8.2 查询实例名
select instance_name from v$instance; -- 或者show parameter instance_name;
8.3 查询数据库域名
select value from v$parameter where name='db_domain'; -- 或者show parameter domain;
8.4 查询数据库服务器
select value from v$parameter where name='service_names'; -- 或者show parameter service; -- 或者show parameter names;
8.5 数据库服务名
此参数是数据库标识类参数,用service_name表示。数据库如果有域,则数据库服务名就是全局数据库名;如果没有,则数据库服务名就是数据库名。查询:
show parameter service_name;
三、数据库用户
1. 查看用户
select * from dba_users;
2. 创建用户
create user 用户名 identified by 用户名密码;-- 指定表空间default tablespace 表空间名字;-- 指定临时表空间temporary tablespace 临时表空间名字(默认系统temp);
3. 修改用户密码
-- 特殊字符用双引号引起来alter user 用户名 identified by 新密码;
4. 用户授权
4.1 授予用户登录权限
grant create session to 用户名;
4.2 授予用户使用表空间的权限
grant unlimited tablespace to 用户名;
4.3 授予用户删除表的权限
grant drop any table to 用户名;
4.4 授予用户插入表的权限
grant insert any table to 用户名;
4.5 授予用户修改表的权限
grant update any table to 用户名;
4.6 授予用户查询表的权限
grant select on 表名 to 用户名;
4.7 授予用户创建视图的权限
- 其余类似,将语句中的create修改为其他操作
grant create view to 用户名;
4.8 授予用户三种标准角色
4.8.1 connect角色
Connect 角色:是授予最终用户的典型权利,最基本的权利,能够连接到Oracle数据库中,并在对其他用户的表有访问权限时,做select、update、insert 等操作。
grant connect to 用户名;-- with admin option的意思是被授予该权限的用户有权将某个权限(如create any table)授予其他用户或角色,取消是不级联的。grant connect to 用户名 with admin option;-- 取消是级联的grant connect to 用户名 with grant option;
4.8.2 resource角色
Resouce角色:是授予开发人员的,能在自己的方案中创建表、序列、视图等。
grant resource to 用户名;
4.8.3 dba角色
DBA角色:是授予系统管理员的,拥有该角色的用户就能成为系统管理员了,它拥有所有的系统权限。
grant dba to 用户名;
4.9 授权函数使用权限
grant execute on 函数名称 to 用户名;
4.10 取消授权
-- 取消所有表的查询权限revoke select any table from 用户名;-- 取消某个表的查询权限revoke select on 表名 from 用户名;
4.11 查看用户权限
select * from dba_role_privs;
5. 用户删除
drop user 用户名;-- cascade:级联-- 删除数据库用户及名下的所有表和视图drop user 用户名 cascade;
6. 解锁用户
- 一般数据库默认是10次尝试失败后锁住,数据库参数文件中设置了输错密码的次数,登录时当输错密码的次数超过所设置的次数时,则锁住该用户。
select * from dba_profiles where resource_name='FAILED_LOGIN_ATTEMPTS';
-- 提示 ORA-28000:the account is lockedalter user 用户名 account unlock;
6. 查看当前用户属性
select * from user_users;
7. 查看当前表空间角色
select * from dba_roles;
8. 查看当前用户的缺省表空间
- 缺省表:默认自动创建的表
select username,default_tablespace from user_users;
9. 查看当前有哪些用户正在使用数据
SELECT osuser, a.username,cpu_time/executions/1000000||'s', b.sql_text,machinefrom v$session a, v$sqlarea bwhere a.sql_address =b.address order by cpu_time/executions desc;
四、数据库表
1. 创建表
create table t_name(xh varchar2(20) not null primary key,xm varchar2(60),CSRQ date)comment on table t_nameis '姓名表';comment on column t_name.xh is '学号';
2. 备份表
create table 备份表名 as select * from 需要备份的表名;
3. 更新表
3.1 方法一:末尾加 for update(容易把表锁住)
select *from 表名 for update;
3.2 方法二:加rowid(推荐)
select t.rowid, t.* from 表名;
五、Oracle函数
1. over():开窗函数
over:开窗函数,通过over()函数,对明细数据再次进行分组,然后聚合
第一大类:聚合开窗函数====》聚合函数(列) OVER (选项),这里的选项可以是PARTITION BY子句,但不可是ORDER BY子句
第二大类:排序开窗函数====》排序函数(列) OVER(选项),这里的选项可以是ORDER BY子句,也可以是 OVER(PARTITION BY子句 ORDER BY子句),但不可以是PARTITION BY子句
2. rownum:加序号
selectrownum,t.* from (select * from 表名 order by t.需要排序的字段名) t;
3. row_number():加序号
select row_number() over (order by t.需要排序的字段名) 序号的别名,t.* from 表名 t;
4. hextoraw() :十六进制字符串转换为raw串
dual
:是一个虚拟表,只有一条数据hextoraw
:char 、 VARCHAR2 、 NCHAR 或 NVARCHAR2 数据类型中包含十六进制数字的 char 转换为原始值
5. rawtohex():将raw串转换为十六进制
6. 获取系统时间年月日
trunc()
:对值进行截断
7. sys_guid():生成全球唯一16字节的标识符
select sys_guid() from 表名;
8. substr():字符串截取
substr(源字符串,符串截取的起始下标负数表示从倒数第几个字符开始,字符串截取长度)
9. instr():字符串查找返回位置下标
instr(源字符串,查找的字符串,[开始查找的位置,查找第几次出现])
10. listagg():列记录聚合为一条记录,实现列转行
listagg(需要拼接汇总的列名, '连接符') within group(order by 按照排序的列名)
11. regexp_” />— 数字开头的select * from test where regexp_like(str,‘^[0-9]’);— 从头到位都是数字select * from test where regexp_like(str,‘^[0-9]+$’)— 字段中是数字或者是字母组成select * from test where regexp_like(str,‘^[a-z]|[0-9]$’,‘i’);— 从头到位都是字母select * from test where regexp_like(str,‘^[A-Z]+$’,‘i’);
11.2 regexp_instr():模糊匹配的位置下标
regexp_instr(列名,正则表达式,[开始查找位置默认1,查找第几次出现,模式i不区分大小写c区分大小写,是否含有子表达式])
-- 从第一个位置开始查找第2次出现非数字的位置select '1,23,456,7890',regexp_instr('1,23,456,7890', '[^0-9]+',1,2)from dual;
11.3 regexp_substr():模糊匹配截取字符串
regexp_substr(列名,正则表达式,[开始查找位置默认1,查找第几次出现,模式i不区分大小写c区分大小写,是否含有子表达式])
-- 拆分邮箱select 'ccc3@aliyun.com', regexp_substr('ccc3@aliyun.com','[a-zA-Z0-9]+') 邮箱名,regexp_substr('ccc3@aliyun.com', '\@[a-zA-Z0-9]+\.[a-zA-Z0-9]+') 邮箱后缀 from dual;-- 匹配固定电话号码和手机号码select regexp_substr('0755-11112222','^0[0-9]{2,3}-[0-9]{6,7}') 固定电话, regexp_substr('15866668888','^1[0-9]{10}') 手机号码,from dual;
11.4 regexp_replace():模糊匹配替换字符串
regexp_replace(列名,正则表达式,[替换的字符串,替换第几次出现,模式i不区分大小写c区分大小写])
select 'abc123', regexp_replace('abc123', '[0-9]', 'A', 1) 将数字替换为A, regexp_replace('abc123', '[0-9]') 将数字替换为空from dual;