一头扎进sql之多表操作
一、多表查詢時NULL值處理
- 要求返回比"allen"工資低的所有員工
select? a.ename,a.conn from emp a? where? a.conn? <? (select b.conn from emp b where b.ename = 'allen') ;
- 正確的寫法應該是
select a.ename,a.conn from emp a where coalesce(a.conn,0) < (select b.conn from emp b from b.ename = 'allen');
- 注意點
NULL值比較結果還是NULL,所以這里需要進行NULL值的一個轉化才行
二、聚集和外鏈接
- 要求返回所有部門的工資和獎金
select? e.deptno,
sum(e.sal) as total_sal,
sum(e.sal*eb2.rount) as total_bonus,
from emp?
left join? (select eb.empno,
sum(case when type =1 then 0.1
? ? ? ? ? when type =2 then 0.2
? ? ? ?when type =3 then 0.3 end ) as tote?
from emp_bonux? eb?
group by eb.empno) eb2? on eb2.empno = e.deptno?
group by e.deptno
oder by 1;
- 多個表返回丟失的數據用FULL JOIN?
三、聚集和內連接
- 要求返回部門為10的所有的員工的工資和獎金
select e.deptno
? ?e.empno,
e.ename,
(e.sal * CASE? WHEN? type =1 THEN 0.1
? ? ? ? ? ? ? ? ? ? ? ? ? ??WHEN? type =2 THEN 0.2
? ? ? ?WHEN? type =3 THEN 0.3 end ) as? bonus
from emp e?
inner join emp_bonus eb on eb.empno = eb.empno
where d.deptno = 10
order by 1,2
如果聚合的話必須先把獎金按照員工匯總然后在進行聚集
select e.deptno
sum(e.sal) as total_sal,
sum(e.sal*eb.bonus) as total_bonus
from emp e
inner join (select eb.empno,
case when type =1 then 0.1
? when type =1 then 0.2
??when type =1 then 0.3 end) as bonus
group by eb.empno) eb2? on eb2.empno = e.empno
where e.deptno? = 10;
group by e.deptno;
四、UNION ALL 、UNION 、和空字符串
select??ename as? 部門名稱 ,denpno 部門編號, evl(mgr,deptno) as 上級編碼
NNION? ALL
select??ename as? 部門名稱 ,denpno 部門編號, NULL as 上級編碼 (應該用‘’空字符串)
- 當有重復數據時必須加上唯一標識
? ? 74990? 30? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ???74990? 30
? ? ? ?7521? ? 30? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 7521? ? 30
7654? ?30? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 7654? ?30
7844? ? 30? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?7844? ? 30
7900? ? 30
? ? ?這兩條數據坐聚合操作就會出現 OR就是有5條數據? 而用 UNION就會只出現一條數據 解決辦法就是加入唯一字段
select? empno,deptno? from emp where mgr = 7684
UNION?
select? empno,deptno? from emp where job = 'SALEMAN' 就可以保證正確的去重數據
select disdintc deptno? from (
select? empno,deptno? from emp where mgr = 7684
UNION? ALL
select? empno,deptno? from emp where job = 'SALEMAN'
)?
order by deptno;
五、組合相關的行
- 顯示部門為10的員工編碼、姓名、部門名稱和工作地址
select e.deptno,e.ename,e.dname,e.loc
from emp e?
? ? inner join dept d on (e.deptno = d.deptno)
? ?where e.deptno = 10
select e.empno,e.ename,d.dname,d.loc
from emp e,dept d
e.deptno = d.deptno? and? e.deptno = 10
?
六、組合相關的行
(LEFT? ?JOIN)? ? ?( RIGHT? ? JOIN)? ? ? ? ?(INNER? ?JOIN )? ?( FULL? ?JOIN )
自關聯可以采用 left? ?join進行查詢
?
? ?
轉載于:https://www.cnblogs.com/hanxue112253/p/9504836.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的一头扎进sql之多表操作的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: css 学习记录
- 下一篇: iOS:图片相关(19-05-09更)