(4)管理表【Oracle】

提示:此文章下的code示例皆在cmd下运行,未借助可视化工具

一、Note

1、认识表

1.1、二维表
  • 每个列都有自己的名称、类型、宽度、含义

  • 每行数据中的列也被称作字段(field)

  • 每一行数据被称作一个 元组 或 记录(record)

    • 与PL/SQL中的记录不是一个概念
1.2、表名
  • 长度控制在30字节以内

  • 必须以字母为开头

  • 表名中可以包含字母、数字、 下划线、#、$、\

    • 但是不赞成主动使用#、$、\
  • 表名绝对不可以是单纯的 保留字(如:order / group / by / from / number)

  • 表名在当前的命名空间(名称空间)中必须是唯一的

    • 每个用户都有自己的namespace来保存自己的对象,namespace定义了一组对象类型,表和视图都存放在同一个namespace中,所以同一个用户的表和视图不能重复,表和索引放在不同的namespace,所以可重名
1.3、列名
  • 长度必须控制在30字节以内
  • 必须以字母为开头
  • 列名中可以包含字母、数字、 下划线
  • 列名绝对不可以是单纯的 保留字
  • 列名在同一张表中必须是唯一的
1.4、查看表结构
  • DESCRIBE 表名 ;
  • DESC 表名 ;
1.5、相关数据字典
  • tab
  • user_tables
  • user_objects
  • all_tables
    • select * from all_tables ; 查看当前库的所有数据表

2、数据类型

  • NUMBER

    • 表示数字类型

      • 整数
      • 浮点数
    • 用法

      • NUMBER( precision [ , scale ])
      • precision(精度)表示数值类型的最大有效位数,取值范围是 [ 1, 38 ]
      • scale(标度)用来确定小数点的位置,取值范围是 [-84,127]
  • CHAR

    • 表示长度固定的字符域

    • 用法

      • CHAR ( size [ byte | char ])
      • size表示字符域的长度(或宽度),其取值范围是 [ 1 , 2000 ]
      • byte 或 char 表示单位
      • byte 表示字节,char 表示字符
      • 如果 size 后未显式指定 byte 或 char ,则默认是 byte
      • 当实际位数不足时会自动补空格
  • NCHAR

  • VARCHAR2

    • 表示长度可变的字符域

    • 用法

      • VARCHAR2 ( size [ byte | char])
      • size表示字符域的长度(或宽度),其取值范围是 [ 1 , 4000 ]
      • byte 或 char 表示单位
      • byte 表示字节,char 表示字符
      • 如果 size 后未显式指定 byte 或 char ,则默认是 byte,例:varchar(50)
      • 未显式指定 size ,则默认是5
      • 当实际位数不足时不会自动填充
    • oracle特有,中英文都占2字节,空串当作null值处理

    • varchar是标准SQL里的类型,汉字占2字节,英文占1字节,对空串不处理,存放固定长度字符串,范围 [ 1 , 2000 ],在MySQL里用的多

  • NVARCHAR2

  • DATE

    • 采用 7字节的、长度固定的数字(整数)来表示日期/时间类型
    • 7字节中存储了:世纪、年份、月份、小时、分钟、秒
    • 用法:birthdate DATE(列名 类型)
  • TIMESTAMP

    • 采用7字节或11字节的、长度固定的
    • 前7字节的存储与Date类型相同
  • LONG

    • 是字符类型
  • CLOB

    • 是占位比Long还多的字符类型
  • BLOB

  • oracle有22种数据类型,PL/SQL还有一种

3、创建表

3.1、创建标准表
  • CREATE TABLE 表名(
    列名 类型(宽度) [约束]
    [,列名 类型(宽度) [约束],......]
    );
    
3.2、创建临时表
  • 所谓临时表是指表中的数据会在会话或事物结束时被清除
  • 暂不关注
3.3、CTAS
  • 通过查询创建表(备份表)
  • CREATE TABLE 表名 AS 查询语句 ;
  • create table t_stu1 as select name as '姓名' , age as '年龄' form t_stu2 where age<20 ;
  • 利用t_stu2表中年龄小于20的数据 来 创建t_stu1表
    • 新表t_stu1有两列,列名就是这条语句里的列别名
  • SQL SERVER中,备份表语句:
    • select * into 备份表名 from 表名 where 条件;

4、更改表

