oracle 常用命令

常用数据字典

可以使用desc 查看结构

dba_users
dba_tablespaces
user_users
user_tablespaces
dba_data_files #文件数据,可查看表空间的实际存储位置
USER_CONSTRAINTS; #查询数据字典可以看到某个表中约束的信息

#查看表
user_tables#当前用户表
user_tab_comments;#
all_tab_comments #所有表

#视图字典视图
dba_views——DBA视图描述数据库中的所有视图
all_views——ALL视图描述用户“可访问的”视图
user_views——USER视图描述“用户拥有的”视图 
dba_tab_columns——DBA视图描述数据库中的所有视图的列(或表的列)
all_tab_columns——ALL视图描述用户“可访问的”视图的列(或表的列)
user_tab_columns——USER视图描述“用户拥有的”视图的列(或表的列) 

##权限
dba_role_privs
dba_sys_privs
role_sys_privs 

登录和基本操作

使用sqlplus 登录

### 登录和基本操作
connect sysdba/manager

### 查看当前用户
show user;

###权限
select * from dba_role_privs;
select * from dba_sys_privs;
select * from role_sys_privs; 

###查看当前用户对象的表
select table_name from user_tables;
select * from user_tab_comments; # all_tab_comments

### 查看数据字典(表)的结构
desc dba_tablespaces; # 系统管理员
desc user_tablespaces; #普通用户

### 查看用户字典
desc dba_users; #系统管理员
desc user_users; #普通用户

###查询数据字典
select * from dba_users; #系统管理员才能查询,注意 非管理员用户登录查询该字典会提示,表或者视图不存在,因为没有权限
select * from user_users; #普通用户查询

### 解锁scott用户
select account_status from dba_users where username='SCOTT'; # 查看scott用户的状态
alter user scott account unlock; #将scott用户解锁,默认是锁状态
alter user scott identified by tiger; #修改scott 用户密码

表空间

### 查询
select * from dba_tablespaces; # 查看dba用户表空间
select * from dba_tablespaces; # 查看dba用户表空间
select default_tablespace from user_users where username='SCOTT';#查看SCOTT用户的默认表空间

### 设置用户的默认或者临时表空间
alter user username default/temporary tablespace tablespacename; #语法
alter user scott default tablespace SYSTEM; #设置SCOTT用户默认表空间是system,注意需要dba用户来修改,普通用户权限不足

#修改之后使用scott 用户登录,查询数据字典
select * from user_users; #可以看到默认的用户表空间已经变更

###通过数据字典查看表空间数据
desc dba_data_files; #数据字典
select * from dba_data_files; #查看数据文件存储
select * from dba_tablespaces; #查看表空间的状态

### 创建表空间
create [temporary] tablespace tablespacename datafile 'xxx.dbf' size 10m ; 语法

create TABLESPACE fore_tablespace DATAFILE 'fore_tablespace.dbf' SIZE 10m; #默认是永久表空间,使用dba用户创建表空间,大小10m
create temporary TABLESPACE temp_tablespace DATAFILE 'temp_tablespace.dbf' SIZE 10m; #创建临时表空间,大小10m

### 设置表空间的联机或者脱机状态
alter tablespace tablespacename online|offline; #语法

alter tablespace fore_tablespace offline; #默认创建的时候是联机
select * from dba_tablespaces;#查看表空间状态

### 修改表空间的状态(只有在联机状态下可以修改)
alter TABLESPACE tablespacename read ONLY| read write;#语法,只读和可读写,默认是可读写的

alter TABLESPACE fore_tablespace read ONLY;
select * from dba_tablespaces; #查看表空间的状态

### 修改数据文件(表空间需要在联机状态下)
select * from dba_tablespaces; #查看表空间状态
alter tablespace tablespacename add DATAFILE '/home/oracle/xx/df1.dbf' size  10m; # 语法
alter tablespace fore_tablespace  add DATAFILE 'df1.dbf' size  10m; #若不指定路径,则会oracle存放在oracle的默认位置
select * from dba_data_files where TABLESPACE_NAME='TEST_USER_TABLESPACE1'; #查看表空间对应的数据文件

