数据库内/外连接和子连接

前言:

多表进行查询数据,主要通过excel模拟人工操作,再写SQL语句,这样可以直观的理解逻辑。

–交叉连接

笛卡尔乘积:没有任何限制条件的连接
结果得到的表是表的列数相乘,有点类似于测试要因的全覆盖。

select *
from1,2;

select *
from1
cross join2;
内连接

两张表中同时符合某种条件的数据记录的组合(相互没有对应关系的则会隐藏)

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;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章