4.1、增加列
  • ALTER TABLE 表名 ADD(列名 类型(宽度) [约束] ,......) ;
    
4.2、改列名
  • ALTER TABLE 表名 RENAME COLUMN 原列名 TO 新列名 ;
    
4.3、修改列类型及添加约束
  • ALTER TABLE 表名 MODIFY (原列名 新类型(新宽度) [新加约束名 新加约束类型] ,......) ;
    
  • 可去掉 modify后面的 ()

  • 可修改列的类型、宽度、添加此列约束名及约束类型

  • 如果不改类型,只给列添加约束,则可以不写 新类型(宽度)

4.4、删除列
  • ALTER TABLE 表名 DROP (列名 ,......) [ CASCADE constraints ] ;
    
  • cascade constraints 级联删除约束

5、重命名表

  • ALTER TABLE 原表名 RENAME TO 新表名 ;
    
  • RENAME 原表名 TO 新表名 ;
    

6、删除表(回收站)

6.1、删除
  • DROP TABLE 表名 [ CASCADE CONSTRAINTS ] [PURGE] ;
    
  • cascade constraints表示同时删除相关的约束

  • purge 表示彻底删除该表而不是将该表删除到回收站(recyclebin)

  • 如果没有用purge,则该表在回收站中,通过 user_tables 查不到这个表,但通过 tab 可以查到回收站里的表,注意此时回收站里的表名已经修改为默认的名字了

6.2、查看回收站
  • show recyclebin 
    
  • 使用 show recyclebin 时不要以 分号; 结束,否则可能导致 SQL*Plus 退出

6.3、清空回收站
  • purge recyclebin
    
6.4、恢复
  • flashback table 原表名 to before drop ;
    
  • 只有在回收站中存在的表才可以被恢复,注意在回收站里的表的名字是已经被重新改过名了

7、截断表

  • 作用

    • 将整张表中所有数据全部删除的最好方法
    • 就是仅仅保留表结构,其中所有数据统统舍弃(保留列名,删除记录)
  • 用法

    • TRUNCATE TABLE 表名 ; 
      

二、Code

1、管理表:创建表/CTAS/查看表结构/length()/定长数字域/变长数字域/改表名/删表/回收站/截断表

1、创建表

  • 查看表结构 :DESCRIBE emp ;

  • 创建 学生表,其中包括 编号、姓名、性别、出生日期

    • CREATE TABLE t_students ( id NUMBER(5) , name VARCHAR2(50) , gender CHAR(6) , birthdate DATE );
  • 简单插入一些数据

    • INSERT INTO t_students VALUES ( 1 , '张三丰' , 'male' , sysdate ) ;

2、使用 length 函数获取 name 和 gender 的长度

  • SELECT name , length( name ) , gender , length( gender ) from t_students ;
  • length返回的是字符数,oracle安装时使用的是GBK编码,1个汉字作为1个字符占2字节,1个字母作为1个字符占1字节
  • length( name ) ,name类型为varchar2(50),‘张三丰’ 占6字节算3字符,因此length函数返回3
  • length( gender ),gender类型为char(6),定长6字节,因此数据 ‘male’ 的length函数返回 6(4字符+2补全的空白字符);数据 ‘男’ 的length函数返回 5 (1个字占2字节算1字符,1+补的4字节空白字符)

3、通过查询一张表创建新的表,CTAS

  • 通过查询 emp 表创建一个新表
    • CREATE TABLE myemp1 AS SELECT empno , ename , job , sal FROM emp ;
  • 还可以在查询语句中使用别名来影响新表的列名
    • CREATE TABLE myemp2 AS SELECT empno id , ename name , job , sal salary FROM emp ;

4、管理表(回收站)

  • 尝试修改表名称

    • ALTER TABLE myemp1 RENAME TO myemp ;
    • RENAME myemp1 TO myemp ;
  • 删除表

    • DROP TABLE t_employees ;

    • SELECT table_name FROM user_tables ; 查不到被删除的表

    • SELECT tname FROM tab ; 查得到被删除的表,此时表名已改变为BIN$XBpSakKxRq+k5r41TQzz+w==$0,是回收站中的被删除的表,不能查看已删除表的结构

    • DESC BIN$XBpSakKxRq+k5r41TQzz+w==$0 ; 错误:非法的标识符。

  • 查看回收站中的表 ( 注意,这个命令不要以分号结束,否则导致 SQL*Plus 退出 )

    • show recyclebin
  • 从回收站中恢复已经被删除的表

    • FLASHBACK TABLE t_employees TO BEFORE DROP ;
  • 当回收站中的表都不再被需要时,可以清空回收站

    • PURGE recyclebin ;
  • 删除表时使用 PURGE 实现彻底删除(表不会存在回收站里)

    • DROP TABLE myemp PURGE ;

