Oracle数据库之四
删除记录的SQL语句
delete from 表名[where 条件];(DML)
注意:
如果没有where子句,代表全部删除(慎用)。
delete也必须commit后才能生效
truncate也可以删除全部数据,但直接生效(DDL);
delete from student where id =4;
如果删除父表中的记录,子表怎么办?
delete from dept where d_id =3;
通常情况下,删除父表数据时,必须保证子表中没有相关数据。
在创建外键约束时,可以指定删除数据的关系:
on delete cascade -- 删除父表的同时级联子表相关数据
on delete set null--删除父表的同时把子表相关数据的关联字段设置为NULL
drop table emp ;
create table emp (
id number(11) constraint emp_pk primary key,
name varchar(20) not null,
salary number(10,4),
joindate date,
position varchar(15),
dept_id number(10),
constraint emp_fk
foreign key(dept_id)
references dept(d_id)
on delete set null
);
唯一约束 -- unique
保证字段值不会重复,字段级约束:
字段名 字段类型 [constraint 约束名] unique
create table user(
id number(11) primary key,
name varchar2(20) not null,
email varchar2(40) unique
);
insert into user values(1,'zhangfei','11111');
insert into user values(2,'guanyu',NULL);
insert into user values(3,'zhaoyun','11111');错 违反唯一约束
insert into user values(4,'liubei',NULL);email NULL可以重复
check约束 -- 额外添加约束
check(表达式)
比如:要求用户名至少6个字符
drop table user;
create table user(
id number(11) primary key,
name varchar2(20) not null,
email varchar2(40) unique,
check(length(name)>5)
);
insert into user values(1,'zhangfei','11111');
insert into user values(2,'liru','2222');//用户名长度不够
建表时,也可以使用子查询,使用子查询建表在建立表格的同时也会把数据复制过来。
这种方式一般用于建立临时表。格式:
create table 表名 [(字段)] as 子查询;
子查询建表 只能把非空约束带到新表中
create table myemp as (select id,first_name,salary from s_emp);
DML和事务处理语句:
最常用的DML语句:
insert:插入记录
update:修改记录
delete:删除记录
insert 可以使用子查询插入多条数据
insert into 表名 [(字段名)] 子查询;
update 语法:
update 表名 set 字段1 =值1,字段2 = 值2,... [where 条件];
注:where 条件如果不写,就相当于修改全部数据
把myemp_gzgd1306_marsh所有人的工资都加500
update myemp set salary = salary+500;
commit;
把id=5的员工工资加上1000(用myemp表)
update myemp set salary = salary+1000 where id =5;
commit;
事物处理是针对DML(insert/update/delete) 的,其他的SQL不需要事务处理。
事物处理语句:commit和rollback
commit是提交DML,相当有确认
rollback是回滚DML,相当于撤销
select * from myemp;
delete from myemp where id = 25;
commit;
delete from myemp where id = 24;
rollback;
事物处理之前数据的状态(只执行了DML,而没有执行commit/rollback)
1 数据库中的数据没有真正改变
2 当前窗口看到的是记录改变之后的数据
3 其他窗口看到的是改变之前的数据
4 所有发生改变的记录被锁定,不能再次修改,但运行查询
当前窗口修改记录,未commit/rollback,则记录将被锁定,其他窗口不能修改
事物处理之后的状态(事物处理方式commit):
1 数据库中的数据发生改变(无法再回滚)
2 修改之前的数据将消失
3 所有用户都会看到修改之后的数据
4 释放/解除相关记录的锁定
5 如果有断点,也会被释放
事务处理之后的状态(事物处理方式rollback):
1 数据库数据回到修改前的状态(无法再提交)
2 修改之后的状态和数据消失
3 所有用户都看到修改之前的数据
4 释放/解除相关记录的锁定
注意:DML操作之后记得立即提交
自动回滚和自动提交
1 非正常的推出sqlplus 自动回滚数据。
2 正常退出sqlplus 自动提交数据(exit)
3 执行ddl语句之前 自动提交数据
4 执行dcl语句之前 自动提交数据
注:DDL语句:create drop truncate...
可以使用savepoint语句设置断点,回滚时可以部分回滚(回滚到前面的断点)。
select * from myemp;
delete from myemp where id = 24;
savepoint a;
delete from myemp where id = 23;
savepoint b;
delete from myemp where id = 22;
rollback to b;
select * from myemp;
rollback to a;
select * from myemp_select * from myemp;
注:关于表结构的修改SQL语句可以课下看
oracle数据库中,有很多的对象,包括:表、视图、序列、索引。Oracle对象不能重名。
oracle数据库 用序列提供表的主键,序列和表一样是Oracle对象,
序列就是一个自增的整数
建序列:
create sequence 序列名
删除序列:
drop sequence 序列名
[INCREMENT BY n]//增量,默认为1
[START WITH n]//从几开始
[{MAXVALUE n| NOMAVALUE}}]
[{MINVALUE n| NOMINVALUE]
[{CYCLE|NOCYCLE]
[{CACHE n|NOCACHE}]
create sequence seq_user;
drop sequence seq_user;
序列和表没有任何的直接联系,只是为表提供主键
creat sequence seq_user;
序列名.nextval 取序列的下一个值
序列名.currval 取序列的当前值
第一次使用必须先取.nextval
select seq_user.nextval from dual;
...
select seq_user.currval from dual;
主键提供方案:
先建一个序列,然后用序列.nextval提供主键
insert into user
values(seq_user.nextval,'zhangliang','bbbb');
注:序列只会自增,不会回滚---主键不保证连续,保证唯一
Oracle有一些系统表,记录这一些操作和信息叫数据字典。比如:USER_SEQUENCE.
索引:
索引用于提升Oracle数据库的查询速度,分为自动索引和普通索引
当使用唯一约束或者主键时,对应的字段自动加上索引。
Oracle有很多中索引,但最多的是二叉树索引
经验:
经常用来做查询条件的字段可以考虑加上索引
索引可以提升查询速度,但降低增删的速度,因此不是经常用来做查询条件的字段不需要使用索引
普通索引的建立预防:
create index 索引名 on 表名(字段名);
字段名可以有多个,但一般都是1个。
create index index_user on user(name);
drop indext index_user;
视图:
视图自身不存储数据,视图的数据也来自于表。
视图就是表中数据额外的展现形式,可以把一个select语句的结果集做成视图。
视图的数据来源比较灵活,可以跨表、跨字段。
视图不会提升查询效率,但可以把复杂的SQL查询语句做成视图,然后简单化再次查询。
同时也提供了数据的多种展现形式。
视图(view)的创建语法:
CREATE [OR REPLACE] VIEW 视图名
[(alias[,alias...])]
as subquery
[WITH CHECK OPTION [CONSTRAINT constraint]]
[WITH READ ONLY]
create or replace view view_emp
as(select e.id,first_name,salary,name from s_emp e,s_dept d
where e.dept_id = d.id) WITH READ ONLY;
drop view view_emp;
可以想查询表一样查询视图,简化SQL语句。
select id,first_name,salary,name from view_emp;
Oracle的rownum
用于数据的分页问题。
当数据库的数据非常大时,先取10页的数据,等过了10页以后再取下一个10页的数据。
如何从数据库中取出部分数据,Oracle使用rownum实现。
select id,first_name,salary from s_emp where rownum<11;
select id,first_name,salary from s_emp where rownum>11;(错)
select id,first_name,salary from s_emp where rownum between 11 and 20;(错)
rownum 是一个伪列,只能使用 < 运算。
按first_name 排序取前10
select id,first_name,salary from s_emp
where rownum < 11 order by first_name; //错,先where后排序
select id,first_name,salary from(
select id,first_name,salary from s_emp order by first_name
) where rownum<11;
按first_name 排序取11-20
select id,first_name,salary from
(select rownum row,id,first_name,salary from(
select id,first_name,salary from s_emp order by first_name
)) where row between 11 and 20;
可以用rownum的别名实现其他运算符。
Oracle数据库之四的更多相关文章
- Oracle数据库之四 简单查询
四.简单查询 简单查询的主要特征就是将一张数据表之中的全部数据行进行显示,而后可以利用 SELECT 子句来控制所需要的输出列. 4.1.基础语法 范例:查询 emp 表中的数据(全部数据查询) ...
- 详解:数据库名、实例名、ORACLE_SID、数据库域名、全局数据库名、服务名及手工脚本创建oracle数据库
数据库名.实例名.数据库域名.全局数据库名.服务名 , 这是几个令很多初学者容易混淆的概念.相信很多初学者都与我一样被标题上这些个概念搞得一头雾水.我们现在就来把它们弄个明白. 一.数据库名 什么是数 ...
- 使用Zabbix监控Oracle数据库
Orabbix介绍 监控Oracle数据库我们需要安装第三方提供的Zabbix插件,我们先测试比较有名的Orabbix,http://www.smartmarmot.com/product/orabb ...
- Oracle 数据库知识汇总篇
Oracle 数据库知识汇总篇(更新中..) 1.安装部署篇 2.管理维护篇 3.数据迁移篇 4.故障处理篇 5.性能调优篇 6.SQL PL/SQL篇 7.考试认证篇 8.原理体系篇 9.架构设计篇 ...
- Oracle数据库该如何着手优化一个SQL
这是个终极问题,因为优化本身的复杂性实在是难以总结的,很多时候优化的方法并不是用到了什么高深莫测的技术,而只是一个思想意识层面的差异,而这些都很可能连带导致性能表现上的巨大差异. 所以有时候我们应该先 ...
- Oracle 数据库语句大全
Oracle数据库语句大全 ORACLE支持五种类型的完整性约束 NOT NULL (非空)--防止NULL值进入指定的列,在单列基础上定义,默认情况下,ORACLE允许在任何列中有NULL值. CH ...
- Oracle数据库升级(10.2.0.4->11.2.0.4)
环境: RHEL5.4 + Oracle 10.2.0.4 目的: 在本机将数据库升级到11.2.0.4 之前总结的Oracle数据库异机升级:http://www.cnblogs.com/jyzha ...
- 混合框架中Oracle数据库的还原处理操作
在较早期的随笔<Oracle如何实现创建数据库.备份数据库及数据导出导入的一条龙操作>粗略介绍了Oracle数据库的备份还原操作,本文想从开发框架的基础上介绍Oracle数据库的脚本或者还 ...
- Oracle数据库的链接数目超标
测试场景:Oracle数据库的链接数目超标,iServer是否自动连接. 测试步骤:(1)设置了最大连接数为85,oracle后台进程有83:(2)开启3台iserver(A,B,C)A,B发布tes ...
随机推荐
- sql盲注及其相关方法
Sql注入过程数据(后台数据不能回显到页面)不回显采用方法 1:构造逻辑判断 ▲left(database(),1)>’s’ //left()函数 ▲and ascii( ...
- javascript 图片延迟加载
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...
- 从xml文件中读取注释
void Main() { string dirp=@"E:\Cread\UP4201308.bak\UP4.BAK\ExportPath\ConfigFile\"; ...
- javascript中onclick事件能调用多个方法吗
Q: javascript中onclick事件能调用多个方法吗? A: 可以的,方法如下onclick="aa();bb();cc();"每个方法用“;”分号隔开就行了
- Tencent 的电话面试
Tencent的实习生招聘投了简历.然后,万万没想到昨晚腾讯IEG直接给我电话了.当时就惊呆了,我都没有找人内推,就直接电话面试了. 就为昨晚的电话面试写写感想吧!问的挺多的,基本上简历上写了的都问到 ...
- java volatile 和Transient 关键字
java关键字volatile volatile修饰的成员变量在每次被线程访问时,都强迫从主内存中重读该成员变量的值.而且,当成员变量发生变化时,强迫线程将变化值回写到主内存.这样在任何时刻,两个不同 ...
- NOIP模拟赛 by hzwer
2015年10月04日NOIP模拟赛 by hzwer (这是小奇=> 小奇挖矿2(mining) [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿 ...
- 欧拉工程第54题:Poker hands
package projecteuler51to60; import java.awt.peer.SystemTrayPeer; import java.io.BufferedReader; impo ...
- java多线程理解2
1. 什么时候必须同步?什么叫同步?如何同步? 要跨线程维护正确的可见性,只要在几个线程之间共享非 final 变量,就必须使用 synchronized(或 volatile)以确保一个线程可以看见 ...
- 什么是边界扫描(boundary scan)?
边界扫描(Boundary scan )是一项测试技术,是在传统的在线测试不在适应大规模,高集成电路测试的情况下而提出的,就是在IC设计的过程中在IC的内部逻辑和每个器件引脚间放置移位寄存器(shif ...