數據庫內/外連接和子連接

前言:

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