5、截断表,就是将表中所有数据统统删除,仅留下表结构(列名)

  • TRUNCATE TABLE myemp ;
SQL> 
SQL> -- 管理表
SQL> 
SQL> --
SQL> -- 查看表结构
SQL> DESCRIBE emp ;
 名称                                                              是否为空? 类型
 ----------------------------------------------------------------- -------- --------------------------------------------
 EMPNO                                                             NOT NULL NUMBER(4)
 ENAME                                                                      VARCHAR2(10)
 JOB                                                                        VARCHAR2(9)
 MGR                                                                        NUMBER(4)
 HIREDATE                                                                   DATE
 SAL                                                                        NUMBER(7,2)
 COMM                                                                       NUMBER(7,2)
 DEPTNO                                                                     NUMBER(2)

SQL> -- 创建 学生表,其中包括 编号、姓名、性别、出生日期
SQL> CREATE TABLE t_students (
  2     id NUMBER(5) ,
  3     name VARCHAR2(50) ,
  4     gender CHAR(6) ,
  5     birthdate DATE
  6  );

表已创建。

SQL> -- 查看表结构
SQL> DESC t_students ;
 名称                                                              是否为空? 类型
 ----------------------------------------------------------------- -------- --------------------------------------------
 ID                                                                         NUMBER(5)
 NAME                                                                       VARCHAR2(50)
 GENDER                                                                     CHAR(6)
 BIRTHDATE                                                                  DATE

SQL> -- 先简单插入一些数据
SQL> INSERT INTO t_students VALUES ( 1 , '张三丰' , 'male' , sysdate ) ;

已创建 1 行。

SQL> SELECT * FROM t_students ;

        ID NAME                                               GENDER BIRTHDATE                                          
---------- -------------------------------------------------- ------ -------------------                                
         1 张三丰                                             male   2020-06-19 16:18:43                                

SQL> -- 使用 length 函数获取 name 和 gender 的长度
SQL> SELECT name , length( name ) , gender , length( gender ) from t_students ;

NAME                                               LENGTH(NAME) GENDER LENGTH(GENDER)                                   
-------------------------------------------------- ------------ ------ --------------                                   
张三丰                                                        3 male                6                                   

SQL> INSERT INTO  t_students VALUES ( 2 , '阿里巴巴' , '男' , sysdate ) ;

已创建 1 行。

SQL> -- 使用 length 函数获取 name 和 gender 的长度
SQL> SELECT name , length( name ) , gender , length( gender ) from t_students ;

NAME                                               LENGTH(NAME) GENDER LENGTH(GENDER)                                   
-------------------------------------------------- ------------ ------ --------------                                   
张三丰                                                        3 male                6                                   
阿里巴巴                                                      4 男                  5                                   

SQL> -- 因为在 Oracle 创建数据库时使用的字符编码时默认的 GBK ,因此一个汉字占用 两个字节( byte )
SQL> 
SQL> -- 汉字 "男" 占用 两个字节后,还差 4 个字节就可以将 gender 补充够 6 个字节,因此在 "男"之后补充了4个空白
SQL> 
SQL> -- 所以最后使用 length 统计时,返回的是 5 个字符,因为有 一个汉字 和 四个空白字符
SQL> 
SQL> INSERT INTO  t_students VALUES ( 3 , '阿凡提' , '靓仔' , sysdate );

已创建 1 行。

SQL> -- 使用 length 函数获取 name 和 gender 的长度
SQL> SELECT name , length( name ) , gender , length( gender ) from t_students ;

NAME                                               LENGTH(NAME) GENDER LENGTH(GENDER)                                   
-------------------------------------------------- ------------ ------ --------------                                   
张三丰                                                        3 male                6                                   
阿里巴巴                                                      4 男                  5                                   
阿凡提                                                        3 靓仔                4                                   

SQL> INSERT INTO  t_students VALUES ( 4 , '奥斯特洛夫斯基' , '靓仔啊' , sysdate );

