DDL(Data Definition Language,数据定义语言),用来创建数据库中的各种对象-----表、视图、索引、同义词、聚簇等,如CREATE TABLE/VIEW/INDEX/SYN/CLUSTER
DDL操作是隐性提交的,不能rollback。
使用DESCRIBE
命令,表示表结构
DESC[RIBE] tableName
示例:
SQL> describe emp;
Name Type Nullable Default Comments
-------- ------------ -------- ------- --------
EMPNO NUMBER(4)
ENAME VARCHAR2(10) Y
JOB VARCHAR2(9) Y
MGR NUMBER(4) Y
HIREDATE DATE Y
SAL NUMBER(7,2) Y
COMM NUMBER(7,2) Y
DEPTNO NUMBER(2) Y
数据类型 | 描述 |
---|---|
VARCHAR2(size) | 可变长字符数据 |
CHAR(size) | 定长字符数据 |
NUMBER(p,s) | 可变长数值数据 |
DATE | 日期型数据 |
LONG | 可变长字符数据,最大可达到2G |
CLOB | 字符数据,最大可达到4G |
RAW and LONG RAW | 原始的二进制数据 |
BLOB | 二进制数据,最大可达到4G |
BFILE | 存储外部文件的二进制数据,最大可达到4G |
表名和列名:
必须以字母开头
必须在1–30个字符之间
必须只能包含 A–Z,a–z,0–9,_,$和#
必须不能和用户定义的其他对象重名
必须不能是Oracle的保留字
Oracle默认存储是都存为大写
数据库名只能是1~8位,datalink可以是128位,和其他一些特殊字符
要求必须具备以个资源才可以建表:
create table dept
(
deptno NUMBER(2) not null,
dname VARCHAR2(14),
loc VARCHAR2(13)
);
创建带有约束的表
字段名 | 注释 | 约束 |
---|---|---|
id | 主键id | 主键 |
name | 姓名 | 非空 |
reg_date | 注册时间 | 默认值为当前时间 |
id_card | 身份证号 | 非空、唯一 |
age | 年龄 | 检查,大于等于0 |
deptno | 部门编号 | 外键,应用dept.deptno |
create table t_user(
id number
constraint PK_USER_ID primary key,
name varchar2(20)
constraint NOTNULL_USER_NAME not null,
reg_date date
default sysdate,
id_card varchar2(20)
constraint NOTNULL_USER_CNUM not null
constraint UNIQUE_CARDNUM unique,
age number
constraint CHECK_AGE check(age >= 0),
deptno number
constraint FK_USER_DEPTNO references dept(deptno)
);
-- Add comments to the table
comment on table t_user
is '用户表';
-- Add comments to the columns
comment on column t_user.id
is '主键id';
comment on column t_user.name
is '姓名';
comment on column t_user.reg_date
is '注册时间';
comment on column t_user.id_card
is '身份证号';
comment on column t_user.age
is '年龄';
comment on column t_user.deptno
is '部门编号';
-- 添加或修改表注释
comment on table t_user
is '用户信息表';
-- 添加或修改列注释
comment on column t_user.id
is '主键';
示例:
-- 创建表并插入数据
create table emp2
as
select empno,ename,sal
from emp
where deptno = '10';
-- 只想要表结构,不要数据
create table t_emp2
as
select * from emp where 1=2
-- 如果子查询中的select中有表达式,则必须要指定别名
create table t_emp4
as
select empno, ename, sal, sal*12 total from emp where deptno=10
使用ALTER TABLE
语句可以:
使用ALTER TABLE
语句追加,修改,删除或重命名列的语法
使用ADD子句追加一个新列
alter table emp2 add (deptno varchar2(2));
可以修改列的数据类型,尺寸和默认值
对默认值的修改只影响今后对表的修改。
alter table emp2 modify (ename varchar2(20));
使用drop column
子句删除不再需要的列。
alter table emp2 drop column deptno;
alter table emp2 rename column ename to empname;
TRUNCATE TABLE语句:
truncate table emp2;
drop table emp2;
改变对象的名称
RENAME
语句改变表,视图,序列或同义词的名称rename emp2 to emp3;
select * from user_constraints where table_name = 'T_USER';
可以通过视图修改表,增删改查都可以。在创建视图时有个选项WITH READ ONLY
,如果加上这个,表示是只读的,就不能增删改了,只能查询。
看视图,是不知道从哪个表中来的数据,只有看创建视图的DDL才知道,这样比较安全。
注意:不建议通过视图对表进行修改。视图不能提高性能。
with check option示例:
create view view2
as
select * from emp where deptno=10
with check option;
通过示例视图进行DML时,要遵循SQL语句中定义的限制。这里只限定了10号部门,所以通过视图只能操作10号部门。
创建视图
create view myview
as
select empno id, ename name, sal
from emp;
create view deptview
as
select d.deptno, d.dname, count(e.empno) empcount
from emp e, dept d
where e.deptno=d.deptno
group by d.deptno, d.dname;
select * from myview;
create or replace view myview2
as
select empno id, ename name, sal
from emp
with read only;
当视图定义中包含以下元素之一时不能使用delete:
当视图定义中包含以下元素之一时不能使用update:
当视图定义中包含以下元素之一时不能使用insert:
删除视图只是删除视图的定义,并不会删除基表的数据。
drop view myview;
序列:可供多个用户用来产生唯一数值的数据库对象。
create sequence mysequence;
默认:increment by 1
每次增加1,nocycle
序列不循环使用,cache
缓存20个序列
select mysequence.nextval from dual;
select mysequence.currval from dual;
刚创建的序列,第一次只能访问nextval。如果先使用currval,就会报错。
序列值插入到表中:
insert into dept values (mysequence.nextval,'AA','BB');
查询数据字典视图USER_SEQUENCES获取序列定义信息
select * from user_sequences;
默认是有缓存的,执行mysequence.nextval后LAST_NUMBER字段值变为21。
如果指定NOCACHE选项,则列LAST_NUMBER显示序列中下一个有效的值。
修改序列的增量,最大值,最小值,循环选项或是否装入内存
alter sequence mysequence
increment by 2
maxvalue 24
cycle
nocache
使用DROP SEQUENCE
语句删除序列
drop sequence mysequence;
使用同义词访问相同的对象:
创建同义词
create synonym emp2 for emp;
删除同义词
drop synonym emp2;
create index idx_emp_name on emp(ename);
以下情况可以创建索引:
下列情况不要创建索引:
可以使用数据字典视图USER_INDEXES和USER_IND_COLUMNS查看索引的信息
select ic.index_name,
ic.column_name,
ic.column_position col_pos,
ix.uniqueness
from user_indexes ix, user_ind_columns ic
where ic.index_name = ix.index_name and ic.table_name = 'EMP';
drop index idx_emp_name;
本文参考:
https://www.cnblogs.com/study-s/p/5287529.html