Oracle总结笔记(三)

一、自定义表:

1 . 数据类型:
I. 字符串:
char(n):固定长度的字符串,上限2000,最大长度为n,实际长度为n,其余使用空格填充 //默认长度为1
例如:char(5) ‘abcd’ 最大长度5,实际长度5,空格填充

varchar(n):可变长度的字符串,上限4000工业标准,支持空字符串,Oracle中使用varchar2(n),未来版本中可能无法向下兼容
例如:varchar(5) ‘abcd’ 最大长度5,实际长度4

varchar2(n):可变长度的字符串,上限4000,最大长度为n,实际长度存入的字节个数。//必须书写长度
例如:varchar2(5) ‘你好’ 最大长度5,实际长度4个字节

nvarchar2(n):可变长度的字符串,上限2000,最大长度为n,实际长度存入的字符个数。
例如:nvarchar2(5) ‘你好’ 最大长度5,实际长度2个字符

II. 数字:
integer:任意长度的整数,超过15位的整数会采用科学计数法,xE10^N。(只保留整数部分,忽略小数)

number / number(n) / number(n,m):用于描述整数+小数
例如:number 任意长度的小数
例如:number(n) 长度为n的整数
number(5) 1234
例如:number(n , m) 长度为n的整数+小数 (n最大取值为38)
number(5 , 2) 12.3 –> 12.30 //√ 1234 –> 1234.00 //×

III. 日期:
date:年、月、日、时、分、秒、星期,只精确到秒。
timestamp:年、月、日、时、分、秒、毫秒、时区。

IV. 大对象类型【了解】:
CLOB:存储大本文(字符)数据。
BLOB:存储大二进制数据(多媒体,最大上限4GB)。

  1. 约束:
    I. 主键约束:primary key 一行数据的唯一标识,此列的值不能为null,不可重复,数据不变的列适合作为主键,全表只能存在一个主键列。

II. 唯一约束:unique 一行数据的唯一标识,此列的值可以为null,不可重复,表中可以存在多个唯一列。

III. 非空约束:not null 此列必须有值。

IV. 检查约束:check 通过制定规则,约束此列的值必须满足某个条件。
//列:email,要求必须包含@zparkhr
check(email like ‘%@zparkhr%’)

//列:password,要求长度必须为6
check(password like ‘__‘)
check( length(password) = 6 )

//列:sex,要求必须录入’男’或’女’
check(sex in(‘男’,’女’))
check(sex = ‘男’ or sex = ‘女’)

//列:age,要求取值范围在1 ~ 253之间
check(age>= 1 and age<= 253)
check(age between 1 and 253)

V. 外键约束:foreign key 引用外部表的某个列,作为当前表某列的取值,约束此列值必须是引用表中已存在的数据,二者的数据类型必须相同。
语法:references 外部表表名(列名)
Oracle总结笔记(三)_第1张图片

3 . 建表【重点】:
I. 语法:
create table 表名(
列名 数据类型 [约束],
列名 数据类型 [约束],
…….
列名 数据类型 [约束] //最后一个列没有逗号
)

create table 表名( 列名 数据类型 [约束], 列名 数据类型 [约束], 列名 数据类型 [约束] )

II. 用例:
//创建班级表
班级编号 number(6) 主键
班级名称 varchar2(50) 唯一+非空

 create table t_class(
     class_id number(6) primary key,
     class_name varchar2(50) unique not null
 )

//创建学生表
学号 number(8) 主键
姓名 varchar2(20) 非空
性别 varchar2(2) 检查(F,M)
生日 date 非空
电话 varchar2(11) 唯一
邮箱 varchar2(80)
班级编号 number(6) 外键(班级表的班级编号)

create table t_student(
    student_id number(8) primary key,
    student_name varchar2(20) not null,
    sex varchar2(2) not null check(sex in('F','M')),
    borndate date not null,
    phone varchar2(11) check(length(phone) = 11),
    email varchar2(80),
    class_id number(6) references t_class(class_id)
)

//引用clazz表的clazz_id列的值作为外键,插入时约束学生的班级编号必须存在。
alter table t_student add clazz_Id integer; //添加列
alter table t_student add constraint pk_clazz_Id foreign key (clazz_Id) references t_clazz(clazz_Id); //添加外键约束

注意:删除表 drop table 表名(1.创建关系表时,先创建主表,再创建从表;2.删除关系表时,先删除从表,再删除主表)

二、数据操作:

1 . 插入:(insert):
I. 语法:insert into 表名(列1,列2,列3…) values(值1,值2,值3)
II. 详解:表名后的列名应与values后的值一一对应。
III. 用例:
//添加一条数据,到班级表中
insert into t_class(class_id , class_name) values(10,’ Java班’);

//添加一条数据,到学生表中
insert into t_student(student_id , student_name , sex , borndate , phone , email , class_id)
values(1001,’tom’,’M’,to_date(‘1995-1-1’,’yyyy-mm-dd’),’13888888888’,’[email protected]’,10);

//省略列名
insert into t_student values(1004,’annie’,’F’,to_date(‘1995-1-1’,’yyyy-mm-dd’),’13988887777’,null,30);
注意:值的顺序和个数必须和列的定义相同,允许为空的值,使用null填充

2 . 修改(update):
I. 语法:update 表名 set 列1 = 新值1 , 列2 = 新值2 where 条件
II. 详解:set后跟随多个 “列 = 值”,绝大多数情况下伴有where条件。
III. 用例:
//修改tom的手机号码为13333333333
update t_student set phone = ‘13333333333’ where student_name = ‘tom’;

