表操作语句
约 1356 字大约 5 分钟
2025-04-10
一、数据类型
1. 数值类型 number(p,s)
p 代表 有效位数,从左第一个不为0的数算起
s代表 小数位
2. 字符类型 varchar2
nvarchar2
varchar2(1) 1字节 男 存不了
nvarchar2(1) unicode编码 男.length() ==1
面试题:varchar2(1) nvarchar2(1) 哪个能存汉字
3. 日期类型 date
timestamp
date 最常用的日期类型,它可以保存日期和时间
timestamp 不仅可以保存日期和时间,还能保存小数秒,小数位数可以指定为0-9,默认为6位
4. 文件类型 clob
blob
clob (character large object 大文件) : clob对象包含一个指向 SQL CLOB 数据的逻辑指针而不是数据本身
blob (binary large object 大文件) : 单条存储4G 以内的文件 BLOB常常是数据库中用来存储二进制文件的字段类型 , 典型的BLOB是一张图片或一个声音文件
二、表操作
1. 创建表
create table XXXX.person(
pid number(11),
pname varchar2(64),
gender number(1), -- 0代表女,1代表男
birthday date
)
2. 表修改
alter table XXXX.person add( --添加字段
address nvarchar2(512)
)
3. 删除表
3.1. 先复制表 , 约束不会复制
create table XXXX.p1 as select * from XXXX.person;
3.2. 删除表
drop table XXXX.p1
4. 修改表
alter table XXXX.person modify(name varchar2(128));
三、添加约束
1. 约束是把双刃剑
降低数据灵活性,慎用,数据的约束应该在service层
2. 主键约束 : 非空且唯一
alter table XXXX.person add constraint pk_pserson_pid primary key(pid);
3. 非空约束 : 字段不能为null
alter table XXXX.person modify( name varchar2 (128) not null)
4. 唯一约束 : 不能重复
alter table XXXX.person modify (name varchar2(128) unique)
5. 检查约束 : 检查某个字段的值是否符合要求
alter table XXXX.person add constraint ck_person_gender check( gender in (0,1))
6. 外键约束 : 主键表和外键表的数据约束
alter table [外键表] add constraint fk_od_orderid foreign key (order_id) reference orders(order_id);
四、序列
1. 创建序列
create sequence seq_person (
start with 4
increment by 1
maxvalue 99999999999
minvalue 4
nocycle --序列用完,正常报错,不重复 (sycle 重复,违反了主键唯一)
nocache oracle --会每次缓存20 ,关闭就连续存储了
)
-- 表没有直接简写
create sequence seq_tb nocycle nocache; --默认起始1 自增1
2. 使用序列
insert into person values (
seq_person.nextval ,
... ,
... ,
... ,
...
)
五、删除表数据
1. delete
--效率低,检查点进程会进入事务模式,将其备份
delete from p1;
2. truncate
truncate table p1;
注意
快但是危险,直接删除相关的物理结构,然后创建
同样危险的还有 update 没有加 where 条件筛选
六、事务
1. 提交
2. 回滚
3. 保存事务点 savepoint
insert into p1 values (...)
insert into p1 values (...)
savepoint a;
insert into p1 values (...)
rollback to savepoint a;
4. 隔离级别
读已提交
七、视图
1. 简化一些复杂查询
2. 创建视图前得赋予权限
grant create view to mytestuser;
3. 语法
create or replace view findOrderItems as [查询语句]
4. 使用视图查询
select * from findOrderItems
5. 能对视图中的数据增删改吗?
可以,但是不建议只建议封装查询结果
八、索引
1. 什么是索引
随着数据量的增加,查询速度越来越慢,这个时候就有索引机制,相当于表数据的目录主键一旦被设定,就有一个唯一索引
2. 分类
单列索引和复合索引
3. 创建单列索引
create index index_person_name on XXXXX.person(name) tablespace XXXX;
--当这一列有唯一时无法创建
4. 创建复合索引
create index index_person_gd on XXXXX.p1(gender,birthday) TABLESPACE XXXXX;
5. 注意
5.1. 索引创建是在添加数据之前还是之后呢?
创建表,添数据,如果查询慢,添索引
5.2. 索引添在那些字段?
where 条件中 经常出现的列
5.3. 表的索引是越多越好吗?
索引是服务于查询的,但是一张表一旦有了索引之后,增删改反而更慢
索引如果过多,重建索引的时候就会很慢
5.4. 什么时候用索引?
一张表,查询特别频繁,数据量大
5.5. 根据列的查询类型不同,分为以下索引
主键上:
1 2 3 4 5 6 ... 高基数列 B树索引,正向键
7xxx 7xxx 7xxx 反向键
外键上:
位图索引 低基数列
5.6. 查询索引(表下,用户下)
select * from all_indexes where table_name = '表名';
select * from user_indexes ;
5.7. 删除索引
先查询索引在哪个用户下
Select * from dba_indexes where index_name = '索引名'
再去删除索引
drop index XXXXX.索引名;
九、同义词
1. 如何快速创建emp 及 dept
通过system 赋予 mytestuser emp,dept 表的查询权限
2. 赋予权限
grant select on scott.dept to mytestuser;
grant select on scott.emp to mytestuser;
3. 使用
select * from scott.emp;
4. 能不能像调用普通表一样使用其他用户的表(视图)呢
--在scott 用户下设置表别名(同义词)
grant create public synonym semp for emp;
5. 简化使用(特点)
select * from semp;
6. 让表的访问更加安全(特点)
不让别人知道真实的表名
7. 自己定义的用户 得赋予权限才能设置同义词
-- 赋予某用户创建同义词权限
grant create public synonym to mytestuser
8. 要想让scott用户使用自己定义的用户的表
还得从 第2. 设置一遍