DDL和DML语句
SQL语言包括四种主要程序设计语言类别的语句:
- DDL数据定义语言(Data Definition Language)
- DML数据操作语言(Data Manipulation Language)
- DCL数据控制语言(Data Control Language)
- TCL事务控制语言(Transaction Control Language)
注意,select语句属于DQL(Data Query Language)。
表的基本操作- 表有名称
- 表由行和列组成。
- 表是存放数据的最基本对象。
- 堆表:我们将一般的表叫做head table(堆表),其含义为杂乱无章的存储数据,堆表是数据库的重要组织形式。他有别于索引组织表和cluster表。
- 标准的ASCII码可以描述
- 字母开头
- 30个字母内
- 不能是保留字
- 可以包含大小写字母,数字,_,$,#
- 不能和所属用户的其他对象重名。
- 注:不要使用汉字做表和列的名称。
数据字典
SQL> conn scott/tiger
已连接。SQL> col object_name for a20SQL> col object_type for a20SQL> select object_name,object_type from user_objects;OBJECT_NAME OBJECT_TYPE -------------------- -------------------- SALGRADE TABLE BONUS TABLE PK_EMP INDEX EMP TABLE DEPT TABLE PK_DEPT INDEX 已选择6行。user_objects当前用户所拥有的所有对象。不包含自己建立的public对象。
SQL> select table_name from user_tables;
TABLE_NAME ------------------------------ DEPT EMP BONUS SALGRADE T1 T3 已选择6行。user_tables当前用户所拥有的表,有一切权利。
SQL> select * from tab;TNAME TABTYPE CLUSTERID ------------------------------ ------- ---------- DEPT TABLE EMP TABLE BONUS TABLE SALGRADE TABLEtab当前用户所拥有的表和视图,显示较简洁。
实验21:建立简单的表,并对表进行简单的DDL操作
1.create table语句建立表
- 指明表的名称
- 指明列的名称
- 列的数据类型
- 列的宽度
- 是否有默认值
常见的数据类型
-
- char(n)定长
- varchar2(n)变长,最大到4000
- number
- date
- long
- lob
- raw
创建表
SQL> create table t1(name char(8),salary number(5) default 0,content char(4 char), hiredate date);
表已创建。描述表结构
SQL> desc t1
名称 是否为空? 类型 ----------------------------------------- -------- ---------------------------- NAME CHAR(8) SALARY NUMBER(5) CONTENT CHAR(4 CHAR) HIREDATE DATE验证表
SQL> select table_name from user_tables;
TABLE_NAME ------------------------------ DEPT EMP BONUS SALGRADE T1 SQL> col data_length for a20SQL> col data_type for a20SQL> col column_name for a20SQL> col table_name for a20SQL> select table_name,column_name,data_type,data_length from user_tab_columns where table_name='T1';TABLE_NAME COLUMN_NAME DATA_TYPE DATA_LENGTH -------------------- -------------------- -------------------- ----------- T1 NAME CHAR ########## T1 SALARY NUMBER ########## T1 CONTENT CHAR ########## T1 HIREDATE DATE ##########2.在现有表的基础上建立表
SQL> create table t2
as select ename name,sal salary from emp;表已创建。创建t2时就插入了子查询中的数据。
可以用别名改变列的名称。
SQL> select * from t2;
NAME SALARY ---------- ---------- SMITH 800 ALLEN 1600 WARD 1250 JONES 2975 MARTIN 1250 BLAKE 2850 CLARK 2450 KING 5000 TURNER 1500 JAMES 950 FORD 3000 MILLER 1300 已选择12行。只创建表结构,不插入数据,可以加一个假条件。
SQL> create table t3(c1,c2,c3) as
select ename,empno,sal from emp where 9=1;表已创建。SQL> select * from t3;
未选定行3.修改表结构
如果列为null,可以随便修改列的类型和宽度。
SQL> alter table t1 modify(name char(4));
表已更改。SQL> desc t1
名称 是否为空? 类型 ------------------------------- -------- ---------------------------- NAME CHAR(4) SALARY NUMBER(5) CONTENT CHAR(4 CHAR) HIREDATE DATE
如果有数据,修改会受限制,但不会破坏数据。
SQL> alter table t2 modify(name char(4));
alter table t2 modify(name char(4)) *第 1 行出现错误: ORA-01441: 无法减小列长度, 因为一些值过大
如果不改变数据类型,只改变宽度的话,加大是可以的。
SQL> alter table t2 modify(name char(8));
表已更改。SQL> desc t2 名称 是否为空? 类型 ----------------------------------------- -------- ---------------------------- NAME CHAR(8) SALARY NUMBER(7,2)4.修改表的名称
SQL> select * from tab;
TNAME TABTYPE CLUSTERID------------------------------ ------- ----------DEPT TABLEEMP TABLEBONUS TABLESALGRADE TABLET2 TABLET1 TABLET3 TABLE已选择7行。重命名SQL> rename t1 to t_1;
表已重命名。验证
SQL> select * from tab;
TNAME TABTYPE CLUSTERID------------------------------ ------- ----------DEPT TABLEEMP TABLEBONUS TABLESALGRADE TABLET2 TABLET3 TABLET_1 TABLE已选择7行。5.修改列的名称
SQL> alter table t3 rename column c1 to name;
表已更改。SQL> desc t3 名称 是否为空? 类型 ----------------------------------------- -------- ---------------------------- NAME VARCHAR2(10) C2 NUMBER(4) C3 NUMBER(7,2)6.表注释
SQL> comment on table emp is 'employee table';
注释已创建。SQL> select comments from user_tab_comments where table_name='EMP';COMMENTS--------------------------------------------------------------------------------employee table7.列注释
SQL> COMMENT ON COLUMN EMP.SAL IS '员工工资';
注释已创建。SQL> select comments from user_col_comments where table_name='EMP' AND COLUMN_NAME='SAL';COMMENTS--------------------------------------------------------------------------------员工工资8.丢弃表
SQL> select * from tab;
TNAME TABTYPE CLUSTERID------------------------------ ------- ----------DEPT TABLEEMP TABLEBONUS TABLESALGRADE TABLET2 TABLET3 TABLET_1 TABLE已选择7行。删除SQL> drop table t2;
表已删除。验证
SQL> select * from tab;
TNAME TABTYPE CLUSTERID------------------------------ ------- ----------DEPT TABLEEMP TABLEBONUS TABLESALGRADE TABLET3 TABLET_1 TABLEBIN$YZUBV4KDQdaHbfgXefa6Eg==$0 TABLE已选择7行。实际上并没有真的删除,只是改了名称。
显示回收站的信息
SQL> show recyclebin
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------T2 BIN$YZUBV4KDQdaHbfgXefa6Eg==$0 TABLE 2013-06-09:10:20:01SQL> select OBJECT_NAME,ORIGINAL_NAME,OPERATION,TYPE,DROPTIME from user_recyclebin;OBJECT_NAME ORIGINAL_NAME OPERATION TYPE DROPTIME ------------------------------ ------------- --------- ----- ---------------------BIN$YZUBV4KDQdaHbfgXefa6Eg==$0 T2 DROP TABLE 2013-06-09:10:20:019.还原回收站
将回收站的表还原
SQL> flashback table t2 to before drop;
闪回完成。SQL> select * from tab;TNAME TABTYPE CLUSTERID------------------------------ ------- ----------DEPT TABLEEMP TABLEBONUS TABLESALGRADE TABLET3 TABLET_1 TABLET2 TABLE已选择7行。还原表的同时修改表名
SQL> flashback table t2 to before drop rename to t_2;
闪回完成。SQL> select * from tab;TNAME TABTYPE CLUSTERID ------------------------------ ------- ---------- BIN$w+zMkBr9SyeBdhobxWWgow==$0 TABLE BONUS TABLE DEPT TABLE EMP TABLE SALGRADE TABLE T1 TABLE T3 TABLE T_2 TABLE 已选择8行。10.清空回收站
清空回收站内指定的表
SQL> show recyclebin
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------T2 BIN$w+zMkBr9SyeBdhobxWWgow==$0 TABLE 2013-06-27:23:48:51T_2 BIN$thCQdwB1RtmwVqD6O7k2KQ==$0 TABLE 2013-07-01:21:18:37SQL> purge table t2;
表已清除。SQL> show recyclebin --验证已清除ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------T_2 BIN$thCQdwB1RtmwVqD6O7k2KQ==$0 TABLE 2013-07-01:21:18:37
清除当前用户的回收站。不会影响其他用户。
SQL> purge recyclebin ;
回收站已清空。彻底删除表。绕过回收站,彻底删除表。
SQL> create table t2
as select ename name,sal salary from emp;表已创建。SQL> drop table t2 purge;表已删除。SQL> show recyclebin--回收站无数据。
知识点
- 建立表
- 修改表
- 注释表
- 该名称
- 丢弃表
- 恢复丢弃的表
- 初步认识数据字典
返回目录