//修改1002同学的电话为13900000000,邮箱为[email protected]
update t_student set phone = ‘13900000000’ , email = ‘[email protected]’ where student_id = 1002;

//修改班级名称为“Java班”的班级编号为20
update t_student set class_id = 20
where class_id = (select class_id from t_class where class_name = ’ Java班’)

3 . 删除:(delete):
I. 语法:delete from 表名 where 条件
II. 详解:删除表中满足where条件的数据
III. 用例:
//删除学号为1004的学生信息
delete from t_student where student_id = 1004;

//删除名字为jack的男同学
delete from t_student where student_name = ‘jack’ and sex = ‘M’;

//删除班级名称为“Java班”,并且邮箱为空的学生信息
delete from t_student
where email is null and
class_id = (select class_id from t_class where class_name = ’ Java班’);

–删除班级编号为10的班级信息
–先删从表(数据没有依赖)
delete from t_student where class_id = 30;

–再删主表(被引用的数据行)
delete from t_class where class_id = 30;

4 . 约束补充:联合主键、联合唯一、联合约束
问题:约束一位同学在一门科目中,只能有一个成绩
Oracle总结笔记(三)_第2张图片
解决:将学生ID和科目名称作为联合主键

create table t_score(
    student_id number(8) references t_student(student_id,
    subject_name varchar(score between 0 and 100),
    primary key (student_id , subject_name)
)

三、事务【重点】:

Oracle总结笔记(三)_第3张图片
银行账户表:t_account(cardNo , password , balance , …)
A账户(6222020200001234567)给B账户(6222020200007654321)转账1000

update t_account set balance = balance - 1000 where cardNo = ‘6222020200001234567’;
–断电、宕机
update t_account set balance = balance + 1000 where cardNo = ‘6222020200007654321’;

1 . 事务的概念:
事务是一个原子操作,可以由多条SQL组成,所有的SQL全部成功,则整个事务成功,其中有任何一条SQL失败,则整个事务失败。

2 . 事务的边界:
I. 开始:
1). 一个新的连接建立(打开一个新的客户端)。

2). 上一个事务结束后的第一条增、删、改语句。

II. 结束:
1). 提交:
a. 显示提交:commit;
b. 隐式提交:create、drop、正常退出

2). 回滚:
a. 显示回滚:rollback;
b. 隐式回滚:非正常退出(断电、宕机)

3 . 事务的原理:
数据库会为每个客户端私有的维护一个回滚段(缓存),一个客户端的所有增删改语句,都存入回滚段中,只有当所有的操作均执行成功时,提交事务(commit),才会真正将数据更新到数据库中;如果其中的任何一步操作发生了问题,可以回滚事务(rollback),清空回滚段,取消当次操作。

4 . 生产环境:基于增删改语句的操作结果(受影响行数)进行逻辑判断或异常处理决定是否提交事务、回滚事务。

5 . 事务的特性:(ACID)
I. 原子性(Atomic):同一个事务中的所有SQL被视为一个整体,要成功都成功,有一个失败,都失败。
II. 一致性(Consistency):事务操作开始,事务操作的结束,数据库中的数据是一致的。
III. 隔离性(Isolation):事务与事务之间各自独立,互不影响。
IV. 持久性(Durability):事务提交后,对数据库的操作影响是持久的。

四、操作优化:

1 . 序列【重点】:
I. 语法:create sequence 序列名 [参数] ;
II. 详解:用来生成一组自动增长的整数值。
III. 参数:
start with //起始值
increment by //递增值
minvalue //最小值
maxvalue //最大值
cycle //是否循环生成
cache //缓存,一次性访问数据库所获取到的序列值
order //保证获取顺序

IV. 用例:
//获取下一个值(生成一个新值)
select xxx_seq.nextval from dual;

//获取已生成的当前值
select xxx_seq.currval from dual;

//使用序列作为数据的主键生成器
insert into t_student values(student_seq.nextval,’eric’,’M’,to_date(‘1995-1-1’,’yyyy-mm-dd’),’13988887777’,null,20);

//删除序列
drop sequence xxx_seq

2 . 视图:
I. 语法:create view 视图名 as select …
II. 详解:保存SQL语句的虚表,简化查询。(如同Java中的方法)
III. 用例:
//封装学生表视图,便于查询。
create view stu_v as select s.student_id , student_name , sex , borndate , phone , email , class_name , subject_name , score
from t_student s left join t_class cl
on s.class_id = cl.class_id
left join t_score sc
on sc.student_id = s.student_id

注意:视图不会独立存储数据,原表发生改变,视图查询结果也会改变。查询方便,效率没有任何提高。
drop view xxx_v; //删除视图
grant create view to hr; //授予权限
revoke create view from hr; //撤销权限

3 . 索引:
I. 语法:create index 索引名 on 表(列)
II. 详解:索引类似于字典目录,加快数据查询效率。
III. 用例:
//为employees表的salary字段增加索引
create index EMP_SALARY_IX on employees(salary); //Oracle自动使用查询引擎检索,自动优化。

注意:
1). 查询频率较高的列。
2). 索引需要独立维护,不代表越多越好。
3). 主键、唯一键自动添加索引。
4). drop index xxx_ix

五、SQL(Structured Query Language):

1 . 数据查询语言DQL(Data Query Language):select、where、group by、order by、having
2 . 数据操作语言DML(Data Manipulation Language):insert、delete、update
3 . 数据定义语言DDL(Data Definition Language):create、drop、alter
4 . 事务处理语言TPL(Transaction Process Language):commit、rollback
5 . 数据控制语言DCL(Data Control Language):grant、revoke

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