已创建 1 行。

SQL> -- 使用 length 函数获取 name 和 gender 的长度
SQL> SELECT name , length( name ) , gender , length( gender ) from t_students ;

NAME                                               LENGTH(NAME) GENDER LENGTH(GENDER)                                   
-------------------------------------------------- ------------ ------ --------------                                   
张三丰                                                        3 male                6                                   
阿里巴巴                                                      4 男                  5                                   
阿凡提                                                        3 靓仔                4                                   
奥斯特洛夫斯基                                                7 靓仔啊              3                                   

SQL> 
SQL> -- 通过查询一张表创建新的表
SQL> 
SQL> -- 通过查询 emp 表创建一个新表
SQL> 
SQL> CREATE TABLE myemp1 AS SELECT empno , ename , job , sal FROM emp ;

表已创建。

SQL> DESC myemp1 ;
 名称                                                              是否为空? 类型
 ----------------------------------------------------------------- -------- --------------------------------------------
 EMPNO                                                             NOT NULL NUMBER(4)
 ENAME                                                                      VARCHAR2(10)
 JOB                                                                        VARCHAR2(9)
 SAL                                                                        NUMBER(7,2)

SQL> SELECT * FROM myemp1 ;

     EMPNO ENAME      JOB              SAL                                                                              
---------- ---------- --------- ----------                                                                              
      7369 SMITH      CLERK            800                                                                              
      7499 ALLEN      SALESMAN        1600                                                                              
      7521 WARD       SALESMAN        1250                                                                              
      7566 JONES      MANAGER         2975                                                                              
      7654 MARTIN     SALESMAN        1250                                                                              
      7698 BLAKE      MANAGER         2850                                                                              
      7782 CLARK      MANAGER         2450                                                                              
      7788 SCOTT      ANALYST         3000                                                                              
      7839 KING       PRESIDENT       5000                                                                              
      7844 TURNER     SALESMAN        1500                                                                              
      7876 ADAMS      CLERK           1100                                                                              
      7900 JAMES      CLERK            950                                                                              
      7902 FORD       ANALYST         3000                                                                              
      7934 MILLER     CLERK           1300                                                                              
      9257 HUA'AN     CLERK           1300                                                                              
      8526 QIU'XIANG  ANALYST         1400                                                                              

已选择16行。

SQL> -- 还可以在查询语句中使用别名来影响新表的列名
SQL> 
SQL> CREATE TABLE myemp2 AS SELECT empno id , ename name , job , sal salary FROM emp ;

表已创建。

SQL> DESC myemp2 ;
 名称                                                              是否为空? 类型
 ----------------------------------------------------------------- -------- --------------------------------------------
 ID                                                                NOT NULL NUMBER(4)
 NAME                                                                       VARCHAR2(10)
 JOB                                                                        VARCHAR2(9)
 SALARY                                                                     NUMBER(7,2)

SQL> SELECT * FROM myemp2 ;

        ID NAME       JOB           SALARY                                                                              
---------- ---------- --------- ----------                                                                              
      7369 SMITH      CLERK            800                                                                              
      7499 ALLEN      SALESMAN        1600                                                                              
      7521 WARD       SALESMAN        1250                                                                              
      7566 JONES      MANAGER         2975                                                                              
      7654 MARTIN     SALESMAN        1250                                                                              
      7698 BLAKE      MANAGER         2850                                                                              
      7782 CLARK      MANAGER         2450                                                                              
      7788 SCOTT      ANALYST         3000                                                                              
      7839 KING       PRESIDENT       5000                                                                              
      7844 TURNER     SALESMAN        1500                                                                              
      7876 ADAMS      CLERK           1100                                                                              
      7900 JAMES      CLERK            950                                                                              
      7902 FORD       ANALYST         3000                                                                              
      7934 MILLER     CLERK           1300                                                                              
      9257 HUA'AN     CLERK           1300                                                                              
      8526 QIU'XIANG  ANALYST         1400                                                                              

已选择16行。

SQL> -- 尝试修改表名称
SQL> 
SQL> ALTER TABLE myemp1 RENAME TO myemp ;

表已更改。

SQL> DESC myemp1 ;
ERROR:
ORA-04043: 对象 myemp1  不存在 


