Oracle自带系统表与常用的SQL语法

1、 Oracle的系统常用表

  • 场景:用最多的场景如: 代码生成器开发或写SQL脚本语句创建表或索引、视图、写存储过程、改变表结构(扩展字段,修改字段,修改字段长度)等。
表名 表描述(作用)
user_tables 可查询当前用户的表
all_tables 可查询所有用户的表
dba_tables 可查询包括系统表在内的所有表
user_users 描述当前用户
all_users 列出数据库中对当前用户可见的所有用户
dba_users 描述数据库中所有用户
user_tab_columns 获取用户表的所有字段还有字段的属性
all_tab_columns 获取用户表的所有字段还有字段的属性
dba_tab_columns 获取用户表的所有字段还有字段的属
user_tab_comments 获取表注释
user_col_comments 获取字段注释
user_indexes 查询出用户所有表的索引
user_ind_columns 查询表的索引
user_cons_columns 查询表的主键
user_constraints 查找表的外键
user_cons_columns 查询外键约束的列名
dba_data_files 、dba_tablespaces 查看数据库中所有的表空间
dba_tables 指定用户所拥有的表空间(已经使用了哪些表空间)

2、语法SQL使用

--第一种方法: 查询dba_tab_columns
 
select COLUMN_NAME,DATA_TYPE,DATA_LENGTH from dba_tab_columns where table_name =upper('表名') order by COLUMN_NAME
 
--这种方法需要有DBA权限
 
--第二种方法: 查询 user_tab_cols
select  COLUMN_NAME,DATA_TYPE,DATA_LENGTH   from  user_tab_cols   where table_name=upper('表名')
 
order by COLUMN_NAME
--这种方法只能查找当前用户下的表
 
--第三种方法: 查询ALL_TAB_COLUMNS
select distinct COLUMN_NAME,DATA_TYPE,DATA_LENGTH 
from ALL_TAB_COLUMNS
WHERE TABLE_NAME= upper('表名')
--这种方法可以查询所有用户下的表
 
---------------------------补充-------------------------------------------------------------
 
--增加cw_srcbpb表字段
alter table cw_srcbpb  add (SRCBPB_RJBPBL varchar2(100) );
--修改cw_srcbpb表字段
alter table cw_srcbpb  modify (SRCBPB_RJBPBL number(30,3) );
 
--Oracle查看所有表和字段
 
--获取表:

select table_name from user_tables; --当前用户的表       
select table_name from all_tables; --所有用户的表   
select table_name from dba_tables; --包括系统表
select table_name from dba_tables where owner='LBSP'; --获取用户***所拥有的表这里的用户名要记得是用大写的。
-- 获取表字段:其实这里是根据用户的权限来获取字段的属性(表名要大写)
select * from user_tab_columns where Table_Name='用户表';--获取用户表的所有字段还有字段的属性。
select * from all_tab_columns where Table_Name='用户表';--获取用户表的所有字段还有字段的属性。
select * from dba_tab_columns where Table_Name='用户表';--获取用户表的所有字段还有字段的属性。
 
--获取表注释:
select * from user_tab_comments
--user_tab_comments:table_name,table_type,comments
--相应的还有dba_tab_comments,all_tab_comments,这两个比user_tab_comments多了ower列。
 
--获取字段注释:
select * from user_col_comments
--user_col_comments:table_name,column_name,comments
--相应的还有dba_col_comments,all_col_comments,这两个比user_col_comments多了ower列。
--查询出用户所有表的索引
select   *   from   user_indexes
--查询用户表的索引(非聚集索引): 
select   *   from   user_indexes where   uniqueness='NONUNIQUE'
--查询用户表的主键(聚集索引): 
select   *   from   user_indexes where   uniqueness='UNIQUE' 
--查询表的索引
select t.*,i.index_type from user_ind_columns t,user_indexes i where t.index_name = i.index_name and
t.table_name='NODE'
--查询表的主键
select cu.* from user_cons_columns cu, user_constraints au where cu.constraint_name = au.constraint_name and
au.constraint_type = 'P' AND cu.table_name = 'NODE'
--查找表的唯一性约束(包括名称,构成列): 
select column_name from user_cons_columns cu, user_constraints au where cu.constraint_name=au.constraint_name and
cu.table_name='NODE'
--查找表的外键
select * from user_constraints c where c.constraint_type = 'R' and c.table_name='STAFFPOSITION';
--查询外键约束的列名: 
select * from user_cons_columns cl where cl.constraint_name = '外键名称';
--查询引用表的键的列名:
select * from user_cons_columns cl where cl.constraint_name = '外键引用表的键名';

