一、简单子查询
定义:(Sub query):
– 查询比员工scott薪水高的员工数据
步骤1:查询scott薪水
select sal from emp where enname=‘scott’
步骤2:查询比步骤1结果大的数据
select* from emp where sal>=20000
(1) c/s 结构 SQL 语句执行过程
(2) 事务控制
四个特性:
(a) 原子性:事务是一个不可继续划分的整体
如果一个事务由多个DML操作构成,这些DML操作看成一个整体
(b) 一致性:组成事务这些DML操作,要么都成功,要么都失败
© 隔离性:不同的事物之间,不能相互影响。
(d) 持久性:事务提交后,数据存入数据库,持久生效。
事物控制: 关闭自动提交
简单子查询只返回单一的一行一列的数据
二、多行子查询
- IN 和 not in
– 多行子查询
– 子查询返回的数据是多行单列的(多个数据) ,不可以用常规
– 查询与20号部门员工拥有相同职位的其他部门员工
SELECT *
FROM emp
WHERE job IN (SELECT DISTINCT job FROM emp WHERE deptno=20)
AND deptno != 20;
– 重要:在子查询中使用in或者not in时,需要确保子查询结果中不存在Null值
not in中有 null 值,无法查询任何数据.
select *
from emp
where mgr not in(1001,null)
– 没有任何数据可以符合条件
- ANY与ALL
– any 其中之一
– all 全部
– 查询比30号部门全体员工月薪都要高的员工数据
SELECT *
FROM emp
WHERE sal >ALL (SELECT sal FROM emp WHERE deptno=30);
– >all 大于最大值
– <all 小于最小值
– >any 大于最小值
– <any 小于最大值
三、FROM句式中子查询
多行多列子查询 – 临时视图 当成一张表来用
– 查询比自己职位平均薪水低的员工数据
SELECT *
FROM emp e JOIN (
SELECT job,AVG(sal) AS jsal
FROM emp
GROUP BY job ) j ON(e.job=j.job)
WHERE j.jsal>e.sal;
四、相关子查询
子查询不能独立运行,必须依附主查询
拿主查询的和子查询去对,一般会用exist 或着not exist (存在或者不存在)
exist 用于主查询的结果是否存在于子查询中,若存在则留下来.
SELECT *
FROM emp e1
WHERE EXISTS (SELECT 0 FROM emp e2 WHERE e2.mgr=e1.empno);
五、视图
数据库一种对象,关键字是view
它是对数据表中的数据产生的 “透视” ,本身是不存储数据的。
通常做两件事:1.将常用的复杂查询编制成一个视图,直接通过查询视图获取需要的数据。
2.隐藏敏感数据
创建视图
Create or replace view 视图名
as
dql 语句
删除视图
drop view 视图名
六、索引
索引目的是为了提高表的检索速度,但实际不一样
索引建立后,一定会降低插入和删除的执行速度
自动索引:表的主键列和唯一约束列,相应的列会自动添加索引
手动索引:通过人工添加索引
索引关键字: index
create index 索引名 on 表(列) — 为表的列添加索引
drop index 索引名 – 删除索引
索引是自行维护,创建之后不用管理