oracle学习笔记03

一:表空间

/*
     创建表空间:逻辑单位,通常我们新建一个项目,就会去创建表空间,在表空间中创建用户,用户去创建表。
     语法: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重构索引。

你可能感兴趣的:(oracle学习笔记03)