SQL> DESC myemp ;
 名称                                                              是否为空? 类型
 ----------------------------------------------------------------- -------- --------------------------------------------
 EMPNO                                                             NOT NULL NUMBER(4)
 ENAME                                                                      VARCHAR2(10)
 JOB                                                                        VARCHAR2(9)
 SAL                                                                        NUMBER(7,2)

SQL> RENAME myemp2 TO t_employees ;

表已重命名。

SQL> DESC myemp2 ;
ERROR:
ORA-04043: 对象 myemp2  不存在 


SQL> DESC t_employees ;
 名称                                                              是否为空? 类型
 ----------------------------------------------------------------- -------- --------------------------------------------
 ID                                                                NOT NULL NUMBER(4)
 NAME                                                                       VARCHAR2(10)
 JOB                                                                        VARCHAR2(9)
 SALARY                                                                     NUMBER(7,2)

SQL> 
SQL> -- 尝试删除 t_employees 表
SQL> 
SQL> -- 在删除之前先查询当前用户所拥有的所有的表的表名
SQL> SELECT table_name FROM user_tables ;

TABLE_NAME                                                                                                              
------------------------------                                                                                          
EMP                                                                                                                     
DEPT                                                                                                                    
BONUS                                                                                                                   
SALGRADE                                                                                                                
DUMMY                                                                                                                   
S_CUSTOMER                                                                                                              
S_DEPT                                                                                                                  
S_EMP                                                                                                                   
S_IMAGE                                                                                                                 
S_INVENTORY                                                                                                             
S_ITEM                                                                                                                  
S_LONGTEXT                                                                                                              
S_ORD                                                                                                                   
S_PRODUCT                                                                                                               
S_REGION                                                                                                                
S_TITLE                                                                                                                 
S_WAREHOUSE                                                                                                             

TABLE_NAME                                                                                                              
------------------------------                                                                                          
T_STUDENTS                                                                                                              
MYEMP                                                                                                                   
T_EMPLOYEES                                                                                                             

已选择20行。

SQL> DROP TABLE t_employees ;

表已删除。

SQL> -- 在删除之后再次查询当前用户所拥有的所有的表的表名
SQL> SELECT table_name FROM user_tables ;

TABLE_NAME                                                                                                              
------------------------------                                                                                          
EMP                                                                                                                     
DEPT                                                                                                                    
BONUS                                                                                                                   
SALGRADE                                                                                                                
DUMMY                                                                                                                   
S_CUSTOMER                                                                                                              
S_DEPT                                                                                                                  
S_EMP                                                                                                                   
S_IMAGE                                                                                                                 
S_INVENTORY                                                                                                             
S_ITEM                                                                                                                  
S_LONGTEXT                                                                                                              
S_ORD                                                                                                                   
S_PRODUCT                                                                                                               
S_REGION                                                                                                                
S_TITLE                                                                                                                 
S_WAREHOUSE                                                                                                             

TABLE_NAME                                                                                                              
------------------------------                                                                                          
T_STUDENTS                                                                                                              
MYEMP                                                                                                                   

已选择19行。

SQL> SELECT tname FROM tab ;

TNAME                                                                                                                   
------------------------------                                                                                          
BIN$XBpSakKxRq+k5r41TQzz+w==$0                                                                                          
BONUS                                                                                                                   
DEPT                                                                                                                    
DUMMY                                                                                                                   
EMP                                                                                                                     
MYEMP                                                                                                                   
SALGRADE                                                                                                                
S_CUSTOMER                                                                                                              
S_DEPT                                                                                                                  
S_EMP                                                                                                                   
S_IMAGE                                                                                                                 
S_INVENTORY                                                                                                             
S_ITEM                                                                                                                  
S_LONGTEXT                                                                                                              
S_ORD                                                                                                                   
S_PRODUCT                                                                                                               
S_REGION                                                                                                                

TNAME                                                                                                                   
------------------------------                                                                                          
S_TITLE                                                                                                                 
S_WAREHOUSE                                                                                                             
T_STUDENTS                                                                                                              

已选择20行。

