最近在学习Orecle,这里做一个简单的知识点记录。
Oracle是使用表空间来管理表。tablespace。Oracle的表空间是数据库的逻辑单元。
一个表空间关联多个数据文件。
一个Oracle数据库可以创建多个表空间,一个表空间可以有多个用户,每个用户可以创建多个表。
下面来谈谈Oracle使用DDL来管理表。
1.Oracle创建表空间
create tablespace mrxu001
datafile 'D:\oracle\mrxu001.dbf'
size 100m
autoextend on
next 10m
注释:
mrxu001 表空间名称
datafile 指定表空间对应的数据文件
size 后定义表空间的初始大小
autoextend 自动增长,当表空间存储占满时,自动增长
next 后指定的是一次自动增长的大小
2.Oracle创建用户
create user mrxu
identified by itcast
default tablespace mrxu001
identified by 后边时用户的密码
default tablespace 后面是表空间名称
Oracle和其他数据库的区别在于表和其他数据库对象都是存储在用户下的。
给用户赋权限
进入systen用户下给用户赋予dba权限,否则无法正常登录
grant dba to mrxu
创建表
create table person(
pid number(10) primary key,
pname varchar2(10) ,
gender number(1) default 1,
birthday date
)
Insert 表数据
insert into person (pid,pname,gender,birthday)values(1,‘mrxu’,2,to_date(‘1996-05-02’,‘yyyy-mm-dd’))
修改表结构
alter table person add (address varchar2(20));
alter table person modify (address varchar2(21));
删除表
drop table 表名
约束
在数据库开发中,约束也是不可少的
约束可分为以下几种
- 主键约束
- 非空约束
- 唯一约束
- 外键约束
- 检查性约束
1.主键约束
create table person(
pid number(10) primary key,
pname varchar2(10) ,
gender number(1) default 1,
birthday date
)
我们可以自己定义主键约束的名字
create table person(
pid number(10) primary key,
pname varchar2(10) ,
gender number(1) default 1,
birthday date,
constraint person_pk_pid primary key(pid)
);
2 .非空约束
使用非空约束,可以约束指定的字段不为空
create table person(
pid number(10) primary key,
pname varchar2(10) not null ,
gender number(1) default 1,
birthday date,
constraint person_pk_pid primary key(pid)
);
3.唯一约束
指定表中的某一个字段是惟一的
create table person(
pid number(10) primary key,
pname varchar2(10) unique,
gender number(1) default 1,
birthday date,
constraint person_pk_pid primary key(pid)
);
4 .检查约束
create table person(
pid number(10) primary key,
pname varchar2(10) unique,
gender number(1) check(gender in (1,2)),
birthday date,
constraint person_pk_pid primary key(pid)
);
5 .外键约束
外键是两张表的约束,表A的字段中中包含表B主键,这时候为了保证关联数据的完整性,会进行外键约束。即表A中的该字段的可选值被表B约束
示例:
create table TEST_STUDENT(
STUDENT_ID NUMBER PRIMARY KEY,
STUDENT_NAME VARCHAR2(10),
GENDER NUMBER(1)
);
INSERT INTO TEST_STUDENT VALUES(1,'MRXU',1);
INSERT INTO TEST_STUDENT VALUES(2,'MRSQI',1);
SELECT * FROM TEST_STUDENT
--创建序列
CREATE sequence student_seq
increment by 1
start with 3
maxvalue 100
nocache
nocycle;
-- student_seq.nextval 不是根据主键来排列的,是根据 start with之后执行的次数的缓存来决定的
INSERT INTO TEST_STUDENT VALUES(student_seq.nextval,'MRSHUA',1);
--课程表
CREATE TABLE TEST_SUBJECT(
SUBJECT_ID NUMBER PRIMARY KEY,
SUBJECT_NAME VARCHAR2(10)
);
CREATE SEQUENCE SUBJECT_SEQ
INCREMENT BY 1
START WITH 1
MAXVALUE 100
NOCACHE
NOCYCLE;
INSERT INTO TEST_SUBJECT VALUES(SUBJECT_SEQ.NEXTVAL,'CHINESE');
INSERT INTO TEST_SUBJECT VALUES(SUBJECT_SEQ.NEXTVAL,'MATH');
INSERT INTO TEST_SUBJECT VALUES(SUBJECT_SEQ.NEXTVAL,'ENGLISH');
SELECT * FROM TEST_SUBJECT;
--创建中间表
CREATE TABLE STUDENT_SUBJECT_ITEM(
SSI_ID NUMBER PRIMARY KEY,
STUDENT_ID NUMBER,
SUBJECT_ID NUMBER
);
--中间表索引
CREATE SEQUENCE STU_SUB_SEQ
INCREMENT BY 1
START WITH 1
MAXVALUE 100
NOCACHE
NOCYCLE
INSERT INTO STUDENT_SUBJECT_ITEM VALUES(STU_SUB_SEQ.NEXTVAL,1,1)
DELETE FROM STUDENT_SUBJECT_ITEM
SELECT * FROM STUDENT_SUBJECT_ITEM
--添加外键约束
ALTER TABLE STUDENT_SUBJECT_ITEM ADD CONSTRAINT ITEM_STUDENT_FK
FOREIGN KEY (STUDENT_ID) REFERENCES TEST_STUDENT(STUDENT_ID)
删除外键:
ALTER TABLE STUDENT_SUBJECT_ITEM DROP CONSTRAINT ITEM_STUDENT_FK;
二 使用DML语句处理数据
1.插入数据
示例:
insert into person (pid,pname,gender,birthday)values(2,'mrxu1',3,to_date('1996-05-02','yyyy-mm-dd'))
2.修改数据
示例:
update person set pname='mrxuu' where pid=2
在update中可以使用子查询,次查询建立在两张或多张之间
示例:(伪码示例)
update person set .... where pid =(select pid from table_name where pname='mrxu' )
3 删除数据
简单示例:
delete from table where pid=1
Oracle的事务
Oracle事务对数据库变更的处理,让我们必须做提交事务提交才能正在的把数据插入到数据库。如果在执行完数据库变更操作后进行事务回滚,这样数据就不会被插入到数据库。注意:事务提交完成之后就不可以再进行回滚。
事务提交:commit
事务回滚:rollback
Oracle事务保存点:
事务的隔离级别和隔离性
Oracle支持3种事务的隔离级别
- READ COMMITED
- SERIALIZABLE
- READ ONLY
Oracle的默认隔离级别:READ COMMITED
三 管理其他的数据库对象
1 视图:视图就是一个封装了一条查询语句的虚表。视图的最大优点就是简化查询
示例:
创建一个视图:
create view person01 as select * from person p where p.pid=1
--利用视图来辅助查询
select * from person01 p01
查询结果:
不建议通过视图来修改数据,会有很多限制。
2.序列
Oracle数据库是不支持自增的,这时候我们需要通过手动维护序列来完成自增。并且将序列的值装入内存中可以提高访问效率。
序列定义示例:
create sequence person_seq
increment by 1
start with 5
maxvalue 100
nocache
nocycle;
序列创建完之后,所有的自增长都应该由用户自己处理,所以在序列中提供了以下两种操作
- nextval :取得序列的下一内容
- currval : 取得序列的当前内容
示例:
insert into person (pid,pname,gender,birthday)values(person_seq.nextval ,'mrxu1',3,to_date('1996-05-02','yyyy-mm-dd'))
3.索引
索引可以用来加快数据的存取。合理的使用索引可以大大降低i/o次数,从而提高访问效率。
1.单列索引
基于表的单个列所建立的索引
create index person_index on person(pname)
2.复合索引
基于表的多个列所建立的索引。
同一张表可以有多个索引,但要求列的组合不同
create index person_index2 on person(pname,gender)
索引使用示例:
1.新建一个表index_test
create table indexTest(
tid number,
tname varchar2(20)
);
2.新建序列
create sequence index_seq;
3.插入数据
begin
for i in 1..5000000
loop
insert into indexTest(tid,tname)values(index_seq.nextval,'mrxu'||i);
end loop;
commit;
end;
建索引前
select * from index_seq where tname=‘mrxu2019’;
查看执行时间
建索引后
select * from index_seq where tname=‘mrxu2019’;
查看执行时间
建索引的条件
大数据才建索引,小数据不要建索引
不要超过4列
对于查询频繁的数据应当建立索引。
LONG(可变长字符串数据,最长2G)和LONG RAW(可变长二进制数据,最长2G)列不能创建索引
如果有两个或者以上的索引,其中有一个唯一性索引,而其他是非唯一,这种情况下oracle将使用唯一性索引而完全忽略非唯一性索引
不能建索引的条件:
通配符在搜索词首出现时,oracle不能使用索引
不要在索引列上使用not,可以采用其他方式代替如下:(oracle碰到not会停止使用索引,而采用全表扫描)
索引上使用空值比较将停止使用索引
这里提一笔聚集索引和非聚集索引的基本认知
聚集索引:
定义:数据行的物理顺序与列值(一般是主键的那一列)的逻辑顺序相同,一个表中只能拥有一个聚集索引。
聚集索引得简单理解思路如下:
引用新华字典为列
索引…即拼音目录按A B C D …排序,我们通过目录能查询到相应的汉字,而且我们的汉字在字典中的排序也会按照A B C D排下去,这就是一个简单的聚集索引的例子。
(我们拼音目录的顺序对应了字典中汉字的顺序。并且我们的字典中只能有一个拼音目录。)
…
非聚集索引:
除了聚集索引,就都是非聚集索引了。
非聚集索引可以细分为普通索引,唯一索引,全文索引
也就是物理顺序与逻辑顺序不一致,非聚集索引可以有多个。
4.同义词
语法: CREATE [PUBLIC] SYNONYM synonym
for project;
使用同义词的作用:
1.可以很方便的访问其他用户的数据库对象
2.缩短了对象名字的长度
四 数据的导入和导出
略