#数据库常用对象
#1. 建立表
create table stu(
id number(6),
name varchar2(20),
sex number(1),
age number(3),
sdate date,
grade number(2) default 1,
class number(4),
email varchar2(50)
);
#2.删除表
drop table stu;
#3.五个约束条件
#(1)非空约束(not null) (这里name not null)
create table stu(
id number(6),
name varchar2(20) not null,
sex number(1),
age number(3),
sdate date,
grade number(2) default 1,
class number(4),
email varchar2(50)
);
#可以定义字段级约束,也可以定义表级约束
create table stu(
id number(6),
name varchar2(20) constraint stu_name_nn not null,
sex number(1),
age number(3),
sdate date,
grade number(2) default 1,
class number(4),
email varchar2(50)
);
name constraint stu_name_nn not null
如果在name字段中插入一个null值,则会出现如下错误:无法将 NULL 插入 ("DYS"."STU"."NAME");
#(2)唯一约束(unique)
create table stu(
id number(6) unique,
name varchar2(20) constraint stu_name_nn not null,
sex number(1),
age number(3),
sdate date,
grade number(2) default 1,
class number(4),
email varchar2(50)
);
如果在id字段中插入重复的值,则会显示如下错误:违反唯一约束条件
字段级约束,缺点是如果设两个字段为约束条件,则不能实现目的
create table stu(
id number(6) ,
name varchar2(20) ,
sex number(1),
age number(3),
sdate date,
grade number(2) default 1,
class number(4),
email varchar2(50),
constraint uq_stu_unique unique(id, email)
);
constraint uq_stu_unique unique(id, email), 这样设的话可以把两个字段联合在一起.
唯一约束中的表级约束
constraint stu_name_email_unique unique(name, email);
#(3)主键约束(primary key)
主键(primary key),可以唯一标识整条记录,非空且唯一.
create table stu(
id number(6) primary key,
name varchar2(20) ,
sex number(1),
age number(3),
sdate date,
grade number(2) default 1,
class number(4),
email varchar2(50)
);
#(4)外键约束(foreign key)
create table class (
id number(4) primary key,
name varchar2(20) not null
);
create table stu(
id number(6) primary key,
name varchar2(20) ,
sex number(1),
age number(3),
sdate date,
grade number(2) default 1,
class number(4) references class(id),
email varchar2(50)
);
class number(4) references class(id) 这条是表stu的外键参照表class的主键
如果向表stu插入数据的时候,insert into stu(id,name,class, email)values(1,'a',1000,'a');
则会出现如下错误:违反完整约束条件 (DYS.SYS_C005763) - 未找到父项关键字
表级约束:
constraint stu_class_fk foreign key(class) references class(id),
create table stu(
id number(6) primary key,
name varchar2(20) ,
sex number(1),
age number(3),
sdate date,
grade number(2) default 1,
class number(4) ,
email varchar2(50),
constraint stu_class_fk foreign key(class) references class(id)
);
先向表class中插入数据: insert into class values(1000,'LI');
再向表stu中插入数据: insert into stu(id,name,class, email) values(1,'a',1000,'a');
被参考的字段必须是主键
#(5)check约束
delete from class where id = 1000; #这个值被参考了,(违反完整约束条件)
#4.修改表结构
alter table stu add(addr varchar2(100)); #增加字段
alter table stu drop(addr);
alter table stu add(addr varchar2(100));
alter table stu modify(addr varchar2(150)); #修改字段
注意:修改后的精度必须能允许先前的精度, 比如number(50)--> number(25), 可能会截取了一些数据.
增加或者删除约束条件:
delete from class; #不能删,因为违反完整约束条件 (DYS.STU_CLASS_FK),有外键约束
如果把约束条件删除了后可以删除表中的数据
alter table stu drop constraint stu_class_fk;
然后再删除表中的数据
delete from class; #这时就可以删除了
#5.数据字典
desc user_tables;
#查看有什么表
select table_name from user_tables;
#查看有哪些视图
select view_name from user_views;
#查看有哪些约束条件
select constraint_name from user_constraints;
#显示约束条件的结构
desc user_constraints;
#数据字典存在一个表中,这个表称为dictionary
#显示数据字典表中的结构
desc dictionary;
#查看数据字典中的表
select table_name from dictionary;
select table_name from dictionary where table_name like 'USER%'order by tab
le_name;
#6.索引
desc stu;
#创建索引
create index idx_stu_email on stu(email);
#删除索引
drop index idx_stu_email;
#从数据字典中查看有哪些索引
select index_name from user_indexes;
#建立索引后,插入数据慢了,因既要在表中插入数据,又要在索引中插入, 但是读数据却比较快. 索引也会占用空间,不要轻易建立.
#7.视图
#视图, 就是子查询
#建立索引
create view v$_stu as select id, name, age from stu;
#查看索引
desc v$_stu;
#查看数据字典中的视图
select view_name from user_views;
desc v$dept_avg_sal_info;
#视图是可以更新数据的.一般不建议在视图中更新数据.
#8.序列
#序列是oracle数据库中独特的,产生唯一的不间断的序列, 一般用作主键
#创建表
create table article(id number, title varchar2(1024), content long);
#创建索引
create sequence seq; #此时会出现权限不足的现象
#连接到数据库管理员
conn sys/dys as sysdba;
#授权给用户创建序列的权限
grant create sequence to dys;
#然后再创建序列
create sequence seq;
#序列在内部已经作好了线程同步了,不会出现数据不一致的现象
#查看序列的下一个值
select seq.nextval from dual;
#向表article中插入数据
insert into article values(seq.nextval, 'a', 'b');
#查看表article中的数据
select * from article;
#删除序列
drop sequence seq;
#一个序列对应于一个字段
#9.数据库的三范式
#数据库设计的三范式,是要追求不存在冗余字段, 同样的数据不存在第二遍
#范式:是数据库设计的规则
#第一范式的第一要求是要有主键,第二要求是列不可分,即在列上不能重复. 比如出生年月和年龄, 这是一种重复
#第二范式:当一张表中有多个字段组合作为主键时,非主键的字段不能够依赖于部分主键.
#第三范式:存在传递依赖
#在设计数据库时只要做到三范式就可以了.