目录
一、Oracle
关系型数据库
通常情况下,数据库和实例是一对一的
一个数据库可以对多个实例
多个实例之间可以通过网络来进行数据的一个交互或
实例
实例=进程+内存结构
逻辑划分的内存结构和进程结构
随着数据的关闭而消失
数据库
物理文件
永久存在
实例就是类似于一个命令请求,数据库只要调入到实例包括的内存和进程中,才
二、结构
存储
包括控制文件、数据文件、日志文件等文件
select * from v$datafile; --查看数据文件
表空间是由一个或多个数据文件组成的
多个表空间之间的数据文件不是交互的
而数据库是由一个或多个表空间组成
select * from v$logfile; --查看日志文件 .LOG
用来记录数据库的变化,对数据库的所有操作,可以通过日志看到。
select * from v$controlfile;
是Oracle服务器在启动期间用来标识物理文件和数据结构的二进制文件。
/*数据文件的位置及大小
日志文件的位置和大小
数据库名称以及创建时间、日志序列号。*/
select * from v$tablespace; -- 查看表空间
-- 查询表空间与数据文件对应关系
select tablespace_name,bytes,file_name from dba_data_files;
--bytes 大小
--file_name 文件路径
/*
SYSTEM 系统表空间
UNDOTBSI 重做表空间
SYSAUX 辅助系统表空间
USERS 用户的表空间
TEMP 临时表空间
*/
内存
包括系统全局区和程序全局区
内存也是影响数据库性能的第一因素
系统全局区SGA:是所有用户都可以访问的共享内存区域。--系统全局区的东西属于公共资源呢
程序全局区PGA:为单独的服务器进程存储私有数据的内存区域--程序全局区的东西是有主的,是私有的
/*
排序区:存储order by、group by包含排序操作的sql语句所产生的临时数据,因为排序并没有修改表本身。
会话区:存储会话所具有的权限、角色、性能统计信息。利用session来判断改用户是否具有某些权限。
游标区:保存执行带有游标的语句所产生的临时数据。
堆栈区:存储会话中的变量以及sql语句在运行时的内存结构信息。
*/
进程
包括前台进程和后台进程。
单进程实例和多进程实例
用户进程和Oracle进程
Oracle进程又可以分为:服务器进程和后台进程。
用户进程
就是当用户运行应用程序时,操作系统会为用户运行的应用建立一个进程。
服务器进程
用于处理连接到该实例的用户进程的请求。
后台进程
是在实例启动时启动,启动Oracle数据库的实例时会自动启动后台进程。
三、创建表空间和用户
创建表空间
创建表空间:
create tablespace name
datafile '表空间文件路径'
size 1G autoextend on next 100M maxsize unlimited;
/*
name:表空间名称
datafile:指定表空间文件(一般指向oracle安装根目录下oradata/数据库实例名/.dbf)
size 1G:指定表空间文件的初始大小 G、M、K
autoextend on next 100M:autoextend表示表空间大小自动扩展
on next 100M 每次表空间满了之后年扩展的100m
maxsize unlimited:maxsize指定表空间的最大存储值
unlimited 不限制表空间的最大值
*/
临时表空间
创建临时表空间语法:
create temporary tablespace name
tempfile '表空间文件路径'
size 1G autoextend on next 100M maxsize unlimited;
/*
temporary:关键字
tempfile:指定临时表空间文件
*/
修改
--修改表空间 autoextend
ALTER DATABASE
DATAFILE '文件路径' AUTOEXTEND
ON NEXT 200M MAXSIZE 2G
--修改原有的数据文件大小 resize
alter database datafile '文件路径' resize 100M;
--为表空间增加新的数据文件
alter tablespace 表空间名 add datafile 数据文件 size 大小
用户
创建用户语法:
create user name
default tablespace tablespace_name temporary tablespace temptablespace_name identified by password;
/*
name:用户名
default tablespace tablespace_name:指定用户的默认表空间
temporary tablespace temptablespace_name:指定用户的默认临时表空间,
identified by password 指定用户的密码
password用户密码
*/
修改用户
alter user user_name
default tablespace tablespace_name temporary tablespace temptablespace_name identified by password;
删除
删除用户
drop user user_name;
删除表空间
drop tablespace tablespace_name;
删除表空间的同时删除数据文件
drop tablespace 表空间的名字
including contents and datafiles
四、权限
权限指的是执行特定命令或访问数据库对象的权利
系统权限和对象权限
系统权限
GRANT UNLIMITED TABLESPACE TO test1; --此系统权限允许test1用户任意使用表空间
对象权限
GRANT ALL ON SCOTT.EMP TO test1; --允许用户插入、删除、更新和查询 EMP 表中的记录
GRANT CONNECT TO test1; --CONNECT角色允许用户连接至数据库,并创建数据库对
GRANT RESOURCE TO test1; --RESOURCE角色允许用户使用数据库中的存储空间
GRANT CREATE SESSION TO test1; --此系统权限允许用户连接到数据库上
给用户赋权限
grant connect,resource to test1;
查看当前用户的权限
select * from user_sys_privs;
revoke 收回权限
五、创建表
create table 表名(
列名(字段名) 数据类型 约束 默认值,--约束、默认值都是可以省略的
列名 数据类型 约束 默认值,
列名 数据类型 约束 默认值,
...
表级约束 --可选
)tablespace 表空间名;
一般以字母开头,可以有_、数字、$等,长度不能超过30个英文字符;
表空间名是可省略的,默认表会保存到用户的默认表空间中
也可以加上,表示指定将表存入某个表空间;
create table student(
id number(11),
name varchar2(20),
age number(3),
cid number(11)
);
修改表名
ALTER TABLE a RENAME TO b;
查看表结构
desc student;
删除表:
drop table 表名;
--数据备份
create table 表名 as select语句;
create table student as select * from student_aa;
六、约束
行级约束
建表时跟在字段定义后面,约束当前行定义的列的约束叫做行级约束
表级约束
建表时写在所有字段定义之后的约束,它可以约束某个列或者多个列
1.not null 非空约束
这个列的值不能为空
列名 数据类型 not null --行级约束语法
!!not null是唯一个行级约束,不能写成表级约束!!
2.unique 唯一约束
这个列的值在整个表的数据中,是唯一的不可重复
列名 数据类型 unique --行级约束语法
constraint 约束名 (康死追克)unique(列名) --表级约束,在所有列定义之后
3. primary key 主键约束
--primary key = not null + unique
这个列的值不能为空且不能重复
列名 数据类型 primary key --行级约束语法
constraint 约束名 primary key(列名) --表级约束
在表级约束中,如果有多个列时,表示这几个列为联合主键
4. foreign key 外键约束
这个列的取值,只能在主表的主键列的值中去取
列名 数据类型 references 主表名(主表主键列) --行级约束语法
create table student(
id number(7) primary key, --主键约束
name varchar2(30) not null, --非空约束
age number(7),
cid number(7) references class(cid) --外键约束
);
constraint 约束名 foreign key(外键列) references 主表名(主表主键列) --表级约束
--表级约束,在所有列定义之后
--constraint pk primary key(id)
5.check 检查约束
表示这个列的取值要满足check后面的约束条件
列名 数据类型 check(约束条件) --行级约束
create table student(
id number(11) primary key, --id非空且唯一
name varchar2(30) not null, --name非空
age number(3) check(age>0 and age<150), --age 0-150之间
sex varchar2(2) default '男' check(sex in ('男','女')), --默认男,男女两个选项
pwd varchar2(20),
constraint st_pwd check(length(pwd)>8) --pwd长度大于8
);
constant 约束名 check(约束条件) --表级约束
修改表和约束
1.给表添加一个列
alter table 表名 add 列名 数据类型 [约束] [default 默认值];
alter table student add birthday date;
2.删除表中的一个列
alter table 表名 drop column 列名;
alter table student drop column pwd;
3.修改一个列
alter table 表名 modify 要修改的列名 数据类型 [约束] [default 默认值];
alter table student modify age number(5) not null ;
Mysql:
alter table stu change name sname varchar(10); --修改字段名
alter table stu modify sname int; --
修改列时
如果列有数据,不能直接修改列的数据类型
只能把它长度增加,但不能减少
alter table 表名 modify 列名 数据类型 not null; --给一个列添加not null 约束
alter table 表名 modify 列名 数据类型 null --给一个列去掉非空约束
4.增加一个约束
alter table 表名 add 表级约束语法;
alter table 表名 add constraint 约束名 unique(列名)
alter table 表名 add constraint 约束名 primary key(列名[,列名])
alter table a11 add constraint pk1 primary key (id)
alter table 表名 add constraint 约束名 foreign key(外键列) references 主表名(主表主键列)
alter table b2 add constraint fk_b1 foreign key(id) references b1(id)
alter table 表名 add constant 约束名 check(约束条件)
alter table b3 add constraint jk_b3 check(id>18)
5.删除一个约束
alter table 表名 drop constraint 约束名;
表级约束有名字,行级约束系统会给分配一个名字sys_
七、注释 comment
给表加注释
comment on table 表名 is '注释';
comment on column 表名.列名 is '注释';
comment on column student.id is '主键';
八、增删改
插入语句
insert into 表名(列名...) values(值...);
insert into student(id, name) values(1,'tom');
insert into student values(2,'amy',);
--从已有的数据库表中查出数据并插入另一个表
--insert into 表名(列名,列名,...,列名) select子查询
修改语句
update 表名 set 列名=值,列=值,...,列值 where 条件;
update student set name='aa' where id=1;
--将s001学生的c001课程成绩改为该课程的平均成绩
update sc set score=(select avg(score) from sc where cno='c001') where sno='s001' and cno='c001';
删除语句
delete [from] 表名 where 条件;
delete from student where id=1;
注意:delete语句执行前一定要检查where条件,最好备份
delete 删除表数据,保留表结构
truncate table 表名; --删除表中所有数据,保留表结构
drop table 表名 --删除表结构和数据;
delete,truncate的区别
- truncate 语句不能带where 条件,删除表中所有数据,不记录日志,执行效率高
delete可带where 条件 可以删除部分数据,也可以删除所有数据,它删除时,会记录日志 - truncate:DDL操作,执行后无事务产生,不可回滚。
delete:DML操作,执行后产生事务,可回滚,数据存放到rollback segment。 - truncate:只能删除表,不可以操作视图
delete:可以删除表和视图。 - truncate 的速度远快于delete
truncate table 表名 速度快,而且效率高
当执行delete操作时所有表数据先被copy到回滚表空间,truncate 是直接删除数据不进回滚表空间。
truncate 使用的系统和事务日志资源少。
delete 每次删除一行,并在事务日志中为所删除的每行记录一项。 - 不能truncate一个有外键的表,truncate不能触发delete的触发器,而delete 会正常触发。
- Truncate 操作会重置表的高水位线(High Water Mark),而delete 不会。
九、rowid
oracle数据库的表中的每一行数据都有一个唯一的标识符 = 身份证
rowid为该表行的唯一标识
该值表明了该行在oracle数据库中的物理具体位置。
包含着数据对象编号,对应文件编号, 块编号和 行编号的信息。
使用rowid可以去除重复记录
select t.*,rowid from student t
DELETE FROM EMP E WHERE E.ROWID > (SELECT MIN(X.ROWID)
FROM EMP X WHERE X.EMP_NO = E.EMP_NO);