5 数据库对象 建表, 插入, 修改, 约束

-- 建表语句
create table student(
   sid number(4)  primary key,
   sname varchar2(20),
   grade varchar2(20),
   sex   char(4)  default '男',
   birthday date
)

-- 插入数据
insert into student values(1000, '张1', 'Java就业者', '女', to_date('1990-3-12', 'YYYY-MM-DD'))
INSERT INTO STUDENT (SID, SNAME, GRADE, BIRTHDAY) VALUES(1001, '张2', 'Java基础', '12-3月-1985')

select * from student;

-- 在不影响数据的情况下, 对表做出修改, 对表的修改主要是对字段进行修改
--  主要操作: 1. 添加字段 . 2. 删除字段 3.修改字段(修改字段的类型, 修改字段的长度)
-- 添加字段, 总是可以成功, 新添加的字段出现在表的最后面
alter table student
      add  tel varchar2(11);
      
alter table student
      add addr varchar2(20);
      
-- 修改字段
-- 在该字段没有数据的时候, 字段的类型, 字段的长度都是可以修改的
alter table student
      modify tel  number(11);
      
alter table student
      modify tel varchar2(11);
      
-- 对于缺省值的修改,只会影响已经存在的数据, 只会对以后插入的数据产生影响
alter table student
      modify sex char(4) default '女';
      
INSERT INTO STUDENT (SID, SNAME, GRADE, BIRTHDAY) VALUES(1002, '张3', 'Python基础', '12-3月-1985')

-- 对于字段有数据的时候, 字段的类型是不能修改的, 字段的长度是可以修改的
-- 字段的长度是可以修改的, 增大总是可以的, 减少要看数据的实际长度
alter table student
      modify grade varchar2(20);  -- 增大字段长度总是可以的
      
alter table student
      modify grade varchar2(14);   -- 减少字段长度要长于已存在的数据的最大长度
      
alter table student            -- 无法修改, 提示: 要修改的字段内容必须为空 才能修改
      modify grade number(11);
      
-- 删除字段 , 字段里面有内容的,内容也删掉
alter table student
      drop column addr;
      
alter table student
      drop column birthday;
      
-- 在建表的时候使用自查询
create table dept_back
as
select * from dept;

drop table dept_back;

create table dept_back
as
select deptno, dname from dept;

select * from dept_back;

create table dept_back   -- 已经存在表名的不能重建
as
select deptno 部门编号, dname 部门名称 from dept where deptno <= 30;

create table dept_back (deptno 部门编号, dname 部门名称)   -- 创建表的字段必须与查询表的字段匹配
as
select * from dept where deptno <= 30;


-- 删除标的数据  , truncate table  比 delete 删除速度快, 但该命令一定要慎用
-- truncate 是 ddl 语句 不能回滚 , 释放标的内存空间, delete不释放空间
-- delete 可以rollback  
truncate table dept_back;

-- 删除表, 1. 表中所有数据将被删掉 2.没有完成的事务被提交 3.所有相关的索引被删除,4 不能回退
drop table dept_back;

-- 改变对象的名称 , 使用 rename 语句改变对象名称,可以修改表/视图/序列/同义词的名称
-- 必须是对象的所有者才可以 rename , 即使是 dba 也不可以
select * from student;
rename student to students;
select * from students;

--====================数据库约束==================================
-- 约束必须建立在表上, 但是约束是一个独立的数据库对象, 没有表也就没有约束
-- 约束是在表上强制执行的校验规则,被插入/修改/删除的数据必须符合相关字段
-- 约束条件可以是构建在一个表的单个字段上,也可以是构建在一个表的多个字段上
-- 当表中数据有相互依赖性时, 可以保护相关的数据不被删除
/* Oracle 支持下面 五类完整性约束
   not null  非空
   unique key  唯一性
   primary key  主键
   foreign key   外键
   check      检察*/

