/*
Oracle体系结构:
1、一台计算机只有一个Oracle的数据库
2、一个数据库可以有多个实例: orcl
3、一个实例下可以有多个表空间 : 存储数据的逻辑单位
1)一个表空间可以由 多个 数据文件【dbf\ora】组成
2)一个表空间中可以 有 多个用户
4、一个用户只能从属于一个表空间
创建表空间:
create tablespace 表空间名称
datafile 'c:\test.dbf' 数据文件的位置
size 50m 初始化大小
autoextend on 开启自动扩展
next 30m ; 下一次扩展的大小
*/--创建表空间需要dba的权限:切换到 system 管理员create tablespace itheima87
datafile 'c:\itheima87.dbf'size500m
autoextend onnext300m;--===============================创建用户-- 用户名 密码 所存放的表空间createuser yunbing identified by yun123 default tablespace dyb;--创建了用户 还登录不了,必须授权/*
Orale中:默认有三种角色
connect: 链接权限
resource: 开发者权限
dba: 管理员权限
授权使用dba角色去授权:
grant connect,resource to yunbing;
撤销:
revoke connect,resource from yunbing;
*/grant dba to yunbing;--==========================Oracle数据类型-- ======字符串
char : 定长 name char(10) : johnny 占用十个字符,6个字符+4个空
varchar2 : 变长 name varchar(10) : johnny 占用六个
long : 存储2G字符串
-- ======数字
number(v1,p1): v1 : 是整个数字的总长度; p1:小数位数,省略p1,就是整数
--小数
number(3,2) : 最大值:9.99
--整数
number(3) : 最大值:999
-- ======日期
date : 精确到时分秒,类似mysql :datatime
timestamp: 精确到秒的后9位 ,用于秒杀场景
-- ======大数据类型
blob : 存储4G的二进制文件
clob : 存储4G的字符串
--================================创建表与修改表createtable person (
id number(10),
name varchar2(200)
);-- 加一列altertable person add address01 varchar2(300);-- 改变列altertable person modify address01 varchar2(500);-- 改变列名altertable person rename column address01 to address;-- 删除列altertable person dropcolumn address;--=========================================约束:--=================主键约束:包含非空和唯一约束droptable person;createtable person(
id number(10) primarykey,
name varchar2(200),
gender number(1) default1
);--插入数据insertinto person(id,name,gender) values (1,'纯情小飞飞',1);commit;--下面的数据插入不了insertinto person (id,name,gender) values (1,'纯情小鸭鸭',1);insertinto person (id,name,gender) values (null,'纯情小鸭鸭',1);commit;--========================非空和唯一约束droptable person;createtable person(
id number(10) primarykey,
name varchar2(200) notnullunique,
gender number(1) default1
);--插入数据insertinto person values (1,'纯情小狼狗',1);commit;--下面两条数据插入不了insertinto person values(2,'纯情小狼狗',2);insertinto person values(2,null,2);commit;--================检查约束droptable person;createtable person(
id number(10) primarykey,
name varchar2(200) notnullunique,
gender number(1) default1check(gender in(1,2))
);--插入值insertinto person values (1,'纯情小空空',1);commit;--下面的值插入不了,性别只能是 1 和 2insertinto person values (2,'纯情小塔塔',3);commit;select * from person;--========================外键约束/*
订单: 主表
订单项: 从表 外键在这里,外键的值来源于主表的主键,如果没有定义非空约束,可以插入空值
*/--主表createtable orders(
order_id number(10) primarykey,
price number(10,2),
create_date date
);--创建从表createtable orders_item(
item_id number(10) primarykey,
item_name varchar2(200),
itme_order_id number(10),
constraint fk_order_id foreignkey(itme_order_id) references orders(order_id)
);--插入数据:一般先有主表的数据,再插入从表的数据--插入主表数据insertinto orders(order_id,price,create_date) values (1,9999.85,sysdate);commit;--插入从表数据insertinto orders_item(item_id,item_name,itme_order_id) values (1,'VIVO:油光双摄照亮你的美',1);commit;insertinto orders_item(item_id,item_name,itme_order_id) values (2,'OPPO:开发5分钟,调bug两小时',null);commit;--下面的数据插入不了 : 外键 2 在主表中没有记录insertinto orders_item(item_id,item_name,itme_order_id) values (3,'小米:为发烧而生',2);commit;--删除值:先删除从表数据,再删除主表数据deletefrom orders_item where item_id = 1;deletefrom orders where order_id = 1;--删除表:先删除从表,再删除主表droptable orders_item;droptable orders;--级联删除表:我们可以直接删除主表,去除外键的约束droptable orders cascadeconstraint;--========================级联删除表中的数据:【慎用】删除主表中的数据,级联删除从表的数据--主表createtable orders(
order_id number(10) primarykey,
price number(10,2),
create_date date
);--创建从表droptable orders_item;createtable orders_item(
item_id number(10) primarykey,
item_name varchar2(200),
itme_order_id number(10),
constraint fk_order_id foreignkey(itme_order_id) references orders(order_id) ondeletecascade
);--插入主表数据insertinto orders(order_id,price,create_date) values (1,9999.85,sysdate);commit;--插入从表数据insertinto orders_item(item_id,item_name,itme_order_id) values (1,'VIVO:油光双摄照亮你的美',1);commit;insertinto orders_item(item_id,item_name,itme_order_id) values (2,'OPPO:开发5分钟,调bug两小时',1);commit;--级联删除主表数据【慎用】deletefrom orders where order_id = 1;commit;select * from orders;select * from orders_item;select * from person;
DML语句:
DML语句: insert 、update 、delete
--插入
insertinto person (id,name,gender) values (2,'贝吉塔',1);commit;--更新update person set name ='特兰克斯',gender=2where id = 2;commit;--删除deletefrom person where id=2;commit;--删除全表数据deletefrom person;-- 删除所有数据,这种方式会产生数据碎片,好处:可以回滚truncatetable person ;-- 先摧毁表结构,再重新创建表:效率高,不会产生碎片,弊端:不能回滚select * from person;
事物:
/*
事务:逻辑上的一组操作,要么全部成功,要么全不成功【失败】
事务的四大特性: ACID 【原子性、一致性、隔离性、持久性】
如果不考虑隔离性会出现读的问题:
脏读:
不可重复读:
幻读(虚读):
在Oracle中:支持三种事务:
Oracle 支持的 3 种事务隔离级别: READ COMMITED, SERIALIZABLE, READ ONLY
Oracle 默认的事务隔离级别为: READ COMMITED
Oracle中保存点: savepoint
设置了保存点,当回滚到保存点的时候,保存点之前的数据正常提交,保存点之后的数据回滚
*/insertinto person (id,name,gender) values (1,'樱木',1);savepoint s1;insertinto person (id,name,gender) values (2,'三井寿',2);rollbackto s1;commit;select * from person;
试图:
/*
视图:一般用于查询的,可以封装一些复杂的sql、屏蔽掉一些敏感数据
细节:
1)视图它本身不存储数据,真正的数据都在表中
2)创建视图需要dba的权限
创建视图语法:
create [or replace] view 视图的名称 as 查询语句;
*/--用scott来创建视图,他没有创建的权限,先授权grant dba to scott;--创建视图:createview v_emp asselect * from emp;--查询select * from v_emp;--更新视图中的数据: 更新的是表中的数据,视图自己不存储数据update v_emp set ename='smith'where empno = 7369;commit;--查询emp表:select * from emp;--=====作用:--1)封装复杂的sql : 查询部门的平均工资 createview v_dept_avg_sal asselect deptno,round(avg(sal),2) as davg
from emp
groupby deptno;--查询视图 : 如果是复杂的sql视图不能更新操作:update、deleteselect * from v_dept_avg_sal;--2)屏蔽一些敏感数据createview v_emp2 asselect empno,ename,mgr,job,hiredate,deptno from emp;--查询视图:select * from v_emp2;
/*
索引: 为了提高查询效率存在的
语法:
单列索引:create index 索引名称 on 表名(列名);
复合索引:create index 索引名称 on 表名(列名1,列名2......);
索引的使用规则:
1、在数据量大的表中使用索引,百万级
2、在查询比较多的表中使用索引
3、在增删改比较多的表中,慎用索引,原因:插入或者删除数据的时候,要重构索引树
4、复合索引的使用有优先索引列: create index 索引名称 on 表名(列名1,列名2);
select * from 表名 where 列名1=? and 列名2=? --触发索引
select * from 表名 where 列名1=? or 列名2=? --不会触发索引
select * from 表名 where 列名2=? and 列名1=? --不会触发索引
select * from 表名 where 列名2=? or 列名1=? --不会触发索引
*/--演示有索引和没有索引的查询时间: 使用 yunbing 用户插入一百万条数据--删除persondroptable person;createtable person(
id number(10) primarykey,
name varchar2(200),
gender number(1) default1
);--插入一百万条数据: 用到明天的知识:plsql语法--创建序列create sequence seq_person_id;--使用oracle的uuid的函数来生成名称select sys_guid() from dual;--plsql语法
declare
pname varchar2(200);
beginfor i in1..1000000 loop
select sys_guid() into pname from dual;insertinto person (id,name,gender) values (seq_person_id.nextval,pname,1);end loop;commit;end;selectcount(*) from person;--没有索引的查询时间 -- 0.406秒select * from person where name = 'F8894BC158E145CD9B90E519499D8499';--创建索引create index index_person_name on person(name);--有索引的查询时间 -- 0.031select * from person where name = '373AB00B541842BC950C49E84E1B0FC8';
同义词:
/*
同义词: 在另外一个用户下去使用其他用户的表,跨用户使用表,一般不使用
语法:
create synonym 同义词名称 for 其他用户名称.表名
权限:
需要dba权限
*/create synonym semp for scott.emp;select * from semp;