前言:
多表進行查詢數據,主要通過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;