oracle练习-day03

---------------------------------Oracle day03----------------------------------
--01.创建表空间
--删除表空间
drop tablespace heima38_space including contents and datafiles;
--创建表空间
create tablespace heima38_space --表空间名称
datafile 'c:\heima.dbf'         --表空间的对应的文件路径
size     10M                    --表空间初始化的大小
autoextend on                   --自动增长
next 10M                        --每次增长10M
--02.创建用户赋权限
create user heima38 identified by heima38;
--为用户授权
oracle角色权限
connect:连接数据库权限
resource:数据库基本操作的权限
dba:数据库管理员的权限
--为heima38授予dba权限
grant dba to heima38;
--实现的项目中为heima授予
grant connect,resource to heima38;
--删除用户
drop user heima38;

--通过查询语句查询当前用户拥有哪些权限
select *from session_privs

----------------------------------以上都是通过system账号创建------------------------------------------------
--03.创建表
语法:
create table 表名
(
       列名 数据类型(长度) 约束,
       列名 数据类型(长度) 约束
)
--04.常见的数据类型
--字符型
char: 固定字符串长度 最大2000字符             myname char(10) --'Tom' 长度:10
varchar2:推荐使用这个 可变长度最大4000字符    myname varchar2(10) --'Tom' 长度:3
varchar:可变长度最大4000字符                  myname varchar(10) --'Tom' 长度:3

--数值型
number:存放数值         price number(3,2) --3:总长度 2:小数点后2位 最大值:9.99  最小值 -9.99

--日期型
mysql中datetime 跟 oracle中date一样使用  数据格式:'yyyy-mm-dd hh24:mi:ss'
timestamp 时间戳 精确非常高 秒后9 'yyyy-mm-dd hh24:mi:ss.123456789' 
--'2018/08/14 09:16:22.123456789' --秒杀
--大数据类型
oracle中数据类型
blob:二进制数据 存4G
clob:字符串可以达到4G
long:字符串可以达到2G

--05.创建表以及5种单表约束
约束:
非空约束:not null
主键约束:primary key
检查约束:check (字段名 in(0,1))--sex
唯一约束:unique 
外键约束: constraint 外键名称 foreign key(外键表列名) references 主表名(主键id) 

--创建表
drop table t_person;
create table t_person
(
       pid number(10) primary key,--主键id 主键约束
       pname varchar2(30) not null,--非空约束
       psex char(1) check(psex in(0,1)),--检查约束
       ptelephone varchar2(11) unique--唯一约束
);
--测试约束
insert into t_person values(2,'小王2',0,'14666666666');
commit;--提交数据

问题:提示不够准确
drop table t_person;
create table t_person
(
       pid number(10),--主键id 主键约束
       pname varchar2(30) not null,--非空约束
       psex char(1),--检查约束
       ptelephone varchar2(11),--唯一约束
       constraint pk_pid primary key(pid),
       constraint check_sex check(psex in(0,1)),
       constraint unique_telephone unique(ptelephone)
);
--测试约束
insert into t_person values(3,'小王2',2,'13666666666');
commit;--提交数据

--06.修改表结构
增加字段:alter table t_person add address varchar2(10)
修改字段:alter table t_person modify address varchar2(200)
删除字段:alter table t_person drop column address
应用场景:系统已经上线后,在已有的表的基础上做修改

--07.创建表双引号使用的问题
oracle中 双引号使用的:别名 表名 列名
drop table "t_Test";
create table "t_Test"
(
       "id" number(10),
       "name" varchar2(30)
);
insert into "t_Test" values(1,'小王');
commit;
--查询
select * from "t_Test" where "id" = 1;
delete from "t_Test" where "id"=1;
truncate table  "t_Test"

--08.truncatedelete区别
delete:
执行删除可以回滚
执行delete可以加条件
可以删除单条数据也可以删除多条数据
delete效率没有truncate高,因为产生磁盘碎片
truncate:
执行删除不可以回滚
执行truncate不可以加条件
删除整个表的数据
truncate效率比delete高,不会产生磁盘碎片(直接摧毁表结构,重建一个表)

--09.事务和事务保存点
什么是事务?
mysql事务默认的隔离级别:可重复读
oracle事务默认的隔离级别:可以读取已经提交的数据

--事务保存点
语法:
设置事务保存点 savepoint 事务保存点名称
回滚到事务保存点 rollback to 事务保存点名称

--测试
truncate table t_person;
--往表中插入数据

insert into t_person values(5,'小王5','1','14666666');
insert into t_person values(6,'小王6','0','15666666');
savepoint b;
insert into t_person values(3,'小王3','0','12666666');
insert into t_person values(4,'小王4','0','13666666');
savepoint a;
insert into t_person values(4,'小王4','0','13666666');
rollback to a;
commit;
select * from t_person;

--实际应用场景



