数据库讲义5

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

SCHEMA: is a collection of database objects owned by a special user.
schema 与 用户同名

select * from schema.table;


1、表
分类
堆表:插入数据快,无序
索引表
临时表
簇表
分区表

1.1 数据类型
数值:
number(p,s):p是精度,p最大38位(有效数字个数),s小数点位数
number(10,2)
number(5)

字符:
char(n byte|char):最长2000字节
varchar2(n byte|char):最长4000字节
char定长,占固定长度存储空间
varchar2变长,根据数据长度分配空间

drop table t01;
create table t01(n char(2000char));
insert into t01 values(lpad('a',2000,'b'));
insert into t01 values(lpad('你',4000,'好'));
select * from t01;
select length(n),vsize(n) from t01;

日期:
date,保存年月日时分秒
timestamp,保存年月日时分秒1~9小数秒

大对象类型:
blob: 而进制大对象,存电影、mp3、图片、word文档,最大128T
clob:字符型大对象,小说,最大128T

1.2 表维护语法
创建:
create table 表名(
列名 数据类型 [default 默认值]
[,....]
);
create table student(
stu_no varchar2(10),
stu_name varchar2(100),
stu_age number(2),
stu_gender varchar2(2) default '男',
stu_iden varchar2(18),
stu_birthday date
);

select * from user_tables;
select * from user_tab_columns where table_name='STUDENT';

--闪回技术,闪回删除,删表时没有直接删除,只是改名放在回收站
drop table t01;
select * from user_recyclebin;
flashback table t01 to before drop;
select * from t01;
--清空回收站
purge recyclebin;

--彻底删除
drop table t01 purge;
修改
增加列
alter table 表名 add (列名 类型 [default 默认值][,...]);
alter table student add (address varchar2(100));
修改列(改长度,改类型,改名)
alter table 表名 modify (列名 类型 [default 默认值][,...]);
alter table student modify(address varchar2(500));
alter table student modify(address number);
alter table student rename column address to postcode;
删除列
alter table 表名 drop column 列名;
alter table 表名 drop (列名1[,...]) ;
alter table student drop (postcode);
删除
drop table 表名 [cascade constraint]
cascade constraint: 当表主键或唯一约束被其他表的外键引用时,可级联删除约束,
否则表不能删除

create table t02(id number primary key,name varchar2(100));
create table t03(n number references t02(id));
drop table t02 cascade constraint;

改名
rename 表名 to 新表名;
rename t03 to xxx;
select * from user_tables;
drop table xxx cascade constraint;

1.3

约束
约束:防止无效数据进行数据库
nosql,大数据,hadoop
分类:
主键:primary key,唯一标识一行数据
外键:foreign key,引用其他表的主键或唯一约束列的数据
唯一:unique,唯一标识一行数据
非空:not null,不能空
检查:check,根据条件验证数据

表级约束、列级约束:
列级约束:指在列定义时同时定义约束
表级约束:指所有列定义后,在列定义下方单独定义约束

约束命名:
表名_列名_约束类型缩写

student_id_pk
student_classno_fk
student_name_nn
student_age_ck
student_iden_uni

主键:
--列级约束
create table student(
stu_no varchar2(20) [constraint student_stu_no_pk] primary key,
stu_name varchar2(100)
);

--表级约束
create table student(
stu_no varchar2(20) ,
stu_name varchar2(100),
[constraint student_stu_no_pk] primary key(id)
);
create table student(
stu_no varchar2(20) ,
stu_name varchar2(100),
[constraint student_stu_no_pk] primary key(id,name)
);

--修改表加主键约束
alter table student add [constraint student_stu_no_pk] primary key(id,name);


drop table student purge;
create table student(
stu_no varchar2(20) constraint student_stu_no_pk primary key,
stu_name varchar2(100)
);

select * from user_constraints;
select * from user_cons_columns where table_name='STUDENT';
唯一:
drop table student purge;

create table student(
stu_no varchar2(20),
stu_name varchar2(100),
stu_iden varchar2(18) unique
);
create table student(
stu_no varchar2(20),
stu_name varchar2(100),
stu_iden varchar2(18),
unique(stu_iden)
);


alter table student add unique(stu_iden);

非空:
drop table student purge;

create table student(
stu_no varchar2(20),
stu_name varchar2(100) not null,
stu_iden varchar2(18)
);

alter table student modify (stu_name varchar2(100) not null);

检查:
drop table student purge;

create table student(
stu_no varchar2(20),
stu_name varchar2(100),
stu_iden varchar2(18),
stu_age number(2) check(stu_age between 20 and 60),
stu_gender varchar2(20) check (stu_gender in ('男','女'))
);