###删除表空间的数据文件,注意不能删除创建表空间的第一个数据文件,若想删除,需要先删除表空间
--强行删除会出现该错误
--------------------------------------------------------------------------
-----03261. 00000 -  "the tablespace %s has only one file"---------------
-----*Cause:    Dropping file from ts which has a single file extent.-----
-----*Action:   Cannot make a tablespace fileless-------------------------
-------------------------------------------------------------------------
alter tablespace tablespacename drop DATAFILE 'df1.dbf'; #语法,指定文件名

###删除表空间
drop TABLESPACE tablespacename[INCLUDING CONTENTS] ; #语法,[INCLUDING CONTENTS]包含对应的数据文件
drop TABLESPACE TEST_USER_TABLESPACE1 INCLUDING CONTENTS ;  #删除表空间以及表空间对应的数据文件

###创建表
CREATE TABLE TABLE_NAME (
    COLUMN_NAME DATATYPE ,...
) #语法

CREATE TABLE USERINFO (
    ID NUMBER(6,0) ,
    USERNAME VARCHAR2(20),
    EMAIL VARCHAR2(20),
    BIRTHDAY DATE
); #创建用户信息表

DESC USERINFO; #查看表结构

###修改表

--添加字段
ALTER TABLE TABLE_NAME ADD COLUMN_NAME DATEtYPE;#语法
ALTER TABLE USERINFO ADD AGE NUMBER(3,0); #添加字段

--修改字段名字
ALTER TABLE TABLE_NAME RENAME COLUMN COLUMN_NAME TO NEW_COLUMN_NAME;#语法
ALTER TABLE USERINFO RENAME COLUMN AGE TO AGE1; #将AGE重命名为AGE1

--修改表名
RENAME TABLE_NAME TO NEW_TABLENAME;#语法
RENAME USERINFO TO NEW_USERINFO; #修改USERINFO 为 NEW_USERINFO

--修改字段的数据类型
ALTER TABLE TABLE_NAME MODIFY COLUMN_NAME DATETYPE; #语法
ALTER TABLE USERINFO MODIFY AGE DATE; #修改字段的数据类型

--删除字段
ALTER TABLE TABLE_NAME DROP COLUMN COLUMN_NAME; #语法
ALTER TABLE USERINFO DROP COLUMN AGE; #删除字段AGE

--删除表
DROP TABLE TABLE_NAME ; #语法
DROP TABLE USERINFO ; #删除表

--删除表中所有的数据,截断表,比delete效率高
TRUNCATE TABLE TABLE_NAME; #语法
TRUNCATE TABLE USERINFO;

表约束

主键约束
非空约束
唯一约束
检查约束

1.主键约束(PRIMARY KEY)

  1. 主键用于唯一地标识表中的每一条记录,可以定义一列或多列为主键。
  2. 是不可能(或很难)更新.
  3. 主键列上没有任何两行具有相同值(即重复值),不允许空(NULL).
  4. 主健可作外健,唯一索引不可;

2.唯一性约束(UNIQUE)

  1. 唯一性约束用来限制不受主键约束的列上的数据的唯一性,用于作为访问某行的可选手段,一个表上可以放置多个唯一性约束.
  2. 只要唯一就可以更新.
  3. 即表中任意两行在 指定列上都不允许有相同的值,允许空(NULL).
  4. 一个表上可以放置多个唯一性约束
### 添加非空约束(创建表时)
CREATE TABLE TABLE_NAME (
COLUMN_NAME DATE_TYPE [NOT NULL]|[缺省]|[NULL]); #语法,添加表的时候添加非空约束,默认是可以为空

###修改
ALTER TABLE TABLE_NAME MODIFY COLUMN_NAME DATE_TYPE [NOT NULL]|[缺省]|[NULL]; #语法

