Java小白的数据库爱情(四)Oracle DDL、DML使用
rowid 、rownum
rowid 和 rownum都是伪列
rowid
rowid 不是表的某一个字段,相当于对象的地址,根据地址转换的,不是真实的地址,可以用来区分数据的唯一
是在 插入到数据库表中时候已经确定rowid
rowid 和 rownum都是伪列 --rowid 不是表的某一个字段,相当于对象的地址,根据地址转换的,不是真实的地址,可以用来区分数据的唯一
是在 插入到数据库表中时候已经确定rowid
rowid作用: 针对于一些没有主键,唯一标识的表,区分表中重复数据的唯一,去重
rownum
结果集的序号
数字编号,从1开始,每次+1,有规律可寻,可以根据rownum的值做判定
想要使用rownum进行判断,需要对一个已经确定的结果集的rownum进行判定
用途:分页
select empno,ename,sal,comm,rownum from emp; --数据源 一个结果集 已经确定了rownum
select * from (select empno,ename,sal,comm,rownum n from emp) where n<=6 and n>=4;
如果存在排序,rownum需要注意-
一般规律为: 根据主键字段做排序,先排序后rownum
根据其他字段做排序,先确定rownum再排序
解决方案: 再嵌套select
视图
视图:->数据源
建立在表与结果集之间的视图,是一个虚拟表
作用: 封装sql 提高安全性 简化sql
逻辑视图 : 操作的还是原表中的数据,封装sql
权限: 创建视图的权限
先登录sys用户,驶入命令授权,结束后切换SCOTT用户使用
授权: grant dba to SCOTT;
回收: revoke dba from SCOTT;
创建视图 :create or replace view 视图名字 as select * from … where … [with read only];
create or replace view vw_hehe as select * from dept where deptno !=10 with read only;
删除视图 :drop view 视图名字;
drop view vw_hehe;
索引
索引
提高查询效率
相当于字典的目录
大量数据的查询,通过使用索引进行查询,效率高
但是必须是查询,大数据
索引是数据库的对象之一,需要维护,如果经常做增删就需要更新索引,效率降低
索引是透明的,一个字段是否 添加索引不影响使用
添加索引: 为某张表的某个字段添加索引
Oracle会自动为主键添加索引
添加索引:create index 索引名 on表名 (字段列表)
删除索引:drop index 索引名
DDL
数据定义语言
表的创建:
create table sxt_user(
userid number(3),
username varchar2(30), --默认30个字节 (4 char)
password varchar2(6 char), --不超过6个字符
gender char(1 char),
regdate date
);
删除表:drop table 表名
加入注释
为表加注释:comment on table 表名 is ’ ’
为字段加注释:comment on column 表名.字段 is ’ ‘
comment on table sxt_student is '尚学堂学生表';
comment on column sxt_student.sid is '学生编号';
comment on column sxt_student.sname is '学生名';
删除 :(先删除从表 再删除主表 ;同时删除约束)
drop table 表名 cascade constraints;
创建表的同时添加约束 (定义字段后直接添加约束,没有约束名->提示无法显示约束名字,不便于维护,但是简单)
主键约束 (唯一+非空) :primary key
非空:not null,
唯一:unique,
检查:check
约束
创建表的同时添加约束 指定约束名
–1) 在字段后面指定约束名字添加约束 2)在表结构结束之前为字段添加约束
constraint haha check(phonenum is not null)
在表结构结束之后追加约束
alter table sxt_student add constraint ck_student_gender check(sgender ='男' or sgender = '女');
约束的禁用与启用
ALTER TABLE tb_user disable constraint nn_user_name;
ALTER TABLE tb_user enable constraint nn_user_name;
约束不建议修改,建议删除添加
外键
–外键约束 关联班级表的主键
-- 创建表时添加外键
cid number(4) , constraints fk_stu_cid references sxt_class(cid)
--表结束添加外键
constraints fk_stu_cid foreign key(cid) references sxt_class(cid) on delete cascade
主外键关系下删除表
删除从表,直接删除,没有影响
删除主表 : 默认先删除 从表在删除主表 ,否则就级联删除主表+主外键约束
主外键关系下,删除数据:
从表数据可以直接删除
删除主表数据:
–没有被从表引用的数据,可以直接删除
–删除主表中已经被从表引用的数据: 3中解决方案
–先删除引用了当前主表数据的那些从表数据,然后再删除当前主表数据 默认
–删除主表数据的同时,删除从表中引用了当前主表数据的那些从表数据 on delete cascade
–删除主表数据的同时,从表中,引用了当前主表数据的那些从表数据的外键字段设置为null
事务
定义:单个的逻辑单位,执行一组数据的操作,以事务为单位,在一个事务声明周期之间的一组数据,要么同时操作成功,要么同时失败
作用:保证数据的安全性
事务的开启:执行增删改操作时自动开启
事务的结束:1、提交 : commit 执行DDL DCL 正常关闭客户端 自动提交
2、回滚:rollback , 意外推出(断电)
特点:
原子性:
一致性:
隔离性:
持久性:
Oracle 默认的隔离级别是 read committed
脏读:事务 T1 更新了一行数据,还没有提交所做的修 改,T2 读取更新后的数据,T1回滚,T2 读取的数据无 效,这种数据称为脏读数据。
幻读:事务 T1 读取一条带 WHERE 条件的语句,返回结 果集,T2 插入一条新纪录,恰好也是 T1 的 WHERE 条 件,T1 再次查询,结果集中又看到 T2 的记录,新纪录 就叫做幻读。
DML
DDL: 数据定义语言 表创建create 表修改alter 表删除drop
DML: 数据控制语言 增删改数据 insert update delete select
插入 INSERT :
insert into 表名 values(和表结构顺序和个数和类型一致的数据可以手写也可以从别的表中获取的);
insert into 表名(指定列名) values(和指定的列个数、顺序、类型一致的列数据)
insert into dept values(80,NULL,'');
insert into dept(deptno) values(90);
insert into 表(指定列) select 查询列 from 源表 where 过滤数据; insert into 表(指定列) values(值列表);
insert into 表名 select 查询列 from 源表 where 过滤数据;
insert into 表名 values(值列表 );
修改 update:
update 表名 set 字段=值 [,…] where 过滤行记录;
update dept set dname='haha',loc='shanghai' where deptno = 70;
删除 delete :
delete [from] 表名 where 过滤行记录
截断:
delete 与 数据截断的区别
共同点: 都能作为删除数据
不同点: delete执行会开启事务,truncate不会开启事务
–数据截断删除主表中数据,会从表结构上检查 ,如果有被引用不允许使用截断,delete可以,三种情况
ame=‘haha’,loc=‘shanghai’ where deptno = 70;
**删除 delete :**
delete [from] 表名 where 过滤行记录
**截断:**
delete 与 数据截断的区别
共同点: 都能作为删除数据
不同点: delete执行会开启事务,truncate不会开启事务
--数据截断删除主表中数据,会从表结构上检查 ,如果有被引用不允许使用截断,delete可以,三种情况
truncate 只能删除一张表中的所有数据