Oracle常用SQL

目录

    • 1.用户操作
    • 2.表空间操作
    • 3.数据库信息查看
    • 4.表结构操作
    • 4.SQL标准格式
    • 5.特殊场景
    • 7.Oracle 递归查询
    • 8.Oracle回收站
    • 8.导出导入
    • 9.Oracle 11g空表不导出
    • 10.用户过期
    • 11.修改最大连接数
    • 其他数据库问题处理

1.用户操作

-- Oracle自带用户
sys; -- 系统管理员,拥有最高权限
system; -- 本地管理员,次高权限
scott; -- 普通用户,密码默认为tiger,默认未解锁

--二、登陆
sqlplus / as sysdba; -- 登陆sys帐户
sqlplus sys as sysdba; --- 同上
sqlplus scott/tiger; -- 登陆普通用户scott

--三、管理用户
create user username identified by password;--在管理员帐户下,创建用户username

alert user scott identified by tiger;--修改密码

-- 解锁用户
ALTER USER username ACCOUNT UNLOCK;

--修改用户默认表空间
alter user username default tablespace tablespace_name;

-- 级联删除用户
drop user username cascade;

--四,授予权限
-- 授予用户管理员权限:
grant dba to username;

--1、默认的普通用户scott默认未解锁,不能进行那个使用,新建的用户也没有任何权限,必须授予权限
grant create session to username;--授予username用户创建session的权限,即登陆权限

grant unlimited tablespace to username;--授予username用户使用表空间的权限

grant create table to username;--授予创建表的权限

grant drop table to username;--授予删除表的权限

grant insert table to username;--插入表的权限

grant update table to username;--修改表的权限

grant all to public;--这条比较重要,授予所有权限(all)给所有用户(public)

--2、oralce对权限管理比较严谨,普通用户之间也是默认不能互相访问的,需要互相授权
grant select on tablename to username;--授予username用户查看指定表的权限

grant drop on tablename to username;--授予删除表的权限

grant insert on tablename to username;--授予插入的权限

grant update on tablename to username;--授予修改表的权限

grant insert(id) on tablename to username;

grant update(id) on tablename to username;--授予对指定表特定字段的插入和修改权限,注意,只能是insert和update

grant alert all table to username;--授予username用户alert任意表的权限

--五、撤销权限

--基本语法同grant,关键字为revoke

--六、查看权限

select * from user_sys_privs;--查看当前用户所有权限

select * from user_tab_privs;--查看所用用户对表的权限

--七、操作表的用户的表

select * from username.tablename

--八、权限传递

--即用户A将权限授予B,B可以将操作的权限再授予C,命令如下:

grant alert table on tablename to username with admin option;--关键字 with admin option

grant alert table on tablename to username with grant option;--关键字 with grant option效果和admin类似

--九、角色

--角色即权限的集合,可以把一个角色授予给用户

create role myrole;--创建角色

grant create session to myrole;--将创建session的权限授予myrole

grant myrole to username;--授予username用户myrole的角色

drop role myrole;删除角色

--赋予某个用户操作此用户的权限
GRANT SELECT/update/insert/delete on PMLF_TCMA_GD_XC.Lf_Ctrl_Trade TO PMLF_GD;

--十、查看所有用户
select * from dba_users;   
select * from all_users;   
select * from user_users;

2.表空间操作

-- 创建表空间
/* 第1步:创建临时表空间  */
create temporary tablespace username_temp
tempfile 'E:\app\ACGkaka\oradata\orcl\username_temp.dbf'
size 50m 
autoextend on 
next 50m maxsize 20480m 
extent management local; 

/*第2步:创建数据表空间  */
create tablespace username_data 
logging 
datafile 'E:\app\ACGkaka\oradata\orcl\username_data.dbf'
size 50m 
autoextend on 
next 50m maxsize 20480m 
extent management local; 

/* 在Linux下创建表空间 */
CREATE TABLESPACE PMLF_TCMA_GD_BIG        
DATAFILE '/opt/oracledb/PMLF_TCMA_GD_BIG.dbf'          
SIZE 500 M          
AUTOEXTEND ON NEXT 32 M MAXSIZE UNLIMITED
LOGGING        
DEFAULT NOCOMPRESS        
ONLINE        
PERMANENT        
EXTENT MANAGEMENT LOCAL AUTOALLOCATE