SQL> DESC BIN$XBpSakKxRq+k5r41TQzz+w==$0 ;
SP2-0565: 非法的标识符。
SQL> -- 其中的 BIN$XBpSakKxRq+k5r41TQzz+w==$0 就是 回收站中的被删除的表
SQL> 
SQL> -- 使用 show recyclebin 命令可以查看回收站中的表 ( 注意,这个命令不要以分号结束,否则导致 SQL*Plus 退出 )
SQL> show recyclebin
ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME                                                  
---------------- ------------------------------ ------------ -------------------                                        
T_EMPLOYEES      BIN$XBpSakKxRq+k5r41TQzz+w==$0 TABLE        2020-06-19:16:39:38                                        
SQL> 
SQL> 
SQL> -- 如果需要从回收站中恢复已经被删除的表,可以使用 flashback table 语句实现
SQL> FLASHBACK TABLE t_employees TO BEFORE DROP ;

闪回完成。

SQL> -- 通过查询 tab 列出当前用户所拥有的表 ( 包括已经被删除到 回收站 的表 )
SQL> SELECT tname FROM tab ;

TNAME                                                                                                                   
------------------------------                                                                                          
BONUS                                                                                                                   
DEPT                                                                                                                    
DUMMY                                                                                                                   
EMP                                                                                                                     
MYEMP                                                                                                                   
SALGRADE                                                                                                                
S_CUSTOMER                                                                                                              
S_DEPT                                                                                                                  
S_EMP                                                                                                                   
S_IMAGE                                                                                                                 
S_INVENTORY                                                                                                             
S_ITEM                                                                                                                  
S_LONGTEXT                                                                                                              
S_ORD                                                                                                                   
S_PRODUCT                                                                                                               
S_REGION                                                                                                                
S_TITLE                                                                                                                 

TNAME                                                                                                                   
------------------------------                                                                                          
S_WAREHOUSE                                                                                                             
T_EMPLOYEES                                                                                                             
T_STUDENTS                                                                                                              

已选择20行。

SQL> -- 使用 DROP TABLE 删除表,但未使用 PURGE 选项
SQL> DROP TABLE t_employees ;

表已删除。

SQL> -- 通过查询 tab 列出当前用户所拥有的表 ( 包括已经被删除到 回收站 的表 )
SQL> SELECT tname FROM tab ;

TNAME                                                                                                                   
------------------------------                                                                                          
BIN$Y8ebA+8tTbOUOQrdcYCO7A==$0                                                                                          
BONUS                                                                                                                   
DEPT                                                                                                                    
DUMMY                                                                                                                   
EMP                                                                                                                     
MYEMP                                                                                                                   
SALGRADE                                                                                                                
S_CUSTOMER                                                                                                              
S_DEPT                                                                                                                  
S_EMP                                                                                                                   
S_IMAGE                                                                                                                 
S_INVENTORY                                                                                                             
S_ITEM                                                                                                                  
S_LONGTEXT                                                                                                              
S_ORD                                                                                                                   
S_PRODUCT                                                                                                               
S_REGION                                                                                                                

TNAME                                                                                                                   
------------------------------                                                                                          
S_TITLE                                                                                                                 
S_WAREHOUSE                                                                                                             
T_STUDENTS                                                                                                              

已选择20行。

SQL> -- 查看回收站
SQL> show recyclebin
ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME                                                  
---------------- ------------------------------ ------------ -------------------                                        
T_EMPLOYEES      BIN$Y8ebA+8tTbOUOQrdcYCO7A==$0 TABLE        2020-06-19:16:48:17                                        
SQL> 
SQL> 
SQL> -- 当回收站中的表都不再被需要时,可以清空回收站
SQL> 
SQL> PURGE recyclebin ;

回收站已清空。

SQL> show recyclebin
SQL>
SQL>
SQL> -- 通过查询 tab 列出当前用户所拥有的表 ( 包括已经被删除到 回收站 的表 )
SQL> SELECT tname FROM tab ;

TNAME                                                                                                                   
------------------------------                                                                                          
BONUS                                                                                                                   
DEPT                                                                                                                    
DUMMY                                                                                                                   
EMP                                                                                                                     
MYEMP                                                                                                                   
SALGRADE                                                                                                                
S_CUSTOMER                                                                                                              
S_DEPT                                                                                                                  
S_EMP                                                                                                                   
S_IMAGE                                                                                                                 
S_INVENTORY                                                                                                             
S_ITEM                                                                                                                  
S_LONGTEXT                                                                                                              
S_ORD                                                                                                                   
S_PRODUCT                                                                                                               
S_REGION                                                                                                                
S_TITLE                                                                                                                 

TNAME                                                                                                                   
------------------------------                                                                                          
S_WAREHOUSE                                                                                                             
T_STUDENTS                                                                                                              

