Oracle复习知识点汇总
select deptno,avg(sal) from emp group by deptno having avg(sal)>(select avg(sal) from emp where deptno=20); 先算出每个部门的平均工资,再和20部门的平均工资进行比较
select ename,job from emp where deptno in (select deptno from emp group by deptno having avg(sal)>2000)
select ename form emp where empno not in (select mgr from emp) 查询哪些人不是领导,返回结果有null值,且使用not in 运算符,则无结果*/
*************关联子查询************
select ename,sal,deprno from emp outer where sal>(select avg(sal) from emp where deptno=outer.deptno) 查询哪些员工薪水比本部门的平均薪水高,子查询不再是独立的Sql语句,需要以来主查询传来的参数*/
select ename,job,deptno from emp outer where exists (select 'a'from emp where mgr=outer.empno); exists关键字判断子查询有没有数据返回,有则为ture,没有则为false。它不关心子查询的结果,所以select后写什么都行*/
************多表查询***************
select e.deptno,e,ename,d.dname from emp e join dept d on e.deptno=d.deptno; 两个表连接,表1 join 表2 on 条件,结论:没有部门的员工和没有员工的部门都不会出现
***内连接的表现形式***
1、等值连接
select e.ename,e.job,e.sal,d.dname from emp e join dept d on e.deptno =d.deptno and e.job='MANAGER'; 先用条件e.job = ‘MANAGER’对emp表进行过滤,结果集再和dept表进行内连接。
2、非等值连接
select e.ename, e.sal, s.grade,s.losal, s.hisal from emp e join salgrade s on e.sal between s.losal and s.hisal; 查询emp表中员工的工资属于哪个级别
3、自连接
select worker.ename,manager.ename from emp worker join emp manager on worker.mgr=manager.empno; 涉及同一张表的数据
内连接总结:一张表里的记录一定在另一张表中存在匹配的记录,否则不能出现在结果集中
外连接的特征:
如果驱动表在匹配表中找不到匹配记录,则匹配一行空行。
外连接结果集=内连接结果集+驱动表在匹配表中匹配不上的记录和空值。
外连接的本质是驱动表中的数据一个都不能少。
left outer join以左边的表为驱动表。
right outer join以右边的表为驱动表。
select e.empno , e.ename , d.dname from emp e left outer join dept d on e.deptno = d.deptno ; 结果集中包括有部门的员工和没有部门的.员工 */
select e.empno , e.ename , d.dname from dept d left outer join emp e on e.deptno = d.deptno; 结果集中包括有员工的部门和没有员工的部门*/
结论:t1 left outer join t2等价于: t2 right outer join t1
t1 right outer join t2等价于:t2 left outer join t1
全外连接的结果集 = 内连接的结果集 +
驱动表中在匹配表中找不到匹配记录的数据和null值 +
匹配表中在驱动表中找不到匹配记录的数据和null值
***************集合***************
A = {1,2,3,4,5,6}
B = {2,4,6,8}
A union B = {1,2,3,4,5,6,8}
A union all B = {1,2,2,3,4,4,5,6,6,8}
A intersect B = {2,4,6}
A minus B = {1,3,5}
********数据操作语言(DML)*********
****1、insert语句****
一次增加多条记录,使用子查询代替values 。在emp表中查询部门10的员工编号,员工姓名,那么id、name与empno和ename相对应。
insert into student_ning(id, name) select empno, ename from emp where deptno = 10;
****2、复制表****
create table 表名 as 查询语句; 注释:复制全表
create table salgrade_yyy as select * from salgrade where 1<>1; 只复制结构,不复制数据*
create table emp_yyy as select empno,ename,sal*12 year_sal from emp where deptno = 10;复制一部分数据
create table emp_bak as select * from emp where 1=0; 创建一个空表
****3、update语句****
update emp_ning set sal = 1000 where empno = 7369; update语法结构: update 表名 set 列名 = 新的列值, 列名 = 新的列值. ….where 条件;
****4、delete语句****
语法结构: delete [from] 表名 where 条件;
drop table 会删除表结构和数据;truncate 删除表数据,保留表结构。drop 和truncate 都不可以回退。delete 仅删除数据,可以回退。
***5、事务语句****
包括:
commit事务提交:将所有的数据改动提交
rollback:事务回滚、回退到事务之初,数据的状态和事务开始之前完全一致。
savepoint:设置保存点 , 可以回滚( rollback )到指定的保存点。
结论
1) 提交、回滚前事务内部的数据改变只有在自己的会话中能够看到。
2) 提交、回滚前事务会对操作的数据加锁,不允许其它事务操作。
3) 如果提交( commit )后,数据的改变被确认,则
4) 所有的会话都能看到被改变的结果;
5) 数据上的锁被释放;
6) 保存数据的临时空间被释放
7) 如果回滚( rollback ) , 则
8) 数据的改变被取消;