###添加主键约束(创建表时)
CREATE TABALE TABLE_NAME(
ID NUMBER(11,0) PRIMARY KEY); # PRIMARY KEY 主键约束

--多个字段联合约束,联合主键,复合主键
CREATE TABALE TABLE_NAME(
ID NUMBER(11,0),
NAME VARCHAR2(20) ,
CONSTRAINT CONSTRAINT_NAME PRIMARY KEY (COLUMN_NAME1,COLUMN_NAME2)
); # PRIMARY KEY 主键约束,语法 CONSTRAINT(约束)

---例子
CREATE TABLE HELLO(
  ID NUMBER(11,0) ,
  NAME VARCHAR2(20) ,
  CONSTRAINT PK_ID_NAME PRIMARY KEY (ID,NAME)
);

--查询数据字典可以看到某个表中约束的信息
DESC USER_CONSTRAINTS;
SELECT * FROM USER_CONSTRAINTS;#查看所有约束

###后为表添加约束
ALTER TABLE TABLE_NAME ADD CONSTRAINT CONSTRAINTS_NAME PRIMARY KEY (COLUMN_NAME1,COLUMN_NAME2,...);

--修改约束的名字
ALTER TABLE TABLE_NAME RENAME CONSTRAINT PK_NAME TO NEW_PK_NAME;
SELECT * FROM USER_CONSTRAINTS;#查看所有约束

--启用禁用约束
ALTER TABLE TABLE_NAME DISABLE | ENABLE CONSTRAINT CONSTRAINT_NAME;
SELECT STATUS FROM USER_CONSTRAINTS;#可以查看约束的状态 status

--删除主键约束
ALTER TABLE TABLE_NAME DROP CONSTRAINT CONSTAINT_NAME ;

ALTER TABLE TABLE_NAME DROP PRIMARY KEY [casacade] #级联删除,在有外键的时候使用

###外键约束

--创建表的时候添加,列级约束,在新建字段的时候添加
CREATE TABLE TABLE_NAME(
COLUMN DATE_TYPE REFERENCES OTHER_TABLE (COLUMN_NAME),OTHER_TABLE (COLUMN_NAME)...); #语法

--在新建表时,最后添加
CREATE TABLE TABLE_NAME(
CONSTRAINT CONSTRAINT_NAME FOREIGN KEY(COLUMN_NAME(本表中的字段))
REFERENCES OTHER_TABLE (COLUMN_NAME),OTHER_TABLE (COLUMN_NAME) [ON DELETE CASCADE]); #语法 [ON DELETE CASCADE]是否级联删除,当主表中的删除时,从表中的一行会被删除

--在修改表的时候添加外键约束
ALTER TABLE TABLE_NAME ADD CONSTRAINT CONSTRAINT_NAME FOREIGN KEY (COLUMN_NAME) REFERENCES OTHER_TABLE(COLUMN_NAME) [ON DELETE CASCADE];

--禁用(启用) 外键约束
SELECT * FROM USER_CONSTRAINTS; #找到对应表的约束名称 CONSTRAINT_NAME
ALTER TABLE TABLE_NAME DISABLE|ENABLE CONSTRAINT CONSTRAINT_NAME; #禁用约束

--删除外键约束
ALTER TABLE TABLE_NAME DROP CONTRAINT CONSTRAINT_NAME;


###唯一约束
--列级别
CREATE TABLE TABLE_NAME (
COLUMN DATE_TYPE UNIQUE ) #UNIQUE唯一约束

--表级别
CREATE TABLE TABLE_NAME (
COLUMN DATE_TYPE ,
CONSTRAINT CONSTRAINT_NAME UNIQUE(COLUMN_NAME)) ;#UNIQUE唯一约束

--在修改表的时候添加唯一约束
ALTER TABLE TABLE_NAME ADD CONSTRAINT CONSTRAINT_NAME unique (COLUMN_NAME);