-- 创建约束的操作, 可以在建表的时候 同时把约束创建出来, 也可以在建好表之后,
-- 通过 alter table 来给表添加约束
-- 约束也是一个独立的数据库对象, 也需要命名, 有两种方式:1. 我们给约束取名, 2. 让oracle 给约束取名
-- 非空约束, 是唯一一个可以定义在列级的约束,(只能看守一个字段), 明确该字段的数据不能为 NULL
-- 除了主键约束之外, 一个表中可以同时存在多种相同类型的约束
drop table students;
create table students(
       sid number(4) primary key,
       sname varchar2(20) not null,
       grade varchar2(20) not null
);

insert into students values(1000, '张1');

insert into students values(1000, null);  -- 插入 null 与字段约束不匹配

-- 唯一约束, 保证该字段的数据不能重复, 或字段组合不能重复,但是可以为 null

-- 唯一约束可以作用在单个字段上, (称为单列约束)
create table student(
       sid  number(4)  primary key,
       sname varchar2(20) not null,
       email  varchar2(20) ,
       constraints  email_uni  unique (email)
);

insert into student values(1000, '张1', 'zhangyi@163.com');
insert into student values(1001, '张2', 'zhanger@163.com');

select * from student;


-- 唯一约束也可以同时作用在多个字段上(称为表级约束)
-- 一个表中可以存在多个唯一约束
drop table student;

create table student(
       sid number(4)  primary key,
       first_name varchar2(20),
       last_name  varchar2(20),
       constraints name_int unique(first_name, last_name)  -- unique() 里面的多个字段 共同约束(两个字段都相同才约束 注意: 两个字段都为 null 不约束), 而非一个
);

insert into student values(1000, '张1', '一');
insert into student values(1001, '张2', '二');
insert into student values(1002, '张3', '三');
insert into student values(1003, '李3', '三');  -- last_name 违反唯一性约束 无法插入
insert into student values(1005, '李3', '三');
insert into student values(1004, '李4', null);
insert into student values(1006, '李4', null);
insert into student values(1007, null, null);  
insert into student values(1008, null, null);

-- 主键约束: 从功能上说,相当于非空且唯一
-- 在一个表中只能有一个主键约束,
-- 通过主键可以唯一确定一条记录
-- 一个实体中什么样的数据可以被确定为主键?
/*不要选用实体的业务数据当做主键, 因为业务数据是可以变化的, 应该用一个和实体无关的流水号当作表主键*/
drop table student;

create table student(
       sid number(4),
       sname varchar2(20),
       constraints PK_STR PRIMARY KEY (SID)
);

INSERT INTO STUDENT VALUES(1000, '张1');
INSERT INTO STUDENT VALUES(1001, '张1');
INSERT INTO STUDENT VALUES(1002, '张1');
INSERT INTO STUDENT VALUES(1003, '张1');

-- 主键约束同时作用在多个字段上
select * from student;
create table student(
       first_name varchar(10),
       last_name varchar(20),
       grade  varchar(20),
       constraint PK_STR primary key (first_name, last_name)  -- 主键作用在多个字段上称为联合主键
);

insert into student values('张','一','Java就业');
insert into student values('张','二','Java就业');
insert into student values('二','张','Java就业');
insert into student values('张','一','Java就业');  -- 违反主键 的 唯一性约束
insert into student values('张','null','Java就业');
insert into student values('null', '张','Java就业');
insert into student values('null', 'null','Java就业');

-- 外键约束, 外键约束可以重复, 可以为 null
-- 外键约束关系到两个表的两个字段之间的关系
-- 在外键约束下, 在建表的时候, 要先建立父表 后建立子表
create table DEPT1(
       deptno number(4) primary key,
       dname  varchar2(10)
)

create table emp1(
      empno   number(4) primary key,
      ename   varchar2(10),
      job     varchar2(10),
      dept_no number(4),
      constraints PK_EMP2 foreign key(dept_no) references dept1(deptno)
);