已选择19行。

SQL> -- 删除表时使用 PURGE 实现彻底删除
SQL> DROP TABLE myemp PURGE ;

表已删除。

SQL> -- 通过查询 tab 列出当前用户所拥有的表 ( 包括已经被删除到 回收站 的标 )
SQL> SELECT tname FROM tab ;

TNAME                                                                                                                   
------------------------------                                                                                          
BONUS                                                                                                                   
DEPT                                                                                                                    
DUMMY                                                                                                                   
EMP                                                                                                                     
SALGRADE                                                                                                                
S_CUSTOMER                                                                                                              
S_DEPT                                                                                                                  
S_EMP                                                                                                                   
S_IMAGE                                                                                                                 
S_INVENTORY                                                                                                             
S_ITEM                                                                                                                  
S_LONGTEXT                                                                                                              
S_ORD                                                                                                                   
S_PRODUCT                                                                                                               
S_REGION                                                                                                                
S_TITLE                                                                                                                 
S_WAREHOUSE                                                                                                             

TNAME                                                                                                                   
------------------------------                                                                                          
T_STUDENTS                                                                                                              

已选择18行。

SQL> show recyclebin
SQL>
SQL> -- CTAS 创建表
SQL> CREATE TABLE myemp AS SELECT * FROM emp ;

表已创建。

SQL> DESC myemp ;
 名称                                                              是否为空? 类型
 ----------------------------------------------------------------- -------- --------------------------------------------
 EMPNO                                                             NOT NULL NUMBER(4)
 ENAME                                                                      VARCHAR2(10)
 JOB                                                                        VARCHAR2(9)
 MGR                                                                        NUMBER(4)
 HIREDATE                                                                   DATE
 SAL                                                                        NUMBER(7,2)
 COMM                                                                       NUMBER(7,2)
 DEPTNO                                                                     NUMBER(2)

SQL> -- 此处的日期格式是因为之前修改了格式,若退出sqlplus环境就会恢复原来日期格式
SQL> SELECT * FROM myemp ;

     EMPNO ENAME      JOB              MGR HIREDATE                   SAL       COMM     DEPTNO                         
---------- ---------- --------- ---------- ------------------- ---------- ---------- ----------                         
      7369 SMITH      CLERK           7902 1980-12-17 00:00:00        800                    20                         
      7499 ALLEN      SALESMAN        7698 1981-02-20 00:00:00       1600        300         30                         
      7521 WARD       SALESMAN        7698 1981-02-22 00:00:00       1250        500         30                         
      7566 JONES      MANAGER         7839 1981-04-02 00:00:00       2975                    20                         
      7654 MARTIN     SALESMAN        7698 1981-09-28 00:00:00       1250       1400         30                         
      7698 BLAKE      MANAGER         7839 1981-05-01 00:00:00       2850                    30                         
      7782 CLARK      MANAGER         7839 1981-06-09 00:00:00       2450                    10                         
      7788 SCOTT      ANALYST         7566 1982-12-09 00:00:00       3000                    20                         
      7839 KING       PRESIDENT            1981-11-17 00:00:00       5000                    10                         
      7844 TURNER     SALESMAN        7698 1981-09-08 00:00:00       1500          0         30                         
      7876 ADAMS      CLERK           7788 1983-01-12 00:00:00       1100                    20                         
      7900 JAMES      CLERK           7698 1981-12-03 00:00:00        950                    30                         
      7902 FORD       ANALYST         7566 1981-12-03 00:00:00       3000                    20                         
      7934 MILLER     CLERK           7782 1982-01-23 00:00:00       1300                    10                         
      9257 HUA'AN     CLERK           7839 1985-01-23 00:00:00       1300                                               
      8526 QIU'XIANG  ANALYST         7839 1985-01-23 00:00:00       1400                                               

已选择16行。

SQL> -- 使用 truncate table 可以截断一张表
SQL> -- 截断表,就是将表中所有数据统统删除,仅留下表结构
SQL> 
SQL> TRUNCATE TABLE myemp ;

表被截断。

SQL> SELECT * FROM myemp ;

未选定行