--10.快速建表(给NEW YOEK 地区的所有员工涨100工资)
--需求:通过快速建表的方式 将 scott用户下emp和dept表 建立 heima38用户下
快速建表可以将表结构和表中的数据全部复制过来
语法:create table 表名 as 查询语句 
create table myemp as select * from scott.emp;
create table mydept as select * from scott.dept;
--NEW YOEK 地区的所有员工涨100工资
查询几张表 myemp mydept 
更新那一列? sal
过滤条件:给NEW YOEK 地区
--NEW YOEK 地区的所有员工查询出来
select * from myemp e where e.deptno =(
select deptno from mydept d where d.loc = 'NEW YORK')
--NEW YOEK 地区员工涨100工资

update myemp set sal=sal+100 where deptno =(
select deptno from mydept d where d.loc = 'NEW YORK')
--11.视图
什么是视图?
它是一个虚表(实际并不存在这个表)
为什么要用?
1.为了封装复杂的查询语句
2.隐藏敏感字段
怎么用?
语法 create [or replace] view 视图名称 as 查询语句;
--为了封装复杂的查询语句
create view view_myemp as 
select sum(count(*)) Total,
  sum(decode(to_char(e.hiredate,'yyyy'),'1980',count(*))) "1980",
  sum(decode(to_char(e.hiredate,'yyyy'),'1981',count(*))) "1981"
  sum(decode(to_char(e.hiredate,'yyyy'),'1982',count(*))) "1982",  
  sum(decode(to_char(e.hiredate,'yyyy'),'1987',count(*))) "1987"  
  from myemp e group by to_char(e.hiredate,'yyyy')

--隐藏敏感字段
create or replace view view_myemp as
select e.ename,e.job from myemp e;

--查询视图  
select * from view_myemp

--更新视图中的数据(不推荐使用)
update view_myemp set job = 'abc' where ename='S_MITH';
--一般在创建视图的视图 指定只读
--12.只读视图
create or replace view view_myemp as
select e.ename,e.job from myemp e with read only;

update view_myemp set job = 'abc' where ename='S_MITH';

--13.序列
什么是序列?
类似于mysql主键自增,序列主要提供表中主键id去使用的
如何去使用序列?
create sequence 序列名称;--最简单的语法
--需求:为person表创建序列,并往表中插入数据进行测试
--创建序列
--为person这个表创建一个序列
drop sequence SEQ_PERSON;
create sequence SEQ_PERSON  --序列名称
minvalue 10000              --序列最小值
maxvalue 999999999999999999999999999 --序列最大值
start with 10000            --序列从1开始            
increment by 1              --每次增加1
cache 20;                   --缓存20
--使用
select SEQ_PERSON.NEXTVAL from dual;--下一个序列值
select SEQ_PERSON.CURRVAL from dual;--当前序列值
--在t_preson这个表中做测试
select * from t_person;
insert into t_person values(SEQ_PERSON.NEXTVAL,'小王7','1','123423423');
commit;
--总结
序列:
一般一个表对应一个序列


--14.索引
主要为了提高查询效率
索引:单列索引 复合索引
创建表的时候,主键约束和唯一约束会自动创建索引
语法
select * from t_person;
--单列索引
create index index_pname on t_person(pname);
--复合索引
create index index_pname_psex on t_person(pname,psex);
--总结:
1.数据量小的时候,建立索引没用
2.如果建立索引,对insert update delete影响

--15.测试索引
需求:往一个新建表中插入500万数据,在新建索引前后根据条件查询对比查询前后的时间
--第一步:新建一个表
create table mytest
(
       myid number(10) primary key,
       myname varchar2(50)
);
--第二步:往表中插入500万数据
--plsql语言
declare
--声明变量
begin
--DML语句
--循环插入500万数据
 for i in 1..5000000
   loop
     insert into mytest values(i,'测试数据'||i);
   end loop;
   commit;--提交数据
end
--第三步:查询测试(建立索引之前查询时间 )
select * from mytest where myname ='测试数据4911111';--建立索引之前查询时间 2.046s
--第四步:创建索引
create index index_myname on mytest(myname);--13秒创建索引
--第五步:查询测试(建立索引之后查询时间 )
select * from mytest where myname ='测试数据4911111';--建立索引之后查询时间 0.034s

--16.同义词 (比较少) 对象:scott.emp 表 视图 索引 等等

--可以使用其它用户下的对象
create synonym sp for  scott.emp;
select * from sp;
--删除同义词
drop synonym sp;
--缩短用户下的对象 名称
create synonym p for  t_person;
select * from p;
drop synonym p;

create synonym v for  VIEW_MYEMP;
select * from v;
drop synonym v;

--重点:视图 索引 序列 
--同义词(了解)

--17.导入导出
思考为什么要导出导入?
主要原因:数据库安全问题   dmp:二进制数据
需求:将scott用户下的所有表导入heima38用户下
导出:使用scott用户将数据导出
exp scott/tiger@192.168.226.10/orcl file='c:\data.dmp'
导入:使用heima38的用户将数据导入
imp heima38/heima38@192.168.226.10/orcl file='c:\data.dmp' full=y

猜你喜欢

转载自www.cnblogs.com/coder-wf/p/12199055.html