--禁用(启用)唯一约束
SELECT * FROM USER_CONSTRAINTS; #找到对应表的约束名称 CONSTRAINT_NAME
ALTER TABLE TABLE_NAME DISABLE|ENABLE CONSTRAINT CONSTRAINT_NAME; #禁用约束

--删除唯一约束
ALTER TABLE TABLE_NAME DROP CONTRAINT CONSTRAINT_NAME;

###检查约束

--列级别
CREATE TABLE TABLE_NAME (
COLUMN DATE_TYPE CHECK(EXPRESSIONS)) #检查约束 (EXPRESSIONS) => COLUMN >0 表达式

--表级别
CREATE TABLE TABLE_NAME (
COLUMN DATE_TYPE ,
CONSTRAINT CONSTRAINT_NAME CHECK(EXPRESSIONS)) ;

--在修改表的时候添加检查约束
ALTER TABLE TABLE_NAME ADD CONSTRAINT CONSTRAINT_NAME CHACK(EXPRESSIONS);

--禁用(启用)检查约束
SELECT * FROM USER_CONSTRAINTS; #找到对应表的约束名称 CONSTRAINT_NAME
ALTER TABLE TABLE_NAME DISABLE|ENABLE CONSTRAINT CONSTRAINT_NAME; #禁用约束

--删除检查约束
ALTER TABLE TABLE_NAME DROP CONTRAINT CONSTRAINT_NAME;

查询

###字段命名
COL COLUMN_NAME HEADING 别名;

###CASE WHEN 语句
SELECT COLUMN_NAME ,CASE CLOUMN_NAME 
WHEN 条件1 THEN 结果1 
WHEN 条件2 THEN 结果2
ELSE '其他' 
END  AS 结果列名
FROM TABLE_NAME 
WHERE XXX  #第一种

###第二种方式
SELECT age ,CASE WHEN 0<age<18 THEN '未成年人' 
WHEN AGE>18 THEN '成年人' 
END AS REMARK
FROM PERSON
WHERE XXX #第二种方式,(字段>10)可以填写条件

序列

###创建队列
CREATE SEQUENCE seqTest
INCREMENT BY 1 -- 每次加几个
START WITH 1 -- 从1开始计数
NOMAXvalue -- 不设置最大值
NOCYCLE -- 一直累加,不循环
CACHE 10; --设置缓存cache个序列,如果系统down掉了或者其它情况将会导致序列不连续,也可以设置


--队列测试
CREATE SEQUENCE seqTest
INCREMENT BY 1 -- 每次加几个
START WITH 1 -- 从1开始计数
NOMAXvalue -- 不设置最大值
NOCYCLE -- 一直累加,不循环
NOCACHE --设置缓存cache个序列,如果系统down掉了或者其它情况将会导致序列不连续,也可以设置为---------NOCACHE

--下一个值
select seqTest.nextval from dual;
--当前的值
select seqTest.currval from dual;

--设置Shenqingdh队列
CREATE SEQUENCE seqShenqingdh
INCREMENT BY 1 -- 每次加几个
START WITH 100000001 -- 从100000001开始计数
NOMAXvalue -- 不设置最大值
NOCYCLE -- 一直累加,不循环
CACHE 10 --设置缓存cache个序列,如果系统down掉了或者其它情况将会导致序列不连续,也可以设置为---------NOCACHE

--查询 (第一次要先查nextVal 值,否则直接查currval 值会报错)
select seqShenqingdh.currval from dual
select seqShenqingdh.nextVal from dual


--得到Sequence值 
--定义好sequence后,你就可以用currVal,nextVal取得值。
-- CurrVal:返回 sequence的当前值 
-- NextVal:增加sequence的值,然后返回 增加后sequence值 
--SELECT [定义Sequence名称].CurrVal FROM DUAL; 
--如得到上边创建Sequence值的语句为:
select seqShenqingdh.nextVal from dual

--删除序列
DROP SEQUENCE LAB.TEST_ITEM_NO;
--查询序列名,用户
SELECT t.* from dba_SEQUENCES t where t.sequence_name like '%TEST%';