SQL> -- 列名仍存在,只是没有数据
SQL> DESC myemp ;
 名称                                                              是否为空? 类型
 ----------------------------------------------------------------- -------- --------------------------------------------
 EMPNO                                                             NOT NULL NUMBER(4)
 ENAME                                                                      VARCHAR2(10)
 JOB                                                                        VARCHAR2(9)
 MGR                                                                        NUMBER(4)
 HIREDATE                                                                   DATE
 SAL                                                                        NUMBER(7,2)
 COMM                                                                       NUMBER(7,2)
 DEPTNO                                                                     NUMBER(2)

SQL> spool off

2、更改表:添加列/改列名/修改列/删除列

  • 增加列
    • ALTER T ABLE t_students ADD ( hometown VARCHAR(100) ) ;
  • 改列名 ( 重命名列 )
    • ALTER TABLE t_students RENAME COLUMN hometown TO address ;
  • 修改列(可修改列的类型、宽度)
    • ALTER TABLE t_students MODIFY ( address VARCHAR2(150) ) ;
  • 删除列
    • ALTER TABLE t_students DROP ( address ) ;
SQL> -- 更改表
SQL> 
SQL> DESC t_students ;
 名称                                                              是否为空? 类型
 ----------------------------------------------------------------- -------- --------------------------------------------
 ID                                                                         NUMBER(5)
 NAME                                                                       VARCHAR2(50)
 GENDER                                                                     CHAR(6)
 BIRTHDATE                                                                  DATE

SQL> 
SQL> -- 增加列
SQL> 
SQL> ALTER TABLE t_students ADD ( hometown VARCHAR(100) ) ;

表已更改。

SQL> DESC t_students ;
 名称                                                              是否为空? 类型
 ----------------------------------------------------------------- -------- --------------------------------------------
 ID                                                                         NUMBER(5)
 NAME                                                                       VARCHAR2(50)
 GENDER                                                                     CHAR(6)
 BIRTHDATE                                                                  DATE
 HOMETOWN                                                                   VARCHAR2(100)

SQL> -- 改列名 ( 重命名列 )
SQL> ALTER TABLE t_students RENAME COLUMN hometown TO address ;

表已更改。

SQL> DESC t_students ;
 名称                                                              是否为空? 类型
 ----------------------------------------------------------------- -------- --------------------------------------------
 ID                                                                         NUMBER(5)
 NAME                                                                       VARCHAR2(50)
 GENDER                                                                     CHAR(6)
 BIRTHDATE                                                                  DATE
 ADDRESS                                                                    VARCHAR2(100)

SQL> -- 修改列:可修改列的类型、宽度
SQL> ALTER TABLE t_students MODIFY ( address VARCHAR2(150) ) ;

表已更改。

SQL> DESC t_students ;
 名称                                                              是否为空? 类型
 ----------------------------------------------------------------- -------- --------------------------------------------
 ID                                                                         NUMBER(5)
 NAME                                                                       VARCHAR2(50)
 GENDER                                                                     CHAR(6)
 BIRTHDATE                                                                  DATE
 ADDRESS                                                                    VARCHAR2(150)

SQL> ALTER TABLE t_students MODIFY ( address CHAR(150) ) ;

表已更改。

SQL> DESC t_students ;
 名称                                                              是否为空? 类型
 ----------------------------------------------------------------- -------- --------------------------------------------
 ID                                                                         NUMBER(5)
 NAME                                                                       VARCHAR2(50)
 GENDER                                                                     CHAR(6)
 BIRTHDATE                                                                  DATE
 ADDRESS                                                                    CHAR(150)

SQL> ALTER TABLE t_students MODIFY ( address VARCHAR2(150) ) ;

表已更改。

SQL> DESC t_students ;
 名称                                                              是否为空? 类型
 ----------------------------------------------------------------- -------- --------------------------------------------
 ID                                                                         NUMBER(5)
 NAME                                                                       VARCHAR2(50)
 GENDER                                                                     CHAR(6)
 BIRTHDATE                                                                  DATE
 ADDRESS                                                                    VARCHAR2(150)

SQL> -- 删除列
SQL> ALTER TABLE t_students DROP ( address ) ;

表已更改。

SQL> DESC t_students ;
 名称                                                              是否为空? 类型
 ----------------------------------------------------------------- -------- --------------------------------------------
 ID                                                                         NUMBER(5)
 NAME                                                                       VARCHAR2(50)
 GENDER                                                                     CHAR(6)
 BIRTHDATE                                                                  DATE

SQL> spool off
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值