--删除表空间
drop tablespace AHTBSPACETEST including contents and datafiles cascade constraints
--查询当前索引的状态:
select distinct index_name,table_owner,table_name,status from user_indexes

 

3、结合声明声明式高级用法

3.1 创建表:以T_CLASS班级表和T_STUDENT学生表为主
  • 关键字: 执行 、即时(马上) 、开始 、结束、如果 、结束语句 关键字的使用,而commit一般SQL脚本只有一个
  • 函数:转换小写
  • 系统表:user_tables
  • 注意:结束以 【/ 斜杆】结束
declare
    iCnt number := 0; 
begin 
    select count(*) into iCnt from user_tables  where  lower(table_name) = lower('T_CLASS'); 
    if iCnt = 0 then -- 如果查询不到这个表就创建这个表
    execute immediate  'create table T_CLASS 
    (
        CLASS_ID    NUMBER(11) NOT NULL ,
        CLASS_NAME    VARCHAR2(50) NOT NULL,
        CLASS_NO    VARCHAR2(30) NOT NULL,
        CLASS_NUM    NUMBER(10) NOT NULL
    )'; 
   --- 对表和表属性加标注
    execute immediate 'comment on table T_CLASS is ''班级表''';
    execute immediate 'alter table T_CLASS add constraint PK_CLASS_ID primary key (CLASS_ID)' ;
    execute immediate 'comment on column T_CLASS.CLASS_NAME is ''班级名称''';
    execute immediate 'comment on column T_CLASS.CLASS_NO is ''班级编号''';
    execute immediate 'comment on column T_CLASS.CLASS_NUM is ''班级人数''';
    end if; 
end; 
/

declare
    iCnt number := 0; 
begin 
    select count(*) into iCnt from user_tables  where  lower(table_name) = lower('T_STUDENT'); 
    if iCnt = 0 then -- 如果查询不到这个表就创建这个表
    execute immediate  'create table T_STUDENT 
    (
        USER_ID    NUMBER(11) NOT NULL ,
        ID_CARD_CODE    VARCHAR2(50) NOT NULL,
        USER_NAME    VARCHAR2(30) NOT NULL,
        PASS_WORD    VARCHAR2(30) NOT NULL,
        AGE    NUMBER(10)  NOT NULL,
        ADDRESS    VARCHAR2(255) ,
        CREATE_TIME    DATE
    )'; 
    execute immediate 'comment on table T_STUDENT is ''学生用户表''';
    execute immediate 'alter table T_STUDENT add constraint PK_USER_ID primary key (USER_ID)' ;
    execute immediate 'comment on column T_STUDENT.ID_CARD_CODE is ''身份证编号''';
    execute immediate 'comment on column T_STUDENT.USER_NAME is ''用户名''';
    execute immediate 'comment on column T_STUDENT.PASS_WORD is ''用户密码''';
    execute immediate 'comment on column T_STUDENT.AGE is ''年龄''';
    execute immediate 'comment on column T_STUDENT.ADDRESS is ''地址''';
    execute immediate 'comment on column T_STUDENT.CREATE_TIME is ''创建时间''';
    end if; 
end; 
/
3.2 创建索引
  • 关键字: 、
  • 系统表: user_ind_columns
--对学生表的身份证ID加唯一索引ID_CARD_CODE
declare
  iCnt number := 0;
begin
  select count(*) into iCnt from user_ind_columns  where  lower(index_name) = lower('stu_idx_card_code') and lower(table_name)=lower('T_STUDENT');
  if iCnt = 0 then  
     execute immediate 'create unique index stu_idx_card_code on T_STUDENT(id_card_code)'; 
  end if;
end;
/

--创建学生表序列Id     
declare
  iCount integer;