/*第3步:创建用户并指定表空间  */
create user username identified by username 
default tablespace username_data 
temporary tablespace username_temp; 

/*第4步:给用户授予权限  */
grant connect,resource,dba to username;

-- 删除表空间
drop tablespace tablespace_name

-- 重命名表空间
alter tablespaces tablespace_name rename to new_tablespace_name;  

-- 查看表空间的名称及大小
SELECT t.tablespace_name, round(SUM(bytes / (1024 * 1024)), 0) ts_size
FROM dba_tablespaces t, dba_data_files d
WHERE t.tablespace_name = d.tablespace_name
GROUP BY t.tablespace_name;

-- 查看表空间物理文件的名称及大小
SELECT tablespace_name,
file_id,
file_name,
round(bytes / (1024 * 1024), 0) total_space
FROM dba_data_files
ORDER BY tablespace_name;

--查看表空间的使用情况
SELECT SUM(bytes) / (1024 * 1024) AS free_space, tablespace_name
FROM dba_free_space
GROUP BY tablespace_name;
SELECT a.tablespace_name,
a.bytes total,
b.bytes used,
c.bytes free,
(b.bytes * 100) / a.bytes "% USED ",
(c.bytes * 100) / a.bytes "% FREE "
FROM sys.sm$ts_avail a, sys.sm$ts_used b, sys.sm$ts_free c
WHERE a.tablespace_name = b.tablespace_name
AND a.tablespace_name = c.tablespace_name;

3.数据库信息查看

-- 查看oracle数据库的version
select * from v$version;

-- 查看所有表
SELECT * FROM user_tables;

-- 查看回滚段名称及大小
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;

-- 查看控制文件
SELECT NAME FROM v$controlfile;

-- 查看日志文件
SELECT MEMBER FROM v$logfile;

--7、查看数据库库对象
SELECT owner, object_type, status, COUNT(*) count#
FROM all_objects
GROUP BY owner, object_type, status;
--8、查看数据库的版本 
SELECT version
FROM product_component_version
WHERE substr(product, 1, 6) = 'Oracle';
--9、查看数据库的创建日期和归档方式
SELECT created, log_mode, log_mode FROM v$database;
--1G=1024MB
--1M=1024KB
--1K=1024Bytes
--1M=11048576Bytes
--1G=1024*11048576Bytes=11313741824Bytes
SELECT a.tablespace_name "表空间名",
total "表空间大小",
free "表空间剩余大小",
(total - free) "表空间使用大小",
total / (1024 * 1024 * 1024) "表空间大小(G)",
free / (1024 * 1024 * 1024) "表空间剩余大小(G)",
(total - free) / (1024 * 1024 * 1024) "表空间使用大小(G)",
round((total - free) / 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) b
WHERE a.tablespace_name = b.tablespace_name;

--十六、查询某个表的字段都被哪些表引用为外键
select c.TABLE_NAME tablename,c.constraint_name foreignname,u.column_name columnname
from all_constraints p, all_constraints c,user_cons_columns u
where p.table_name = 'TABLE_NAME'
and p.OWNER = SYS_CONTEXT('USERENV', 'CURRENT_SCHEMA')
and c.OWNER=SYS_CONTEXT('USERENV', 'CURRENT_SCHEMA')
and c.constraint_type = 'R'
and c.CONSTRAINT_NAME=u.constraint_name
and p.CONSTRAINT_NAME = c.R_CONSTRAINT_NAME

4.表结构操作

--更换数据库某张表的表名(备份时常用)
--直接更换
ALTER TABLE 当前表名字 RENAME TO 新表的名字
--或者
rename 当前表名字 to 新表的名字 ;

--建新表删旧表
create new_table as select * from old_table;
drop table old_table;

--修改数据表名 
ALTER TABLE OLD_TABLE_NAME RENAME TO NEW_TABLE_NAME; 

--修改列名 
ALTER TABLE TABLE_NAME RENAME COLUMN OLD_COLUMN_NAME TO NEW_COLUMN_NAME; 