-- 在外键约束下, 在添加数据的时候, 要先添加父表数据  后添加子表数据
insert into dept1 values(10, '销售部');
insert into dept1 values(20, '开发部');
insert into dept1 values(30, '生产部');
insert into emp1 values(1000, '张0', '销售员', 10);
insert into emp1 values(1001, '张1', '销售员', 10);
insert into emp1 values(1002, '张2', '工程师', 20);
insert into emp1 values(1003, '张3', '产品', 30);

select * from emp1;
select * from dept1;

-- 在外键约束下, 要删除数据的时候, 要先删除子表, 后删除父表 : 父表的键还被子表作为外键引用,不能删
delete from dept1 where deptno = 10;   
delete from emp1 where dept_no = 10;


-- 在外键岳素霞, 要删除表的时候, 要先删除子表, 后删除父表
drop table emp1;
drop table dept1;

-- 父表中的什么样的字段可以被其他表引用为外键?
/* 父表中的主键 或 唯一键可以被其他表引为外键 */

create table dept1(
       deptno      number(4)   primary key,
       dname       varchar2(20),
       locid       number(4),
       constraints LOC_UIN     unique(locid)
);

create table empl1(
      empno   number(4) primary key,
      ename   varchar2(10),
      job     varchar2(10),
      dept_no number(4)
);

-- 在建立好表之后, 通过 alter table  在给表添加约束
alter table empl1
      add constraints FK_EMPL foreign key(dept_no) references dept1(deptno);

-- 一对一如何用主外键来实现  
--  在外键上同时设置唯一约束,就可以实现一对一的关系
create table card(
       cid number(4)  primary key,
       cname varchar2(10)
);

create table person(
       pid   number(4)  primary key,
       pname varchar2(20),
       cid   number(4),
       constraints FK_PER_CARD foreign key(cid) references card(cid),
       constraints CID_UNI  unique(cid)
);

insert into card values (1000,'身份证');
insert into card values (1002, '身份证');

insert into person values(1, '张1', 1000);
insert into person values(2, '张2', 1000);  -- 提示违反唯一性约束
insert into person values(3, '张2', 1002);  -- 子项的外键关键字的内容, 必须属于主表的外键关键字

select * from card;
select * from person;

-- 多对多关系的实践  (一个学生学多门课程, 一个课程可被多个学生学)
/* 多对多的时候要引入关系系统 */
create table student(
       sid NUMBER(4) primary key,
       sname varchar2(20)
);

create table course(
       cid number(4) primary key,
       cname varchar2(20)
);

--  1.关系表中可以用上面两个表的主键当做外键, 同时又把外键当做 联合主键
create table stu_cour(
       sid  number(4),
       cid  number(4),
       constraint FK1 foreign key(SID) references student(sid),
       constraint FK2 foreign key(cid) references course(cid),
       constraint PK_STU_COUR primary key(sid, cid)
);
2-- 2.关系表中可以用上面那两个表的主键当外键, 关系表有自己的主键
create table stu_cour(
       scid number(4) primary key,
       sid  number(4),
       cid  number(4),
       constraint FK1 foreign key(SID) references student(sid),
       constraint FK2 foreign key(cid) references course(cid)
       
);
insert into student values(1, '张1');
insert into student values(2, '张2');
insert into student values(3, '张3');
insert into student values(4, '张4');

insert into course values(1, 'CoreJava');
insert into course values(2, 'Oracle');
insert into course values(3, 'html');
insert into course values(4, 'JavaScript');
insert into course values(5, 'JavaWeb');

insert into stu_cour values(1, 1, 1);
insert into stu_cour values(2, 1, 2);
insert into stu_cour values(3, 1, 3);
insert into stu_cour values(4, 1, 4);
insert into stu_cour values(5, 2, 1);
insert into stu_cour values(6, 2, 3);
insert into stu_cour values(7, 2, 4);

-- 查询张1学习了哪些课程
select *
from student s, course c, stu_cour sc
where s.sid = sc.sid and c.cid = sc.cid and s.sname = '张1';











posted @ 2020-05-01 16:10  gupanpan  阅读(255)  评论(0)    收藏  举报