begin
  select count(*) into iCount from user_sequences where upper(sequence_name)=upper('SQ_T_STUDENT');
  if iCount = 0 then
    execute immediate
      'create sequence SQ_T_STUDENT
        minvalue 1
        maxvalue 999999999999999999999999999
        start with 1
        increment by 1
        nocache';
  end if;
end;
/   
3.3 删除索引
  • 关键字: 、
  • 系统表: user_ind_columns
--删除T_STUDENT的唯一索引
declare
  iCnt number := 0;
begin
  select count(*) into iCnt from user_ind_columns where lower(index_name) = lower('stu_idx_card_code') and lower(table_name)=lower('T_STUDENT');
  if iCnt > 0 then  
     execute immediate 'drop index stu_idx_card_code '; 
  end if;
end;
/

 
--删除学生表序列Id     
declare
  iCount integer;
begin
  select count(*) into iCount from user_sequences where upper(sequence_name)=upper('SQ_T_STUDENT');
  if iCount > 0 then
    execute immediate  'drop sequence SQ_T_STUDENT ';
  end if;
end;
/   
3.4 创建视图与删除视图
  • 关键字: 、 、 、
  • 系统表: all_views
--传统创建视图脚本
 CREATE OR REPLACE VIEW V_STUDENT AS
    SELECT
       user_id,
       user_name ,  
       pass_word ,  
       age,       
       create_time, 
       id_card_code
     FROM T_STUDENT
WITH READ ONLY;   --只读视图
--声明式删除视图
declare
  iCnt number := 0;
begin 
  SELECT count(*) into iCnt  FROM all_views where upper(view_name)=upper('V_STUDENT');
  if iCnt > 0 then
    execute immediate 'drop VIEW V_STUDENT ';
  end if;
end;
/
 --声明式创建视图脚本,WITH READ ONLY表示只读视图
declare
  iCnt number := 0;
begin 
  SELECT count(*) into iCnt  FROM all_views where upper(view_name)=upper('V_STUDENT');
  if iCnt = 0 then
    execute immediate 'CREATE OR REPLACE VIEW V_STUDENT AS
        SELECT
          user_id,
          user_name ,  
          pass_word ,  
          age,       
          create_time, 
          ID_CARD_CODE
        FROM T_STUDENT
        WITH READ ONLY
      ';
  end if;
end;
/

4、创建用户

  • 四步曲 :(其中文件位置、文件大小、自增量、命名之类可按需自定义)
  • 1、 创建临时表空间:
create temporary tablespace MyTestSpace_Temp tempfile 'C:\APP\ADMINISTRATOR\ORADATA\ORCL\SEAN_TEMP01.DBF'size 10m autoextend on next 10m maxsize 100m extent management local
  • 2 、创建数据表空间:
create tablespace mytest_data logging datafile 'C:\APP\ADMINISTRATOR\ORADATA\ORCL\SEAN_DATA01.DBF' size 10m autoextend on next 10m maxsize 100m extent management local
  • 3 、创建用户并指定表空间:
create tablespace mytest_data logging datafile 'C:\APP\ADMINISTRATOR\ORADATA\ORCL\SEAN_DATA01.DBF' size 10m autoextend on next 10m maxsize 100m extent management local
  • 4 、给用户授予权限:
grant connect,resource,dba to mytest

5、Oracle权限与改表空间

  • 1、给用户赋予DBA权限:
grant dba to mytest
  • 2、撤销用户对所有表空间都可使用的权限(相当于撤销用户在表空间上的DBA权限):
revoke unlimited tablespace from mytest
  • 3 将用户在SYSTEM表空间的配额置为0:
alter user mytest  quota 0 on SYSTEM

*4 设置用户在mytest_data 表空间上配额不受限

alter user mytest  quota unlimited on mytest_data ;
  • 5、修改表空间:
alter table TD_USERS move tablespace TABLESPACE_A // 第一步:将表TD_USERS移至表空间tablesapce_A下
alter index TD_USERS_ID rebuild tablespace TABLESPACE_A // 第二步:修改该表的索引的表空间

你可能感兴趣的:(Oracle自带系统表与常用的SQL语法)