学习资料

学习的笔记


11表的创建与管理

<h1>表的创建与管理</h1> <h2>表的基本概念</h2> <ul> <li>表是由行与列组成,表中的数据操作包括增加、删除、查询、修改、约束、索引等。</li> <li>表的出现形式可以是对现象事物的一种抽象(汽车颜色与价钱的抽象),可以是对数据的统计(世界杯冠军球队的统计)。</li> <li>表之间还可以有关联关系,在第12章学习</li> </ul> <h2>Oracle 常用的数据类型</h2> <ul> <li>CHAR:保存定长的字符串。</li> <li>VARCHAR2(n):可以存放数字、字母、ACSII码、一般存放姓名、地址、E-mail等这样的信息。</li> <li>NUMBER(m,n):m代表整数,n代表小数,可以只有整数,可以分别用INT、FLOAT代替。</li> <li>DATE:存放日期,但不包含毫秒。</li> <li>TIMESTAMP:存放日期,包含毫秒,时间戳。</li> <li>CLOB:存放大量的文本,例如一部小说文本。</li> <li>BLOB:存放二进制文件,例如图片、电影、音乐。</li> </ul> <p><strong>常用数据类型:</strong>VARCHAR2、NUMBER、DATE、CLOB。</p> <h2>表的创建</h2> <ul> <li> <p>数据表又称为数据对象,创建表属于DDL语句,对表的名称及列的名称有要求如下: 1、必须以字母开头。 2、长度为1~30个字符。 3、表名称可以是字母、数据、_、$、#组成,而且名称要有意义。 4、对同一个用户不能使用相同的表名称。 5、不能是Oracle 中的保留字,如CREATE、SELECT等都是保留字。</p> </li> <li>Oracle 数据库支持中文对象的创建,但是不能这样做。</li> <li>创建一张表示例: <pre><code>create table member( mid NUMBER(5), name VARCHAR2(50) default '无名氏', age NUMBER(3), birthday date default sysdate, note CLOB );</code></pre></li> </ul> <p><strong>注意:</strong>对DDL语句的操作,事务不起任何作用。<strong>在Oracle 中,执行任何DDL 语句,所有没有提交的事务都将自动提交。</strong></p> <ul> <li>执行一些操作,查看表的结构 <pre><code>select * from member; select * from tab; --查看当前用户下所有的表 desc member ; --查看表的结构,在PL/SQL 中无法实现</code></pre></li> </ul> <p><strong>提示:</strong>通过create 创建的都是对象,表是其中一种,oracle 中还有其他的对象。</p> <ul> <li> <p>向表中插入数据:</p> <pre><code>insert into member (mid, name, age, birthday, note) values (1,'李兴华',30,to_date('1979-09-27','yyyy-mm-dd'),'总公司活动倡导者'); insert into member (mid, name, age, birthday, note) values (1,'董鸣楠',29,to_date('1980-08-13','yyyy-mm-dd'),'积极响应者'); insert into member (mid, age, note) values (3,35,'活动名单提供者'); commit; select * from member;</code></pre> </li> <li>表的复制,子查询是正常的,都能复制。 <pre><code>create table myemp as select * from emp; select * from myemp; create table employee as select * from emp where 0=1 ;--只复制结构,不需要数据 select * from employee ; create table department --子查询出来的数据也能作为表来复制 as select d.deptno deptno, d.dname dname, d.loc loc, count(e.empno) count, sum(e.sal + nvl(e.comm, 0)) sum, round(avg(e.sal + nvl(e.comm, 0)), 2) avg, max(e.sal) max, min(e.sal) min from emp e right join dept d on e.deptno = d.deptno group by d.deptno, d.dname, d.loc order by d.deptno;</code></pre></li> </ul> <h2>数据表重命名</h2> <ul> <li>变更表名的操作</li> </ul> <pre><code>rename member to mldnuser; select * from tab; select * from mldnuser;</code></pre> <p><strong>数据字典:</strong>用于记录数据库的操作信息,修改表名称就是修改数据字典。</p> <ul> <li>静态数据字典:由表和视图组成,分为三类。 user_*:存储所有当前用户的对象信息。 all_*:存储所有当前用户可以访问的对象信息(某些对象可能不属于此用户)。 dba_*:存储数据库中所有对象的信息(数据库管理员操作)。</li> <li>动态数据字典:随着数据库的运行而不断更新的数据表,一般用来保存内容和磁盘状态,而这类数据字典都以<code>“V$”</code>开头。</li> </ul> <p><strong>数据字典的操作:</strong>都是通过特定人命令来操作的,如下两个例子:</p> <pre><code>select * from tab; desc 表名称;--desc是简写 rename member to mldnuser;</code></pre> <h2>截断表(truncate)</h2> <p><strong>截断表:</strong>意思是删除表中的数据及索引、约束等,此操作会很危险。占用资源立刻释放。</p> <p><strong>truncate与delete的区别:</strong></p> <ul> <li>truncate 是oracle 特有的,不是SQL 标准语句。delete 是标准SQL 语句。开发中推荐使用。</li> <li>truncate 与delete 达到的效果不一样,delete 只删除表中数据,truncate 会立刻释放资源(索引、约束等)。</li> </ul> <h3>操作示例:</h3> <pre><code>create table member as select * from mldnuser; truncate table mldnuser; select * from mldnuser;</code></pre> <h2>表的删除</h2> <p><strong>表的删除:</strong>表的删除和创建属于DDL 操作,不受事务的处理,执行后无法通过回滚进行恢复,表的删除包括数据及表本身的结构。</p> <ul> <li>示例: <pre><code>drop table myemp ;-- 删除表 select * from tab; --查看表名</code></pre></li> </ul> <h2>闪回技术(flashback)</h2> <p><strong>闪回技术:</strong>使用drop 删除一张表后,表会存放在回收站(recyclebin)中,以便以恢复数据。这种恢复数据就叫闪回技术。就相当于windows 系统下的回收站。</p> <h3>闪收技术的一些特性</h3> <ul> <li>Oracle 10g 之后才出现的,相当于回收站,表名是(recyclebin)。</li> <li>recyclebin 表中有多个字段,记录着多种情况。</li> <li>使用闪回技术恢复回收站的表,<code>flashback table DEPARTMENT to before drop ;</code>。</li> <li>可以使用<code>drop table 表名 purge</code> 的方式跳过回收站,彻底删除一张表。</li> <li>可以一次性<strong>清空回收站</strong><code>purge recyclebin;</code>,还是不要执行这个好。</li> <li>可以通过指定表名<strong>删除</strong>回收站中的表<code>purge table 表名称</code>。</li> </ul> <h3>一些操作:</h3> <pre><code>select * from recyclebin;--查看回收站中删除的表的记录 purge recyclebin; --一次性清空回收站所有的删除表记录 select * from tab; --再次查询删除记录也不见了 select * from myemp ; --看一眼myemp 表 drop table myemp ; --删除myemp 表 select * from tab; --可以在这里看到删除表的记录 select object_name,original_name,operation,type from recyclebin;--查看回收站的删除记录 flashback table DEPARTMENT to before drop ; --使用闪回技术恢复回收站的表 select * from myemp; --查看一下表确实已经恢复,回收站(recyclebin)中也没有记录了,表记录(tab)中也没有删除记录了。 drop table myemp purge ;--不通过回收站,直接彻底删除表,回收站(recyclebin)、表记录(tab)中都没有记录 drop table department ;--再删除一张表 purge table department ;--从回收站(recyclebin)中清除表department purge recyclebin ;--清除回收站(recyclebin)中所有表</code></pre> <h2>修改表结构</h2> <h3>为表中增加数据字段</h3> <ul> <li>可以一列一列地加,可以多列一起加</li> <li>语法是<code>alter table 表名 add(字段名 属性,字段名 属性)</code></li> <li>设置的默认值default 也会同时添加到列中</li> </ul> <pre><code>alter table member add(age number(3),name varchar2(50)); alter table member add(sex varchar2(10) default '男',photo varchar2(100) default 'nophoto.jpg'); desc member;--查看表结构,要在sqlplus 中才可以执行 select * from member ;--设置为default 的值也会insert 到对应的列中</code></pre> <p><strong>问题:</strong>为什么photo 列不设置为blob 类型?因为设计上这一列只存放图片的文件名就好。</p> <h3>修改表中的字段</h3> <ul> <li>可以一个语句修改多个字段。</li> <li>在工具上点列看不到效果,要编辑表才能看到效果。</li> <li>语法1是<code>alter table 表名 modify (列名 属性,列名 属性)</code></li> </ul> <pre><code>alter table member modify (name varchar2(40)); alter table member modify (photo varchar2(50)); alter table member modify (sex varchar2(10) default '女',age number(3)); select * from member ;</code></pre> <h3>删除表中的字段</h3> <ul> <li>删除到最后至少要保留一个以上的字段</li> <li><del>只能一列一列地删除</del> 使用<code>alter table products drop (name,cost);</code> 命令可以删除多列。</li> <li>同时表的列的数据也被删除</li> <li>数据一多就会慢,所以还有一个功能是设置列为不可见UNUSED,可以多列一起设置。</li> <li>还没找到设置列为USED 的方法。</li> <li>还可以一次性删除所有已经设置为UNUSED 的列。</li> <li>删除列的语法<code>alter table 表名 drop column 列名</code>。</li> <li>设置列不可用语法<code>alter table 表名 set unused(列名,列名)</code>。</li> <li>删除所有不可见列的语法<code>alter table 表名 drop unused columns</code>。</li> </ul> <pre><code>alter table member drop column photo; alter table member drop column age; --删除列会把数据也删除,如果数据量很大,会很慢,可以设置一列为UNUSED,可以多列一起设置 alter table member set unused (sex,name);--暂时没有恢复的方法 alter table member set unused column age;--另一种设置无用方法 alter table member drop unused columns;--删除所有已经设置为无用的列,再去重新创建</code></pre> <h2>为表&amp;列添加注释</h2> <ul> <li>记录表和列的注释的数据字典分别是<code>user_tab_comments</code>&amp;<code>user_col_comments</code>。</li> <li>添加表的注释语法<code>comment on table 表名 is '注释内容';</code></li> <li>添加表的列注释语法<code>comment on column 表名.列名 is '注释内容';</code>。</li> </ul> <pre><code>-- 重新创建表 drop table member ; create table member ( mid number, name varchar2(50) default '无名氏' , age number(3), birthday date ); select * from member; select * from user_tab_comments where table_name='MEMBER'; comment on table member is '用于记录参加活动的成员信息' ; select * from user_col_comments where table_name='MEMBER'; comment on column member.mid is '参加添加成员编号';</code></pre> <h2>设置可见/不可见字段(Oracle 12c才有这个功能)</h2> <ul> <li>语法<code>alter table 表名 modify(列名 invisible)</code>,invisible 是不可见,visible 是可见。</li> <li>记录表的字段的数据字典是<code>user_tab_column</code>。</li> <li>可以在创建表的时候就设置为不可见,或者创建表后通过修改字段的方法进行设置列不可见。</li> <li>列不可见,与前面学习的列不可用要区分开来。</li> </ul> <h3>执行的一些sql 语句</h3> <pre><code>create table mytab ( mid number, name varchar2(30), constraint pk_mid primary key(mid) );--创建一张表,这里设置主键是第一次学到 select * from mytab;--查看表有两个字段 alter table mytab modify (name invisible);--设置name列为不可见后 desc mytab; --这两种方法都看不到name 列了 select * from mytab;--看不到name 列 select column_name from user_tab_columns where table_name='MYTAB';--这样才可以看到name 列 alter table mytab modify (name visible);--设置name 列为可见 insert into mytab values(1); --现在执行这个会报错 alter table mytab modify (name invisible) ; insert into mytab values (1); --现在执行就不再报错了</code></pre> <h2>表空间</h2> <ul> <li> <p>查看表空间的一个语句: <code>select tablespace_name,extent_management,status,contents from dba_tablespaces;--查看表空间</code></p> </li> <li>运行失败,过后再学</li> </ul> <h2>外部表</h2> <p><a href="https://blog.csdn.net/cpgl40148/article/details/100263829">利用ORACLE_DATAPUMP为驱动创建外部表</a></p> <h2>小结</h2> <ul> <li>数据库中常用的数据类型NUMBER、VARCHAR2、DATE、CLOB。</li> <li>表的创建由CREATE TABLE完成,可以由DEFAULT设置默认值。</li> <li>表的删除用drop table名完成,有缓冲的。如要直接去掉缓存,可以使用PURGE配置。</li> <li>通过FlashBack(闪回技术)恢复误删除的表或者表中的数据。</li> <li>通过截断表(TRUNCATE)操作可以立即释放表中所占用的资源。创建表时默认是存放在USERS表空间,也可以最后通过TABLESPACE 配置指定数据表所存放的位置。</li> </ul>

页面列表

ITEM_HTML