您的位置:首页 > 数据库 > Oracle

Oracle中SQL语句学习四(DDL语句)

2014-08-26 16:19 295 查看
DDL语言是创建与管理表的语句。

1、创建表

创建表的语法:Create table 表名(列名 数据类型(尺寸))

例如:

SQL> Create table tablename (column_name1 number(2),column_name2 varchar2(4));

Table created

注:创建表必须要遵循三个范式

在数据库中必须遵循一定的规范(范式):

数据库只需满足3NF(共6个范式)即可,用范式对数据库中的表进行处理

1NF:属性不可再分,一对多

2NF:(前提满足1NF)候选键必须依赖主键

3NF:(前提满足1NF、2NF),非主属性都不传递依赖任何候选键

2、修改表

追加新的列

语法:

ALTER TABLE tablename

ADD (column datatype [DEFAULT expr]

[, column datatype]...);

例如:

SQL> alter table tablename add column_name3 number(4);

Table altered

修改现有的列

语法:

ALTER TABLE table

MODIFY (column datatype [DEFAULT expr]

[, column datatype]...);

例如:

SQL> alter table tablename modify column_name3 varchar2(4);

Table altered

删除一个列

语法:

ALTER TABLE table

DROPcolumn (column_name);

例如:

SQL> alter table tablename drop column column_name2;

Table altered

修改对象的名称

执行RENAME语句改变表, 视图, 序列, 或同义词的名称,必须是对象的拥有者

如:修改对象的名称操作

SQL> rename customer to customers;

清空表

TRUNCATE TABLE 语句:删除表中所有的数据,释放表的存储空间,TRUNCATE语句不能回滚,可以使用 DELETE 语句删除数据

如:清空表的操作

SQL> truncate table customers;

Drop table:

执行 drop table命令数据和结构都被删除,所有正在运行的相关事物被提交,所有相关索引被删除,DROP TABLE 语句不能回滚,所以使用drop table时一定要谨慎。

如:

SQL> drop table tablename;

Table dropped

补充:Oracle的数据库字典

查看当前用户的所有表的详细信息(表空间,表的储存空间)

Select * from user_tables;

Select * from tabs;

查看当前用户的所有表的名

Select tables_name from user_tables;

用户定义的数据库对象

Select * from user_objects;

Oracle DDL语句使用

数据库常用对象(表,视图...);

创建一张表:

create table t (a varchar2(10));

select * from t;

(删除表)

drop table t;

varchar2()可以变化长度的;最大4K;

char()定长的字符串;8

这两个的区别:效率高用定长字符串,浪费空间;(拿空间换时间)

number()

date()

long()最大达到2G

事务控制语句:

事务是一系列的操作:

一个事务:(开始语句是DML)

update emp2 set sal = sal*2;

delete from dept2;

insert into salgrade values(6,10000,20000);

rollback;(commit 提交)(一个事务的结束语句)或者是DDL,DCL,正常断开事务自动提交,非正常断开事务,事务回滚;

update dept2 set deptno = deptno*2;

select * from dept2;

create table t (a varchar2(20));

rollback(这时rollback不会恢复);

constraint :约束

字段级约束:(约束一个字段)

create table stu

(

name vachar2(20) constraint stu_name not null,(非空约束);

email varchar2(20) unique,(唯一约束)

);

这个空值不认为是唯一;

表级约束:(组合起来的约束,约束多个字段)

create table stu

(

name varchar2(20),

email varchar2(50),

constraint stu_name_email_uni unique (email,name)

);

主键约束:primary key

主键:可以标志整条记录,(唯一标识一个)

主键不能为空,并且是惟一的;相当于not null 和 unique;(语法上)

单独的唯一 一条记录(逻辑上)

create table stu

(

id number(6) primary key,(字段约束)

constraint stu_id_pk primary key(id)(表级约束)

);

外键约束:涉及到了两个字段:

被参考的字段(被参考的字段必须是主键)

create table class

(

id number(4) primary key,

name varchar2(20) not null

);

参考的字段:

create table stu

(

id number(6),

class number(4) references class(id),

constraint stu_class_fk foreign key(class)(表级约束)

);

插入值:

insert into stu(id ,class) values(1,3);

check约束:

alter_table_drop_table :

alter table stu add(addr varchar2(100));

alter table stu drop (addr);

alter table stu add(addr varchar2(150));

alter table stu modify (addr varchar2(200));

修改后的数据空间要大于修改前的空间,不能截取数据;

alter table stu drop constraint stu_class_fk;

delete from class;

rollback;

alter table stu add constraint stu_class_fk foreign key (class) references class(id);

Oracle_dictionaries:

(查询所有表的结构:)

desc uers_tables;

(查询所有的表名:)

select table_name from user_tables;

(查询视图:)

select view_name from user_views;

(查询约束)

select constraint_name from user_constraints;

desc user_constraints;

(这些约束都加在那些表名上)

select constraint_name,table_name from user_constraints;

desc dictionary;

(查看dictionary中有多少表)

select table_name from dictionary;

(查看是USER开头的)

select table_name from dictionary where table_name like'USER%';

(对表名进行排序)

select table_name from dictionary where table_name like'USER%' order by table_name;

indexes_and_views:

(创建索引)

create index idx_stu_id on stu(class);

(删除索引)

drop index idx_stu_id ;

(查询所有的索引)

select index_name from user_indexes;

当给一个表中的字段加唯一约束或者主键约束,会自动的给字段添加索引

如果是组合约束,则会加两个索引

给一个字段添加索引,访问时效率会更高,但是插进去是会降低,不但要插入值,还要插入索引。(索引也会占大量的空间)

(查询视图)

select view_name from user_views;

desc v$_dept_avg_sal_info;

添加视图增加了修改维护的难度,但是视图简化查询,保护相关信息;

create view v$_stu as select id,class from stu;

视图可以用来更新数据

sequence_and_review;

sequence一般来做主键,保证产生一个序列的数字,并且不能重复;(Oracle特有)

create table article

(

id number,

title varchar2(1024),

cont long

);

select max(id) from article;

(创建一个序列)

create sequence seq;

(查询下一个数值)

select seq.nextval from dual;

(向表中插入数据)

insert into article values (seq.nextval,'a','b');

select * from article;

优化一张表首先考虑索引

数据库的三范式:

范式:就是数据库设计的规则:

1,不存在冗余数据,

第一范式:1,要有主键;2,列不可分(不能重复);

创建一张表:

create table stu(xuehao,xingming,nianji);

第二范式:1,当一张表有多个主键,其他字段不能存在部分依赖(多对多的问题)

第三范式: 不能存在传递依赖,如有一张表有以下字段:(学号、姓名、班级号、班级名称、班级位置), 其中学号为主键,则班级号依赖于学号,每个学生都有相应的班级号,但是班级名称、班级位置 是依赖于班级号,即它们通过班级号传递依赖于学号,不满足第三范式。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: