一:表空间
/*
创建表空间:逻辑单位,通常我们新建一个项目,就会去创建表空间,在表空间中创建用户,用户去创建表。
语法:create tablespace 表空间名字
datafile '文件的路径(服务器上的)'
size 大小
autoextend on 自动扩展
next 每次扩展的大小
*/
--切换到system用户
--创建一个表空间prod_dm
create tablespace prod_dm
datafile 'D:\app\prod_dm.dbf'
size 100m
autoextend on
next 10m;
--D:\app\prod_dm.dbf 会自动产生一个文件,大小100MB,占用空间100MB
--删除表空间
drop tablespace prod_dm; --删除逻辑关系,文件还存在,手动删除
--查看用户表空间情况,需要有resource角色权限
select tablespace_name,sum(bytes)/1024/1024 || 'MB' FROM user_free_space group by tablespace_name;
二 创建用户
/*
创建用户:
create user 用户名
identified by 密码
default tablespace 表空间的名字
*/
--创建用户
create user prod_dm
identified by dm_passwd
default tablespace prod_dm;
--现在可以用prod_dm登录,但是会报错 ORA-01045: user lacks CREATE SESSION privilege
/*
oracle中已经存在3个重要的角色:connect角色,resource角色,dba角色
connect 主要使用是让用户可以连接到数据库
resource 主要使用是让用户可以创建表
dba 它是一种比较特殊的权限,普通用户拥有之后可以成为数据库管理者
CONNECT 角色: --是授予最终用户的典型权利,最基本的权限有
ALTER SESSION --修改会话
CREATE CLUSTER --建立聚簇
CREATE DATABASE LINK --建立数据库连接
CREATE SEQUENCE --建立序列
CREATE SESSION --建立会话
CREATE SYNONYM --建立同义词
CREATE VIEW --建立视图
RESOURCE 角色: --授予开发人员的
CREATE CLUSTER --建立聚簇
CREATE PROCEDURE --建立存储过程
CREATE SEQUENCE --建立序列
CREATE TABLE --建表
CREATE TRIGGER --建立触发器
CREATE TYPE --建立类型
DBA:该角色具有数据库所有的权限,只有DBA角色权限才能创建数据库结构,并且系统权限也要DBA授出。
授权语法:grant 角色|权限 to 用户名;
--授权create session的权限,resource角色
grant create session,resource to 用户名;
*/
grant connect to prod_dm; --执行
三 数据类型
/*常用列的类型
varchar2(长度) 可变长度 varchar2(10) hello 占5个字符
char(长度) 固定长度 varchar(10) hello 占10个字符,用空格填充
number(总长度,小数长度) 数字类型
date 年月日时分秒
timestamp 时间戳
*/
select current_date from dual;
select current_timestamp from dual;
--使用子查询方式创建表
create table test2 as select * from emp;
四:修改表
/*
修改表:
添加列
修改列 varchar2(10)
删除列
修改列名
重命名表
SQL分类:
*/
--创建表
create table stu(
stuid number primary key ,
sname varchar(10)
);
--添加列add
alter table stu add phone varchar2(11);
--添加2列
alter table stu add (
sex varchar2(2),
address varchar2(2)
);
--修改列的类型modify
--把sex列的类型长度2修改为4
alter table stu modify sex varchar(4);
--修改列名 alter table 表名 rename column 旧列明 to 新列名;
--把sex列修改为gender
alter table stu rename column sex to gender;
--删除列 alter table 表名 drop column 列名;
--删除gender列
alter table stu drop column gender;
--修改表名 rename 旧表名 to 新表名;
rename stu to student;
--删除表
drop table student;
五:表的约束
/*表的五大约束
列的约束:约束主要是用来约束表中数据的规则
1:主键约束
2:非空约束
3:唯一约束
4:检查约束
5:外键约束:主要是用来约束从表product1中的记录,此记录必须存在于主表categoty1中
*/
--性别:男女不详
create table student(
student number primary key,
sname varchar2(10) unique,
age varchar2(4) not null,
gender varchar2(4) check( gender in ('男','女','不详'))
);
--主键约束违反
insert into student values(1,'张三','30','男');
insert into student values(1,'李四','31','男');
--回滚
--唯一约束违反
insert into student values(1,'诸葛','30','男');
insert into student values(2,'诸葛','31','男');
--非空约束
insert into student values(1,'诸葛','','男');
insert into student values(2,'周瑜',null,'男');
--检查约束
insert into student values(2,'周瑜','31','你好');
--外键约束
/*
商品分类,商品表
*/
--创建商品分类表 主表
create table category1(
cid number primary key,
cname varchar2(20)
);
--创建商品表 从表
create table product1(
pid number primary key,
pname varchar2(20),
cnumber number
);
insert into category1 values (1,'手机数码');
insert into product1 values(10,'apple',11); --插入这个11,没有意义,但是可以插入,所以需要添加外键约束
select * from category1;
select * from product1;
--添加外键约束
alter table product1 add foreign key (cnumber) references category1(cid); --之前有问题的数据没有删掉,所以会报错
--下面删除有问题的数据
truncate table product1;
truncate table category1;
--删除含有外键的表
drop table tablename cascade constraints;
六:更新数据和删除数据
/*
update 表名 set 列名 =列的值 where 条件
delete from 表名 where 条件
*/
七:事务
/*事务:就是一系列的操作,要么都成功,要么都失败
四大特性:原子性,隔离性,一致性,持久性
如果不考虑隔离级别:脏读,虚读,不可重复读
Mysql隔离级别:Read Uncommitted(读取未提交内容),Read Committed(读取提交内容),Repeatable Read(可重读)--默认事务隔离级别 ,Serializable(可串行化)
ORACLE隔离级别: read committed--默认的,serializable, read-only
提交:commit
事务的保存点/回滚点: savepoint 保存点的名字
回滚:rollback
rollback to 保存点名字
*/
八: 视图
/*
视图:是对查询结果的一种封装。视图里的所有数据,都是来源于原表。视图本身不存储任何数据。
作用:1:能够封装复杂的查询结果
2:屏蔽表中的细节
语法: create [or replace ] view 视图的名称 as 查询语句 [with read only]
--一般加上with read only
*/
--查询员工表
select * from emp;
--创建一个视图,视图可以理解成一个窗户,显示特定的大小,显示数据
--存在就替换 or replace
create or replace view view_test1 as select ename,job,mgr from emp;
--授权才能创建视图
grant create view to scott;
--查询视图
select * from view_test1;
--通过视图修改数据--不建议使用视图修改数据
update view_test1 set ename='SMITH2' where ename='SMITH';
select * from view_test1;
--创建一个只读视图
create or replace view view_test2 as select ename,job,mgr from emp with read only;
select * from view_test2;
update view_test2 set ename='SMITH1' where ename='SMITH2'; --不能修改只读视图
九:序列
/*
序列:生成类似于mysql中auto_increment 这种ID自动增长的数值
oracle 语法:
create sequence 序列的名字
start with 从几开始
increment by 每次递增多少
maxvalue 最大值 |nomaxvalue
minvalue 最小值 |nominvalue
cycle | nocycle --是否循环1,2,3,1,2,3
cache 缓存的数量
如何从序列中获取值:
currval:当前值 --注意:currval需要在调用一次nextval之后才能调用
nextval:下一个值
*/
--创建一个序列1,2,3,4,5...30 ,循环
create sequence seq_test001
start with 1
increment by 2
maxvalue 30
cycle
cache 10;
--测试
select seq_test001.currval from dual; --报错,虚要调用一次nextval
select seq_test001.nextval from dual; --1
select seq_test001.currval from dual; --1
select seq_test001.nextval from dual; --3
select seq_test001.currval from dual; --3
--序列用的最多的写法
create sequence seq_test002;
select seq_test002.nextval from dual;
10:索引
/*
索引:在数据量比较大的情况下,如果某一列经常作为查询条件,就可以创建索引,提高查询效率
语法:
create index 索引的名称 on 表名(列);
注意:主键约束自带主键索引,唯一约束自带唯一索引。
*/
--测试
--插入500万条数据
declare
begin
for i in 1..5000000 loop
insert into FiveMillion values('姓名'|| i,'地址'|| i);
end loop;
commit;
end;
--test
--在没有索引的情况下,查询 name='姓名3000000'
select * from FiveMillion where name='姓名3000000'; --0.086seconds
--创建索引name,再去查询name='姓名3000000'
create index ind_FiveMillion on FiveMillion(name); --32.256seconds
select * from FiveMillion where name='姓名3000000'; --0.044 seconds 速度变快了一倍
--创建复合索引
create index ind_FiveMillion2 on FiveMillion(name,address);
select * from FiveMillion where name='姓名3000000' and address='地址3000000';
/*SQL语句F5:explain plan 查看指标
1:cost CPU调用的次数
2:cardinality 影响的行数
*/
--索引的原理:平衡二叉树 btree blance tree
--如果某一列作为查询条件的时候,索引可以提高查询效率,但是插入数据的时候,会变慢。
--索引创建之后,过一段时间之后,DBA重构索引。