create table student(
stu_no varchar2(20),
stu_name varchar2(100),
stu_iden varchar2(18),
stu_age number(2),
stu_gender varchar2(20),
check(stu_age between 20 and 60),
check (stu_gender in ('男','女'))
);


alter table student add check (stu_gender in ('男','女'));

外键:
create table tblclass(
clano varchar2(10) primary key,
claname varchar2(10)
);

drop table student purge;
create table student (
stuname varchar2(20),
clano varchar2(10) references tblclass(clano)
);

create table student (
stuname varch

ar2(20),
clano varchar2(10),
foreign key(clano) references tblclass(clano)
);

alter table student add foreign key(clano) references tblclass(clano);



select * from tblclass;
insert into tblclass values(1,'c1');
select * from student;
insert into student values('zs',1);

delete from tblclass;

on delete cascade: 删主表数据同时,从表数据同时删除
on delete set null:删主表数据同时,从表外键列值置空

select * from user_constraints where table_name='STUDENT';
alter table student drop constraint SYS_C006644;
alter table student add foreign key(clano) references tblclass(clano)
on delete cascade;
delete from tblclass;


alter table student drop constraint SYS_C006645;
alter table student add foreign key(clano) references tblclass(clano)
on delete set null;

约束维护
增加约束
删除约束
alter table student drop constraint 约束名;
禁用和启用约束
alter table student modify constraint 约束名 disable|enable;
alter table student modify constraint SYS_C006646 disable;
alter table student modify constraint SYS_C006646 enable;
改名
alter table student rename constraint 旧名 to 新名;
alter table student rename constraint SYS_C006646 to student_clano_fk;

建表练习
1)按照下面表格信息写出创建表的语句
部门表 tbldept
------------------------------------------
字段 类型 说明
deptid number(5) 部门编号,主键
deptname varchar2(30) 部门名称

员工表 tblemp
------------------------------------------
字段 类型 说明
empid number(5) 员工编号,主键
empname varchar2(10) 员工名称

create table tbldept (deptid number(5) primary key,
deptname varchar2(30));
create table tblemp(
empid number(5) primary key,
empname varchar2(10));


2)按照下面要求分别写出修改表结构的语句
修改表tblemp,增加列phone,类型varchar2(20)
修改表tblemp,将列empname类型修改为varchar2(20)
修改表tblemp,删除列phone

alter table tblemp add (phone varchar2(20));
alter table tblemp modify(empname varchar2(20));
alter table tblemp drop (phone);
3)按照下面要求分别写出修改表名的语句
将表tbldept修改为 dept1
将表tblemp修改为 emp1
select * from user_constraints;

rename tbldept to dept1;
alter table tblemp rename to emp1;

4) 修改表emp1增加列deptid,外键,引用dept1表 的 deptid列。
alter table emp1 add (deptid number(5) references dept1(deptid));

5)修改表dept1,增加部门所在房间号roomno,唯一约束。
alter table dept1 add(roomno number unique);

6)修改表emp1,删除在deptid上的外键约束,重建增加外键约束
引用dept1表的deptid列并指定级联删除(on delete cascade)。
select * from user_constraints where table_name='EMP1';
alter table emp1 drop constrai

nt SYS_C006660;
alter table emp1 add foreign key(deptid) references dept1(deptid)
on delete cascade;
7)按照下面要求写出创建工资表salary的语句。
员工编号,8位长,主键
姓名,非空
年龄,要求介于20-60之间,
入职时间
工资
性别,只能 是男或女
手机号,唯一
部门编号,外键,引用dept1的deptid列

drop table salary;
create table salary(
empno number(8) primary key,
empname varchar2(100) not null,
empage number(2) check(empage between 20 and 60),
hiredate date,
sal number(10,2),
gender varchar2(2) check (gender ='男' or gender='女'),
phonenum varchar2(11) unique,
deptid number(5) references dept1(deptid)
);

primary key和Not Null:不能空
unique:可空
check:可空
foreign key: 可空

1.4 索引表
create table 表名(列定义) organization index;
表的数据相对静态,例如编码表

查询快,更新速度慢、成本高

1.5 临时表
表:数据变化必须记录日志
临时表:不记日志

可做中间统计信息的结果存储

create global temporary table 表名(列定义);

1.6 簇

cluster: 一堆,按特定列对数据进行分组

create cluster dept_emp(deptid number);
create index dept_emp_index on cluster dept_emp;

create table dept1(did number,dname varchar2(20)) cluster dept_emp(did);
create table emp1(eid number,ename varchar2(20),did number) cluster dept_emp(did);

select * from user_clusters;

1.7 分区表

