DDL和DML语句
SQL语言包括四种主要程序设计语言类别的语句:
- DDL数据定义语言(Data Definition Language)
- DML数据操作语言(Data Manipulation Language)
- DCL数据控制语言(Data Control Language)
- TCL事务控制语言(Transaction Control Language)
数据库模式定义语言DDL(Data Definition Language),是用于描述数据库中要存储的现实世界实体的语言。一个数据库模式包含该数据库中所有实体的描述定义。这些定义包括结构定义、操作方法定义等。
数据操纵语言DML(Data Manipulation Language),使用户能够查询数据库以及操作已有数据库中的数据的计算机语言。DML包括:INSERT插入、UPDATE更新、DELETE删除。
注意,select语句属于DQL(Data Query Language)。
表的基本操作
- 表有名称
- 表由行和列组成。
- 表是存放数据的最基本对象。
- 堆表:我们将一般的表叫做head table(堆表),其含义为杂乱无章的存储数据,堆表是数据库的重要组织形式。他有别于索引组织表和cluster表。
表的名称规则
- 标准的ASCII码可以描述
- 字母开头
- 30个字母内
- 不能是保留字
- 可以包含大小写字母,数字,_,$,#
- 不能和所属用户的其他对象重名。
- 注:不要使用汉字做表和列的名称。
数据字典
SQL> conn scott/tiger
已连接。
SQL> col object_name for a20
SQL> col object_type for a20
SQL> 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 TABLE
tab当前用户所拥有的表和视图,显示较简洁。
实验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 a20
SQL> col data_type for a20
SQL> col column_name for a20
SQL> col table_name for a20
SQL> 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 TABLE
EMP TABLE
BONUS TABLE
SALGRADE TABLE
T2 TABLE
T1 TABLE
T3 TABLE
已选择7行。
重命名
SQL> rename t1 to t_1;
表已重命名。
验证
SQL> select * from tab;
TNAME TABTYPE CLUSTERID
------------------------------ ------- ----------
DEPT TABLE
EMP TABLE
BONUS TABLE
SALGRADE TABLE
T2 TABLE
T3 TABLE
T_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 table
7.列注释
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 TABLE
EMP TABLE
BONUS TABLE
SALGRADE TABLE
T2 TABLE
T3 TABLE
T_1 TABLE
已选择7行。
删除
SQL> drop table t2;
表已删除。
验证
SQL> select * from tab;
TNAME TABTYPE CLUSTERID
------------------------------ ------- ----------
DEPT TABLE
EMP TABLE
BONUS TABLE
SALGRADE TABLE
T3 TABLE
T_1 TABLE
BIN$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:01
SQL> 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:01
9.还原回收站
将回收站的表还原
SQL> flashback table t2 to before drop;
闪回完成。
SQL> select * from tab;
TNAME TABTYPE CLUSTERID
------------------------------ ------- ----------
DEPT TABLE
EMP TABLE
BONUS TABLE
SALGRADE TABLE
T3 TABLE
T_1 TABLE
T2 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:51
T_2 BIN$thCQdwB1RtmwVqD6O7k2KQ==$0 TABLE 2013-07-01:21:18:37
SQL> 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
--回收站无数据。
知识点
- 建立表
- 修改表
- 注释表
- 该名称
- 丢弃表
- 恢复丢弃的表
- 初步认识数据字典