--修改列的数据类型 
ALTER TABLE TABLE_NAME MODIFY COLUMN_NAME NEW_DATATYPE; 

--修改VARCHAR2列的字段长度
ALTER TABLE TABLE_NAME MODIFY COLUMN_NAME VARCHAR2(你需要的值); 

--删除列 
ALTER TABLE TABLE_NAME DROP COLUMN COLUMN_NAME;

--添加字段 
ALTER TABLE 表名 ADD 字段 NUMBER(15,4);

--删除当前用户下所有表
select 'drop table '||table_name||';' from user_tables;  

--查询表主键及主键名称
SELECT A.CONSTRAINT_NAME,  A.COLUMN_NAME  FROM USER_CONS_COLUMNS A, USER_CONSTRAINTS B  WHERE A.CONSTRAINT_NAME = B.CONSTRAINT_NAME  AND B.CONSTRAINT_TYPE = 'P' AND A.TABLE_NAME = 'GH_BAS_TEMP_STATION'

--删除表主键
ALTER TABLE GH_BAS_TEMP_STATION DROP CONSTRAINT PK_GH_BAS_TEMP_STATION;

--添加表主键
ALTER TABLE GH_BAS_TEMP_STATION ADD CONSTRAINT PK_GH_BAS_TEMP_STATION PRIMARY KEY(PROJECTID, BPAID, STATIONID);

--删除所有表
select 'drop table '||table_name||';' from cat where table_type='TABLE' 

4.SQL标准格式

-- 插入:
insert into 表名 (字段1, 字段2, 字段3, ...) values (1,2,3, ...);

--更新:
update 表名  set 字段名 = 插入值  where 条件

-- 存在即更新,不存在则插入:
begin
	--写 update 语句,记住,分号";"结尾
	if sql%rowcount = 0 then
	--写 insert 语句,记住,分号";"结尾
	end if;
end;

-- MERGE 针对同一张表
MERGE INTO mn a
USING (select count(*) co from mn where mn.ID=4) b
ON (b.co<>0)--这里使用了count和<>,注意下,想下为什么!
WHEN MATCHED THEN
UPDATE
SET a.NAME = 'E'
where a.ID=4
WHEN NOT MATCHED THEN
INSERT
VALUES (4, 'E');

5.特殊场景

-- 1.复制一张表中的输入到另一张表中
/* 1)两张表字段完全相同的情况下 */
insert into tablename1 select * from tablename2
/* 2)复制部分数据 */
insert into 表A(字段1,字段2,...) select 字段1,字段2,... from 表B 

-- 2.取某一行数据的最大、最小值
/* 1)取得col1, col2, col3...字段中最大的值 */
greatest(col1, col2, col3...)
/* 2)同理,取得col1,col2,col3...字段中最小的值 */
least(col1, col2, col3....)
/* 3)计算某一行数据的平均值 */
(nvl(col1,0)+nvl(col2,0)+nvl(col3,0)+...+nvl(coln,0))/n

-- 3.判断一个列的值,例子如下,加入COL大于95,则为0,否则不变
CASE WHEN COL > 95 THEN 0 ELSE COL END

7.Oracle 递归查询

--找子集
select * from Lf_Ctrl_Module start with MODULEID = '01' connect by prior MODULEID=UPMODULEID

--找父集
select * from Lf_Ctrl_Module start with MODULEID = '0101' connect by prior UPMODULEID=MODULEID

8.Oracle回收站

--1、查询回收站
SELECT t.object_name,t.type ,t.original_name FROM user_recyclebin t;

SELECT count(*) FROM user_recyclebin t;

--2、回收站清理
purge recyclebin ;

--3、禁用回收站:
ALTER SESSION SET recyclebin = OFF; -- 作用于会话状态
ALTER SYSTEM SET recyclebin = OFF; -- 作用于系统状态

--4、启用回收站:
ALTER SESSION SET recyclebin = ON; -- 作用于会话状态
ALTER SYSTEM SET recyclebin = ON;-- 作用于系统状态

--5、单独删除
PURGE TABLE BIN$5l669dZGTlGbDXj0fB80Gw==$0;

--6、恢复回收站中的表
flashback table BIN$5l669dZGTlGbDXj0fB80Gw==$0 to before drop; 