100万
1000万以上算大表

分区:将大表拆成多个小表

分类:
范围分区
列表分区
哈希分区

范围-列表
范围-哈希

范围分区:

create table people(
iden varchar2(18) primary key,
name varchar2(20),
age number,
province varchar2(20),
gender varchar2(20),
birthday date
)
partition by range(age)
(
partition p1 values less than (21),
partition p2 values less than (41),
partition p3 values less than (61),
partition p4 values less than (81),
partition p5 values less than (maxvalue)
)

insert into people values('111','a',15,'辽宁','男',to_date('1999-10-01','yyyy-mm-dd'));
insert into people values('112','b',35,'辽宁','男',to_date('1979-10-01','yyyy-mm-dd'));

select * from people ;
select * from people partition (p4);


列表分区:

create table people1(
iden varchar2(18) primary key,
name varchar2(20),
age number,
province varchar2(20),
gender varchar2(20),
birthday date
)
partition by list(province)
(
partition p1 values ('辽宁'),
partition p2 values ('吉林'),
partition p3 values ('黑龙江'),
partition p4 values (default)
)


select * from user_tables;
select * from user_tab_partitions;


哈希分区:

create table people2(
iden varchar2(18) primary key,
name varchar2(20),
age number,
province varch

ar2(20),
gender varchar2(20),
birthday date
)
partition by hash(name)
(
partition p1,
partition p2,
partition p3,
partition p4
)

组合分区
范围-列表
create table people3(
iden varchar2(18) primary key,
name varchar2(20),
age number,
province varchar2(20),
gender varchar2(20),
birthday date
)
partition by range(age)
subpartition by list(province)
(
partition p1 values less than(21)
(
subpartition p1_1 values('辽宁'),
subpartition p1_2 values(default)
),

partition p2 values less than(maxvalue)
(
subpartition p2_1 values('辽宁'),
subpartition p2_2 values(default)
)
)

范围-哈希
create table people4(
iden varchar2(18) primary key,
name varchar2(20),
age number,
province varchar2(20),
gender varchar2(20),
birthday date
)
partition by range(age)
subpartition by hash(province)
(
partition p1 values less than(21)
(
subpartition p1_1,
subpartition p1_2
),

partition p2 values less than(maxvalue)
(
subpartition p2_1,
subpartition p2_2
)
)


sqlplus system/oracle
grant create view,create synonym,create database link to scott;
2、视图
视图是一个定义好的查询语句。

create view 视图名[(列名1,......)]
as 子查询
[with check option| with read only];

with read only: 视图只读
with check option: 视图上的数据操作必须符合创建视图时指定的条件

select * from user_tables;

create table sal(
id number,
name varchar2(20),
sal number);

--基于单表且包含所有主键和非空列的视图,可以做数据修改
create view v1 as select * from sal;
insert into v1 values(1,'a',5000);
select * from sal;

create view v4(empno,empname,salary) as select * from sal;
select * from v4;
--只读
create view v2 as select * from sal with read Only;

--带检查约束
create view v3 as select * from sal where sal>3000
with check option;

select * from v3;
insert into sal values(2,'b',2000);

insert into v3 values(3,'c',8000);
select * from sal;
insert into v3 values(4,'d',2500); X
update v3 set sal=5000 where sal=2000;X
update v3 set sal=2000 where sal=8000;X

select * from sal;
3、序列
自增数字,一般用作表的主键值。

create sequence 序列名
start with 起始值(默认1)
increment by 递增值(默认1)
minvalue 最小值(默认1)
maxvalue 最大值(默认10^26)
cycle|nocycle(是否循环使用)
order|noorder(按顺序)
cache n(预分配)|nocache

create sequence seq1 start with 10 increment by 5;

伪列:
currval: 取当前会话最后取到的序列值,必须在nextval使用后才可用
nextval: 取下一个值

select seq1.nextval from dual;
select seq1.currval from dual;

insert into sal values(seq1.nextval,'b',2000);
select * from sal;

4、同义词

别名
create synonym s1 for sal;
select * from s1;

5、数据库链接
分布式事务需要借助数据库链接。
create database link link1
connect to scott
identified by tiger
using 'ora72';

select * from sal;
select * from t01@link1;

create synonym t01 for t01@link1;
select * from t01;

6、索引
索引:冗余数据结构,为了提升查询效率。

主键、唯一约束自动创建索引。
create index 索引名 on 表(列1[,...]);

多列索引:
选择率高(挑出来的数据最少) ,......

索引建在哪些列:
主键
唯一
查询条件出现频率高(谓词)
外键




PL/SQL 对象
存储过程
函数

触发器




相关文档
最新文档