多表查詢練習一
通過對多表查詢的
合并結(jié)果集、
連接查詢以及
子查詢的學習,下面我們來練習多表查詢,如下所示:
(1)查詢至少有一個員工的部門,并顯示部門編號、部門名稱、部門位置、部門人數(shù):
- 查詢結(jié)果集包含的列:deptno,dname,loc,部門人數(shù);
- 查詢的表:dept,emp;
- 查詢條件:dept.deptno=emp.deptno,部門中至少有一個員工,即部門人數(shù)大于或等于1;
- 第一步:獲得每個部門的信息,對應sql語句是:select * from dept;
- 第二步:獲取每個部門的人數(shù),利用分組查詢,對應的sql語句是:select deptno,count(*) from emp group by deptno;
- 第三步:使用內(nèi)連接查詢以上兩步的結(jié)果集,獲取每個部門的編號,名稱,位置及部門人數(shù)。
通過分析可知,對應的sql語句是:
FROM
dept d,(SELECT deptno,COUNT(*) FROM emp GROUP BY deptno) e
以上語句中,查詢的列不能寫成e.count(*),最好在子查詢中給count(*)起一個別名,如下所示:
d.*,e.cnt
FROM
dept d,(SELECT deptno,COUNT(*) cnt FROM emp GROUP BY deptno) e
將以上sql語句執(zhí)行,如圖1-1所示:
圖1-1 多表查詢練習1
圖1-1中,查詢語句中雖然沒有指定部門人數(shù)至少為一人,但是仍然是將部門人數(shù)大于0人的部門查詢出來,原因是,內(nèi)連接只會查詢滿足條件的記錄,dept表中的40部門在emp表中不存在員工,因此不滿足d.deptno=e.deptno這個條件,所以該部門就被過濾掉。
(2)查詢所有員工的姓名及其直接上級的姓名:
- 查詢結(jié)果集包含的列:員工姓名,上級姓名;
- 查詢的表:上級也屬于員工,因此要查詢的表是emp表,并且是兩個emp表,emp e1,emp e2;
- 查詢條件:e1.mgr=e2.empno;
emp表中,有一個員工是沒有上級的,如果這里使用內(nèi)連接,那么該員工的記錄就會被過濾掉,因此這里使用左外連接。
通過分析可知,對應的sql語句是:
e1.ename,e2.ename
FROM
emp e1 LEFT OUTER JOIN emp e2
ON
將以上sql語句執(zhí)行,如圖1-2所示:
圖1-2 多表查詢練習2
使用左外連接查詢,左表是e1,因此e1表中的所有員工姓名都被查詢出來,e2表中不滿足條件的位置用null代替。
本文版權歸傳智播客人工智能+Python學院所有,歡迎轉(zhuǎn)載,轉(zhuǎn)載請注明作者出處。謝謝!
作者:傳智播客人工智能+Python學院