注:
  1、如果想要改变start的值,必须 drop  sequence 再重建一个序列
  2、如果想要改变minvalue的值,必须删除序列后再重新建立序列化。不可以修改序列化的minvalue。

视图

###创建视图
create [or replace ] view view_name 
[column1,column2,column3...] --和查询字句的返回列数匹配
as 
select xxx from xxx
[WITH CHECK OPTION]
[with read only];

###实例 scott 用户,得有创建视图的权限
connect /as system/manager
grant create view to scott,xxx;

--创建只读视图
--查询目前每个岗位姓名,平均工资(保留两位小数)、工资总和、最高工资和最低工资。分组,然后连接查名字
CREATE OR REPLACE VIEW v_dept_sal AS
    SELECT
        d.dname ,avg_sal,
        sum_sal,
        max_sal,
        min_sal
    FROM
        (
            SELECT
                deptno,
                to_number(TRIM(to_char(AVG(sal), '99999999999999.99'))) avg_sal,
                SUM(sal) sum_sal,
                MAX(sal) max_sal,
                MIN(sal) min_sal
            FROM
                emp
            GROUP BY
                deptno
        ) s
        LEFT JOIN dept                                                                                                                                               d ON s.deptno = d.deptno
WITH READ ONLY;


###查询视图
SELECT * FROM V_DEPT_SAL;

###修改基表中数据,发现视图中的数据也会同时更新
UPDATE DEPT SET DNAME='SALES1' WHERE DEPTNO=30;

###查看快照
--可以通过这种方法查出最近某个时间的快照
select * from 表 as of timestamp to_timestamp('20151021 09:00:00','yyyymmdd hh24:mi:ss')
where 字段名=''

查询表空间占用


SELECT DD.TABLESPACE_NAME,
       DD.AUTOEXTENSIBLE,
       DD.ONLINE_STATUS,
       DD.INCREMENT_BY * 8 / 1024 "next(M)",
       A.*
  FROM (SELECT D.FILE_ID AS FID,
               MAX(D.BYTES) / 1024 / 1024 "total(M)",
               NVL(SUM(F.BYTES), 0) / 1024 / 1024 "free(M)",
               (1 - ((NVL(SUM(F.BYTES), 0) / 1024 / 1024) /
               (MAX(D.BYTES) / 1024 / 1024))) * 100 "usage(%)",
               D.FILE_NAME,
               MAX(D.BYTES) - NVL(SUM(F.BYTES), 0) USED_BYTES,
               ROUND(SQRT(MAX(F.BLOCKS) / SUM(F.BLOCKS)) *
                     (100 / SQRT(SQRT(COUNT(F.BLOCKS)))),
                     2) FRAG_IDX
          FROM DBA_FREE_SPACE F, DBA_DATA_FILES D
         WHERE F.TABLESPACE_NAME(+) = D.TABLESPACE_NAME
           AND F.FILE_ID(+) = D.FILE_ID
         GROUP BY D.FILE_NAME, D.FILE_ID) A
  LEFT JOIN DBA_DATA_FILES DD
    ON DD.FILE_ID = A.FID
ORDER BY DD.TABLESPACE_NAME ASC, A.FILE_NAME ASC;

数据库允许的最大连接数

SELECT COUNT(*) FROM V$SESSION;
SELECT VALUE FROM V$PARAMETER WHERE NAME = 'processes'; --数据库允许的最大连接数

Session

SELECT COUNT() FROM V$SESSION; --当前的session连接数
SELECT COUNT(
) FROM V$PROCESS; --当前的数据库连接数

查看SQL执行记录

SELECT * FROM V$SESSION T WHERE T.MACHINE='AA6IYGQ8GYQUKZF';
SELECT T.CPU_TIME,T.ELAPSED_TIME,t.* FROM V$SQL T WHERE T.ADDRESS='000000008DB81038';

posted @ 2020-02-09 13:10  iullor  阅读(276)  评论(0编辑  收藏  举报