表管理
新建表
语法
create table 表名 ( 列名1 类型(长度), 列名2 类型(长度), 列名3 类型(长度) );
create table
:关键字,建表 后跟新建表的表名,表名长度有限制,不超过32位,以英文单词或者缩写组成,单词之间用下划线连接- 表名必须是数据库中唯一的,重复会报错.
- 列名:英文单词缩写组成,长度不超过30位,不能以数字,下划线或特殊字符开头.单词之间以下划线连接.
- 括号后须有分号结束;
SQL> create table stu_test 2 ( 3 stu_id number(6), 4 stu_name varchar2(50), 5 stu_age number(3) 6 ); 表已创建。
添加注释
SQL> comment on table stu_test is '学生表'; 注释已创建。 SQL> comment on column stu_test.stu_id is '学生编号'; 注释已创建。 SQL> comment on column stu_test.stu_name is '学生姓名'; 注释已创建。 SQL> comment on column stu_test.stu_age is '学生年龄'; 注释已创建。
- comment on table:关键字,即表的注释
- comment on column:关键字,列的注释
复制表
复制表结构,不包含数据
复制表结构,不包含数据,也不包含索引,约束,注释
SQL> create table stu_test1 as 2 select stu_id,stu_name from stu_test 3 where 1=2; 表已创建。
复制表结构,包含数据
复制表结构,并包含数据,但不包括索引,约束,注释
SQL> create table stu_test2 as 2 select stu_id,stu_name from stu_test 3 where 1=1; 表已创建。
新建分区表
- 分区原则:当数据量超过2000W时,可以考虑使用分区表
分区类型 | 类型描述 |
---|---|
range: | 按照范围分区,通常是按照时间字段分区,比如申请时间,入职时间 |
list: | 按照分布分区,比如身份证号码最后一位 |
hash: | 按照hash值分配分区,不保证是均匀分配 |
range分区范例
SQL> create table emp_info 2 ( 3 emp_no number(10), 4 join_date date 5 ) 6 partition by range(join_date) 7 ( 8 partition P1 values less than(to_date('20191120','YYYYMMDD')), 9 partition P2 values less than(to_date('20191121','YYYYMMDD')), 10 partition P3 values less than(to_date('20191122','YYYYMMDD')), 11 partition P_MAX values less than(maxvalue) 12 ); 表已创建。
关键字 | 描述 |
---|---|
partition by | 指明是分区表,range确定分区方式,join_date是分区键,必须是表中的一列 |
partition | 后跟分区名字,分区名字必须全库唯一,不能重复 |
values less than | 即当分区键的值小于其后的值时,数据落入本分区 |
maxvalue | 用于最大分区 |
当插入数据的join_date时间日期小于20日,放入p1分区
当时间日期大于22放入P_MAX
list分区范例
SQL> create table LIST_TAB_TEST 2 ( 3 id_no number(10), 4 partition_id varchar2(2) 5 ) 6 partition by list(partition_id) 7 ( 8 partition P_0 values('0'), 9 partition P_1 values('1'), 10 partition P_2 values('2'), 11 partition P_default values(default) 12 ); 表已创建。
关键字 | 描述 |
---|---|
values: | 即值是. 表示当分区键的值是其后的值时,数据落入本分区 |
default: | 关键字,默认值,当分区键的值不在之前分区值内时,数据落入本分区 |
查询每个分区的数据
语法
select * from 表名 partition(分区名);
SQL> insert into emp_info 2 values(1,sysdate); 已创建 1 行。 SQL> select * from emp_info partition(p3); EMP_NO JOIN_DATE ---------- -------------- 1 21-11月-19
SQL> insert into list_tab_test 2 values(1,6); 已创建 1 行。 SQL> select * from list_tab_test partition(P_default); ID_NO PART ---------- ---- 1 6
查看分区建select * from dba_part_key_columns where owner='SCOTT';
删除表
SQL> drop table emp_info; 表已删除。 SQL> drop table list_tab_test; 表已删除。
增加列
SQL> create table student6 2 ( 3 id number primary key 4 ); 表已创建。
增加单列
SQL> alter table student6 2 add s_mpno number(6); 表已更改。
增加多列
SQL> alter table student6 2 add(s_name varchar2(50),s_deptno number(2)); 表已更改。
修改表列的名称和属性
修改表名和列名
修改表名
SQL> alter table student6 rename to student_6; 表已更改。
修改列名
SQL> alter table student_6 rename column id to s_id; 表已更改。
修改列的属性
将s_id的number改为number(6)
SQL> alter table student_6 modify s_id number(6); 表已更改。
将s_mpno设置为唯一的,s_name设置为非空的
SQL> alter table student_6 2 modify(s_mpno number(6) unique, 3 s_name varchar2(50) not null); 表已更改。
已有数据情况下,更改列的属性
将stu_info表的stu_no列属性由number改为varchar2
SQL> select * from stu_info; STU_NO STU_NAME STU_AGE ------- -------- --- 1 张三 50 2 李四 50 3 王五 51
方法1,将stu_no列清空,然后修改类型,最后数据恢复
第一步,清空数据,但数据不能丢失
SQL> alter table stu_info add stu_no1 number(20); 表已更改。 SQL> update stu_info set stu_no1=stu_no; 已更新3行。 SQL> update stu_info set stu_no=null; 已更新3行。 SQL> commit; 提交完成。 SQL> select * from stu_info; STU_NO STU_NAME STU_AGE STU_NO1 ---------- -------------- -------------- ---------- 张三 50 1 李四 50 2 王五 51 3
第二步,修改类型
SQL> alter table stu_info modify stu_no varchar(10); 表已更改。
第三步,将数据恢复,并将新增列删除
SQL> update stu_info set stu_no=stu_no1; 已更新3行。 SQL> alter table stu_info drop column stu_no1; 表已更改。
删除列
删除单列
SQL> alter table stu_info drop column stu_no; 表已更改。
删除多列
SQL> alter table student_6 drop(s_mpno,s_deptno); 表已更改。