前言:
多表进行查询数据,主要通过excel模拟人工操作,再写SQL语句,这样可以直观的理解逻辑。
–交叉连接
笛卡尔乘积:没有任何限制条件的连接
结果得到的表是表的列数相乘,有点类似于测试要因的全覆盖。
select *
from 表1, 表2;
select *
from 表1
cross join 表2;
内连接
两张表中同时符合某种条件的数据记录的组合(相互没有对应关系的则会隐藏)
select *
from emp e, dept d
where e.deptno = d.deptno;
select *
from emp e
inner join dept d
on e.deptno = d.deptno;
--非等值连接
select *
from emp e
inner join salgrade s
on e.sal between s.losal and s.hisal;
自连接
当查询的表都是一张表的内容,则可以通过自己与自己连接来实现查询,emp表里既有员工,也有管理员工的领导,
select e1.empno, e1.ename 员工姓名, e1.mgr 员工的领导编号, e2.ename
from emp e1
inner join emp e2
on e1.mgr = e2.empno;
select e1.empno, e1.ename 员工姓名, e1.mgr 员工的领导编号, e2.ename
from emp e1
join emp e2
on e1.mgr = e2.empno;
左外连接 和右外连接(join的左右)
左外连接 会保留左边表的全部数据(outer可以省略)
select *
from emp e
left outer join dept d
on e.deptno=d.deptno;
select *
from emp e
right outer join dept d
on e.deptno=d.deptno
order by ename;
--这个还会打印不满足name条件的右表内容
select *
from emp e
right join dept d
on d.deptno=e.deptno
and e.ename='BLAKE';
--这个不会打印不满足where条件的内容
select *
from emp e
right join dept d
on d.deptno=e.deptno
where e.ename='BLAKE';
子连接
将条件放到括号里
--单行子查询 查询销售部员工信息,相当与上的两条指令
select *
from emp e
where e.deptno=(
select deptno
from dept
where dname ='销售部'
);
/*
any 大于最小的
<any 小于最大的
=any 等于任意-个
*/
--查找比销售员最高薪水低的员工信息
select *
from emp
where sal <any(
select sal
from emp
where job ='销售员'
);
*ALL 子查询
all 大于最大的
<all 小于最小的
*/
--查找比所有销售员薪水都高的员工信息
select *
from emp
where sal >all(
select sal
from emp
where job ='销售员'
);
多分支条件
--多分支条件
case
when 条件1 then 语句1
when 条件2 then 语句2
else 语句3
end;