----数据库【地球】---实例【国家】---表空间【省市县】
----dbf数据文件中【实体的东西】----用户
---用户具有不同的角色【角色类似于现实中的官职】
---角色越大权限就越多
-----创建新的表空间
create tablespace lyf datafile 'c:\lyf.dbf' size 100m autoextend on next 10m;
----删除表空间
drop tablespace lyf;
----删除表空间连带删除数据文件
drop tablespace lyf including contents and datafiles;
----创建用户
create user root identified by "123456" default tablespace lyf;
----密码是数字,必须使用""
----dba,CONNECT【可以链接数据库,做一些简单的增删改】,
------RESOURCE【可以创建视图,索引,序列,存储过程等等】
select * from role_sys_privs;--查询当前用户的角色
----给root授权
grant dba to root;
----切换到root用户下
create table person(
pid number(10),
pname varchar2(10)
);
----修改表结构
---添加一列
alter table person add (gender char(1));
---修改列的类型
alter table person modify gender number(1);
---修改列名
alter table person rename column gender to sex;
---删除一列
alter table person drop column sex;
---插入数据
select * from person;
insert into person (pid, pname) values (1, '小马');
commit;
----修改数据
update person set pid=2 where pname='小马';
commit;
-----三种删除
delete from peson;--删除表中全部数据
drop table person;---删除表结构
----如果数据量大的化用truncate table person删除数据效率高。
truncate table person;--先摧毁表结构,再次创建表,效果等于删除表中全部数据
------主键约束【唯一,非空】
create table person(
pid number(10) primary key,
pname varchar2(10)
);
---自定义主键约束的名称
create table person(
pid number(10),
pname varchar2(10),
constraint pk_person primary key(pid)
);
insert into person values (1, '小花');
commit;
-------非空约束,唯一约束
create table person(
pid number(10),
pname varchar2(10) not null unique,
constraint pk_person primary key(pid)
);
insert into person values (2, '小花');
commit;
----在创建主键约束和唯一约束的时候,会自动给我们创建一个同名的【唯一】索引
----检查约束【了解】
create table person(
pid number(10),
pname varchar2(10) not null unique,
gender number(1) check(gender in(0,1,2)),
constraint pk_person primary key(pid)
);
insert into person values (1, 'a', 3);
commit;
-----外键约束
----创建主表
create table orders(
orders_id number(10),
orders_name varchar2(20),
constraint pk_orders_id primary key(orders_id)
);
----创建从表
create table orders_detail(
orders_detail_id number(10),
orders_detail_name varchar2(20),
orders_id number(10),
constraint pk_orders_detail primary key(orders_detail_id),
constraint fk_orders_detail foreign key(orders_id) references orders(orders_id)
)
------插入数据的时候,必须先在主表中插入数据
insert into orders values (1, '牛肉');
commit;
insert into orders_detail values (1, '萝卜', 1);
commit;
select * from orders;
select * from orders_detail;
------删除数据先删从表,再删主表数据
delete from orders_detail;
commit;
delete from orders where orders_id=1;
commit;
-------删除表的时候,不能先删主表
drop table orders;
-------删除表的时候,不能先删主表,但是可以强制删除主表【不推荐】
drop table orders cascade constraint;
-----再次创建主表,之前的主外键关系消失,
-----如果想再次建立主外键关系,必须把从表也再次创建。
create table orders(
orders_id number(10),
orders_name varchar2(20),
constraint pk_orders_id primary key(orders_id)
);
----创建从表的时候,在外键约束的后面加上on delete cascade。
-----就可以实现级联删除
-----级联删除:删除主表数据,对应外键的数据都删除。
create table orders_detail(
orders_detail_id number(10),
orders_detail_name varchar2(20),
orders_id number(10),
constraint pk_orders_detail primary key(orders_detail_id),
constraint fk_orders_detail foreign key(orders_id) references orders(orders_id) on delete cascade
)
---级联删除
delete from orders where orders_id=1;
commit;
-----事务保存点
------要在复杂业务操作的时候,在核心业务之后加事务保存点。
insert into person values (1, 'a', 1);
insert into person values (2, 'b', 0);
commit;
select * from person;
update person set pname='c' where pid=1;
savepoint a1;
update person set pname='d' where pid=2;
rollback to a1;
commit;
-------多线程操作的时候,会产生一系列的问题:
--脏读:T线程读到了其他线程没有提交的数据。
--不可重复读:T线程读到的数据,被其他线程修改了。【锁行】
--幻想读:T线程按照条件查询的时候,其他线程插入或者删除了满足条件的数据。
----------导致了T线程前后查询数据的数量不一致。【锁表】
---【悲观锁,乐观锁】
--sql官方提供四种解决上面问题的方案【四种事务隔离级别】
--序列化【串行化】:脏读,不可重复读,幻想读都不允许
------------------永远单线程,永远线程安全,但是效率低。
--可重复读:允许幻想读
-----------在T线程正在操作的时候,其他线程可以进来。但是只能做增删操作。
--读取已提交:允许幻想读,不可重复读
-----------在T线程正在操作的时候,其他线程可以进来。可以做增删改操作
-------------但是事务不提交,其他线程看不见T线程操作后的数据。
--读取未提交:允许幻想读,不可重复读,脏读
------------在T线程正在操作的时候,其他线程可以进来。可以做增删改操作
-------------但是事务不提交,其他线程可以看见T线程操作后的数据。
----oracle中支持序列化,可重复读,读取已提交三种事务隔离级别
----oracle中默认事务隔离级别为:读取已提交
----mysql中中支持序列化,可重复读,读取已提交,读取未提交四种事务隔离级别
----mysql中默认事务隔离级别为:可重复读
----跨用户查询其他用户下的表
select * from scott.emp;--数据还在scott用户下
----同义词:方便跨用户查询【数据还在scott用户下】
create synonym s_emp for scott.emp;
select * from s_emp;
----跨用户赋值表,select查询创建表。
create table emp as select * from scott.emp;
select * from emp;
-----jeecg开源的项目框架,可以直接做crm,erp,oa。
----创建视图view
----视图:只是提供了一个查询的窗口,本身不存放数据,所有数据都来源于原表
create view v_emp01 as select e.ename, e.job from emp e;
---查询视图
select * from v_emp01;
---修改视图【不推荐】
update v_emp01 set job='CLERK' where ename='ALLEN';
commit;
select * from emp;
----创建只读视图
create view v_emp as select e.ename, e.job from emp e with read only;
update v_emp set job='CLERK' where ename='WARD';
commit;
-----序列:给表的主键做自增用的。永远自增,不会回头
create sequence seq_person;
select seq_person.nextval from dual;
insert into person values (seq_person.nextval, 'k', 0);
commit;
select * from person;
-----索引:大幅度提高查询效率,但是会影响增删改的效率。
----首先创建一个person表,在里面插入5000000条数据。
create table person(
pid number(20),
pname varchar2(20)
);
----在里面插入5000000条数据。
declare
begin
for i in 1..5000000 loop
insert into person values (seq_person.nextval, 'abc'||i);
end loop;
commit;
end;
-----单列索引
select * from person where pname='abc22383';---1.328s
---在pname上创建索引
create index idx_person on person(pname);
---再次查询
select * from person where pname='abc22383';---0.047s
select * from person where pname like '%abc223%';--索引不触发。
----复合索引
create index idx_emp on emp(ename, job);---创建复合索引
------复合索引要触发必须有优先检索列【第一列为优先检索列】
select * from emp where ename='WARD' and job='xx';---触发
select * from emp where ename='WARD';---触发
select * from emp where job='xx';--不触发
select * from emp where ename='WARD' or job='xx';--不触发
----主键约束和唯一约束会自带同名索引。
----自己创建的索引可以直接删除,但是主键约束和唯一约束自带的索引不能直接删除
----如果要删除主键约束和唯一约束自带的索引,就必须把对应约束删掉。
-----按照用户导出数据
exp system/orcl owner=scott file=c:\scott.dmp
-----按照用户导入数据
imp system/orcl file=c:\scott.dmp fromuser=scott touser=itheima
-----按照表导出数据
exp itheima/itheima file=c:\emp.dmp tables=emp
-----按照表导入数据
imp itheima/itheima file=c:\emp.dmp tables=emp