Oracle 体系结构 : 数据库 --> 数据库实例ORCL --> 表空间(用户里面创建表) --> 数据文件
一.创建表空间
- 表空间 : 逻辑单位,通常我们新建一个项目,就会去新建表空间,在表空间中创建用户来创建表
- 语法:
create tablespace 表空间的名称
datafile '文件的路径(服务器上)'
size 大小
autoextend on 自动扩展
next 每次扩展的大小 - 切换到system账号下创建
- 创建一个表空间
create tablespace mytable
datafile 'c:\mytable.dbf'
size 100m
autoextend on
next 10m; - 删除表空间
drop tablespace mytable;
- 创建一个表空间
二.创建用户
- 创建用户
- 语法
create user 用户名
identified by 密码
default tablespace 表空间的名称 - 举例
create user zhangsan
identified by zhangsan
default tablespace mytable;
- 语法
- 授权
角色分类: connect- 语法
qrant 角色 | 权限 to 用户 - 举例
qrant connect to zhangsan;
- 语法
三.创建表
- 创建表
- 语法:
create table 表名(
列名 列的类型 {列的约束},
列名 列的类型 {列的约束}
); - 列的类型
varchar
varchar2(长度) 可变字符长度
char(长度) 固定长度字符
number(总长度,小数长度) 数字类型 -- 小数长度不能大于等于总长度
date 年月日时分秒
timestamp 时间戳,比date类型更加精确
LONG/CLOB : 存放一本小说
BLOB : 存放电影 Java 存进去,再读取出来
- 语法:
- 使用子查询的方式创建表
- 语法:
create table 表名 as 查询语句;
注意 : 只会复制表结构和表中的数据,不会复制列的约束
如果查询语句有结果,就是复制 表结构和数据
如果查询语句没有结果,就是复制 表结构 - 举例
create table emp as select * from scott.emp;
- 语法:
四.修改表
- 修改表
- 操作:
添加列
修改列
删除列
修改列名
重命名表 - 举例
create table stu(
stuid number,
sname varchar(10)
);
- 操作:
- --添加一列
alter table stu add phone varchar2(11);
添加多列
alter table stu add ( mobile varchar2(11) , sex varchar2(2) );
--修改列的类型
alter table stu modify sex varchar2(4);
--修改列名
alter table stu rename column sex to gender;
--删除列
alter table stu drop column gender;
--修改表名
rename stu to student;
--删除表
drop table student;
五.列的约束
- 列的约束
- 分类 : 五大约束 , 前四个是单表约束
-1- 主键约束: primary key 不能为空,必须唯一
-2- 非空约束: unique
-3- 唯一约束: not null
-4- 检查约束: check(条件) 在mysql中是可以写的,但是mysql直接忽略检查约束,写是没有意义的
-5- 外键约束: - 举例:
create table student(
stuid number primary key,
sname varchar2(10) unique,
age varchar2(10) not null,
gender varchar2(4) check( gender in ('男','女'))
);
添加外键约束, 创建一个商品表和一个商品分类表
alter table product add foreign key(cno) references category(cid);
- 分类 : 五大约束 , 前四个是单表约束
- 外键约束强制删除和级联删除
- 强制删除有外键的表 : 先删除外键关联表的外键约束,然后再删除自己
drop table category cascade constraint; - 级联删除: 添加外键约束,使用级联约束
alter table product add foreign key(cno) references category(cid) on delete cascade;
- 强制删除有外键的表 : 先删除外键关联表的外键约束,然后再删除自己
六.视图
- 概念 : 是对查询结果的一个封装 , 视图里面所有的数据,都是来自于它查询的那张表,视图本身不存储任何数据
-1- 能够封装复杂的查询结果
-2- 屏蔽表中的细节
注意: 通常不要通过视图去修改,视图创建的时候,通常要加上with read only - 语法 :
create [or replace] view 视图的名称 as 查询语句 [with read only] - 创建一个视图
create or replace view view_test1 as select ename,job,mgr form emp;
查看视图
select * from view_test1;
通过视图修改数据
update view_test1 set ename='SMITH2' where ename = 'SMITH'; - 同义词
create synoym dept for view_test3;
七.序列
- 概念: 生成类似于 auto_increment 这种ID自动增长 1,2,3,4,5...
- 语法:
create sequence 序列的名称
start with 从几开始
increment by 每次增长多少
maxvalue 最大值 | nomaxvalue
minvalue 最小值 | nominvalue
cycle | nocycle 是否循环
cache 缓存的数量 | nocache - 如何从序列中获取值
currval : 当前值
nextval : 下一个值
注意: curral 需要在调用nextval之后才能使用
select seq_test1.nextval from dual;
select seq_test1.currval from dual; - 序列用的最多的一种写法
create sequence seq_test2; //其他的值都是默认
select seq_test2.nextval from dual;
八.索引
- 概念 : 相当于是一本书的目录, 能够提高查询效率
如果某一列,经常用来作为查询条件,那么就有必要创建索引,数据量比较大的情况下 - 语法:
create index 索引的名称 on 表名(列)
注意: 主键约束自带主键索引,唯一约束自带唯一索引 - 建立索引优化:
cost CPU调用次数
Cardinality 影响行数 - 索引原理: btree balance tree 平衡二叉树
如果某列作为查询条件的时候,可以提高查询效率,但是修改的时候,会变慢
九.PLSQL编程
- Procedure Language 过程语言 Oracle对SQL的一个扩展
让我们能够像在java中一样写if else elsif 条件,还可以编写循环逻辑 for while -
- 循环语法
declare
--声明变量
变量名 变量类型;
变量名 变量类型 := 初始值;
vsal emp.sal%type; ---- 引用型的变量
vrow emp%rowtype; ----声明记录型变量
begin
--业务逻辑
end; - PL条件判断 属于业务逻辑.
if then
elsif then //elsif 定义就是这样
else
end if;
- 循环语法
- 举例:
- declare
i varchar2(10) := '张三';
begin
dbms_output.put_line(i); //相当于java中的syso
end; - declare
vsal emp.sal%type;
begin
--将查询出的结果赋值给vsal
select sal into vsal from emp where empno = 4399;
dbms_output.put_line(vsal);
end;
- declare