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,当一张表有多个主键,其他字段不能存在部分依赖(多对多的问题)
第三范式: 不能存在传递依赖,如有一张表有以下字段:(学号、姓名、班级号、班级名称、班级位置), 其中学号为主键,则班级号依赖于学号,每个学生都有相应的班级号,但是班级名称、班级位置 是依赖于班级号,即它们通过班级号传递依赖于学号,不满足第三范式。