左外连接例子:
select employee_id,last_name,salary,department_id,department_name
from employees left join departments using(department_id)
(两个表使用department_id进行等值连接)
右外连接例子:
select employee_id,last_name,salary,department_id,department_name
from employees right join departments using(department_id)
(两个表使用department_id进行等值连接)
全外连接例子:
select employee_id,last_name,salary,department_id,department_name
from employees full outer join departments using(department_id)
(两个表使用department_id进行等值连接)
子查询(Sub Query)
问题引入:如何查得所有比“张三”工资高的员工信息
子查询
子查询在主查询前执行一次
主查询使用子查询的结果
语法格式:
select 字段列表
from table
where 表达式operator (select 字段列表from table);
使用子查询注意事项:
在查询是基于未知值时应考虑使用子查询;
子查询必须包含在括号内;
建议将子查询放在比较运算符的右侧,以增强可读性。
除非进行Top-N(即前几名)分析,否则不要在子查询中使用order by 子句;
对单行子查询使用单行运算符;
对多行子查询使用多行运算符;
单行子查询
单行子查询只返回一行记录;
对单行子查询可使用单行记录比较运算符;(=,>,>=,<,<=,<>不等于)
举例:select * from emp where sal>(select sal from emp where empno=7566);
子查询空值/多值的问题
如果子查询未返回任何行,则主查询也不会返回任何结果;
Select * from emp where sal>(select sal from emp where empno=8888);//8888是不存在的
如果子查询返回单行结果,则为单行子查询,可以在主查询中对其使用相应的单行记录比运算符;select * from emp where sal>(select sal from emp where empno=7566);
如果子查询返回多选择结果,则为多行子查询,此时不允许对其使用单行记录比较运算符。
select * from emp where sal>(select avg(sal) from emp group by deptno);//非法的,不可以这样做
Desc emploree//查询emploree表的结构
多行子查询
多行子查询返回多行记录,对多行子查询只能使用多行记录比较运算符(in,any,all)
in等于列表中的任何一个
Any和子查询返回的任意一个值比较;
All和子查询返回的所有值比较;
举例:
Select * from emp where sal>any(select avg(sal) from emp group by deptno);
Select * from emp where sal>all(select avg(sal) from emp group by deptno);
Select * from emp where job in(select job from emp ename='MARTIN' or ename='SMITH');
TopN查询
在ORACLE中通常采用子查询的方式来实现Top N查询
举例:select * from (select * from emp order by sal desc) where rownum<=5;
Rownum是伪列,必须在已经查询中的结果中才可以使用rownum,直接使用无效。例如:
Select * from employee where rownum<=5//非法,rownum不存在
Select rownum,a.* from(select * from emp order by sal desc) a;//正确使用rownum的例子
Select * from
(select rownum myno,a.* from(select * emp order by sal desc) a)
Where myno >=5 and myno <=10;
第章DML与事务控制
1 数据操作语言DML insert语句,update语句,delete语句,merge语句
2数据库事务控制
事务的概念,事务提交和回滚,自动提交,保存点和部分回滚。
Insert语句
1每次只能插入一条记录,缺省字段名列表时,应为新插入记录中的每个字段设定新值
也可以在insert语句中指定赋值字段列表,只为部分字段显示地设定值。其余字段为Null.
可以在insert语句中使用子查询,实现表间数据拷贝:
Insert into dept1(id,name) select deptno,dname from dept;
说明:此时不必再给出values子句。子查询中的值列表应与insert子句字段相对应。
Update语句
每次可更新多条记录,可使用where子句限定要更新的记录,如缺省的where子句,则更新表中的所有记录。
Update emp set sal=sal+99;
Update emp set sal=sal+99 where empno=7599;
Update student2
Set age=nvl(age,o)+1;
Delete语句
Delete语句每次可删除多条记录
可使用where子句,限定要删除的记录
Delete from table
Delete from table where empno=8888;
Merge语句
Merge语句用于进行数据合并,根据条件在表中执行数据的修改或插入操作,如果要插入的记录在目标表中已经存在,则执行更新操作,否则执行插入操作。
用法举例:
Create table test1 (eid number(10),name varchar);
Insert into test1 values(1001,'张三''20-5月-70',2300);
Insert into test1 values(1002,'李四''16-5月-70',2600);
Select * from test1;
Create table test2(eid number(10),name varchar2(20),birth date,salary number(8,2));
Select * from test2;
Merge into test2
Using test1
On (test1.eid=test2.eid)
When matched then
Update set na