8.导出导入

--导出多张表:
exp username/password@orcl tables=(table1,table2,table3,table4,...) file=e:\table.dmp

--导出单张表:
exp username/password@orcl tables=table1 file=e:\table.dmp


--导出整个数据库:
--1、本地导出
exp username/password@orcl file=e:\table.dmp owner=username

--2、远程导出
exp username/password@192.168.0.1/orcl file=e:\table.dmp owner=username

--3、导出所有表结构不要数据:
exp username/password@orcl file=e:\table.dmp owner=username rows = n

--导入数据库
imp username/password@orcl file=e:\table.dmp full=y commit = y

9.Oracle 11g空表不导出

--Oracle 11g的新特性,数据条数是0时不分配segment,所以就不能被导出。
--解决方案:
--1、先执行此语句生成分析表的SQL,copy出来,然后打开新的SQL窗口执行
select 'analyze table '||table_name||' compute statistics;' from user_tables;
--2、执行sql,查看有哪些是空表
select table_name from user_tables where NUM_ROWS=0; 
--3、通过select 来生成修改语句
select 'alter table '||table_name||' allocate extent;' from user_tables where num_rows=0; 
--4、将上面生成的修改语句,copy出来,然后打开新的SQL窗口执行即可 

10.用户过期

-- 修改用户过期时间为永久
select * from Dba_Profiles A WHERE A.profile = 'DEFAULT'  AND A.resource_name = 'PASSWORD_LIFE_TIME';

ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED;

11.修改最大连接数

--查看连接线程数
SELECT COUNT(*) FROM V$PROCESS;
--查询连接线程数配置表
select * from v$parameter where name ='processes';
--统计数据库连接的消耗情况
select  b.MACHINE, b.PROGRAM, b.USERNAME, count(*) from v$process a, v$session b where a.ADDR = b.PADDR and  b.USERNAME is not null  group by  b.MACHINE, b.PROGRAM, b.USERNAME order by count(*) desc
--修改最大连接数,重启监听和服务后生效
alter system set processes = 1000 scope = spfile;

其他数据库问题处理

--1、金仓数据库
select SYSTIMESTAMP from dual;--获取系统时间到年月日时分秒
select sysdate from dual;--获取系统时间到年月日



--2、MySQL (Linux下安装)
--1)登录mysql
mysql -u root -p
--然后输入密码即可
--2)授权可以远程登陆
grant all privileges on *.* to 'root' @ '%' identified by 'root';
--刷新权限,刷新后才可生效
flush privileges;
--通过设置Linux的防火墙,开启3306端口,这个实在Linux命令下执行
/sbin/iptables -I INPUT -p tcp --dport 3306 -j ACCEPT
--重新刷新防火墙
/etc/rc.d/init.d/iptables save


-- 删除当前用户下数据库中所有表
SELECT 'DROP TABLE '|| table_name || ';' FROM USER_TABLES ORDER BY TABLE_NAME;

-- 查看是否开启分区
select * from v$option where parameter = 'Partitioning'; 

-- 全库查询
DECLARE  
CURSOR cur_query IS  
  SELECT table_name, column_name, data_type FROM user_tab_columns;  
  a NUMBER;  
  sql_hard VARCHAR2(2000);  
  vv NUMBER;  
BEGIN  
  DBMS_OUTPUT.ENABLE(buffer_size => null);
  FOR rec1 IN cur_query LOOP  
  a:=0;  
  IF rec1.data_type ='VARCHAR2' THEN  
  a := 1;  
  END IF;  
  IF a>0 THEN  
  sql_hard := '';  
  sql_hard := 'SELECT COUNT(*) FROM  '|| rec1.table_name ||' WHERE '  ||rec1.column_name  || '=''待查询内容''';
  dbms_output.put_line(sql_hard);   
  EXECUTE IMMEDIATE sql_hard INTO vv;  
  IF vv > 0 THEN  
   dbms_output.put_line('[字段值所在的表.字段]:['||rec1.table_name||'].['||rec1.column_name||']');  
  END IF;   
  END IF;  
  END LOOP;  
END;   





你可能感兴趣的:(数据库,数据库)