小石頭課堂(二)子查詢
還記得上次我總結select語句查詢順序及連接查詢時我說過個人認爲連接查詢很垃圾,就是能用連接查詢的情況都能用子查詢做到,而且從邏輯來說:子查詢要容易理解的多,好了閒言少敘,下面我就淺談一下最近學的子查詢,供大家參考,也希望有不同意見的朋友能提出來,大家一起學習進步。
子查詢分爲非相關子查詢及相關子查詢,另一方面來說有分爲單行返回與多行返回,先說非相關子查詢:
所謂費相關子查詢就是子查詢與父查詢沒關係,簡單說就是都是一個單獨的查詢語句且從邏輯上說都能執行出來,舉例子:
表內容如上圖:
下面我們開始查詢,
1、 查詢部門平均工資高於30號部門平均工資的部門及該部門的平均工資:
select deptno, avg(salary) from emp_ygroup by deptno having avg(salary)>(select avg(salary) from emp_y wheredeptno=30);
其中子查詢中語句布衣懶於父查詢的條件,這就是非相關子查詢、子查詢返回結果只有一條所以也是單行返回的。
2、 查詢工資等於所屬部門平均工資的姓名、部門及工資:
select ename,deptno,salary from emp_y where(deptno,salary) in (select deptno,avg(salary) from emp_y group by deptno);
多行返回的非相關子查詢。
再說相關子查詢:
3、 查詢工資大於該部門平均工資的人員及工資
select ename,salary from emp_y a wherea.salary>(select avg(salary) from emp_y b where b.deptno=a.deptno);
可以看出,要想查出工資大於該部門平均工資的人員,每當你取出一條記錄進行查詢時你必須用到該記錄的部門號,因爲每次都要計算該部門的平均工資,因此,子查詢中的平均工資就和父查詢有了聯繫,這就是相關子查詢。
同理相關子查詢也有單行和多行返回值,道理同非相關子查詢,在這裏我就不再羅嗦了。
再者子查詢的位置也很靈活如:
select ename,nvl((select ename from emp_y bwhere a.manager=b.empno),'boss') from emp_y a;(查詢每個員工及其老闆)
select ename,salary from emp_y a,(selectdeptno,avg(salary) avgsal from emp_y group by deptno) b where a.deptno=b.deptnoand salary>avgsal;
(查詢工資大於該部門平均工資的人員)(在from後的子查詢必須起別名)。
Update s_emp_new a set ann_sal=(selectann_sal*(1+ticheng/100) from e_emp_comm b where a.id=b.id ) where id in(select id from e_emp_comm);(更新有關兩個表的記錄時用關聯子查詢)
Exists關鍵字:
在 查詢系列的最後,我再說一下exists關鍵字,不得說一下,個人認爲exists幾乎是查詢裏面萬能的,也是最不容易理解的,想理解就必須弄懂它的執行順序,說實話我還不是太懂它,就理解的表面的意思,再這就斗膽說出來我個人對他的理解及應運吧:
其實說白了查詢語句select後面是我們想要的字段,from是查詢的範圍,where和hanving分別是約束條件,我們要做的就是將符合條件的查詢出來,它操作的方式就是當約束條件爲真是將查詢的字段顯示出來,而exists就是結合子查詢返回ture或者false,對一切條件都能做出返回,因此可以說是萬能的了,下面舉具體的例子說明:
select dname from dept_y a where[not]exists(select * from emp_y b where a.deptno=b.deptno);(查詢[沒]有員工的部門名)
由於該子查詢就是返回真或者假,因此查詢哪些字段也就沒意義,所以一般用select * 。。。分析該語句的執行順序是先從dept_y 中拿出一條記錄(記做a)候着,再執行子查詢,從emp_y中拿出一條記錄(記做b),再執行vwhere 當記錄a中deptno=記錄b中deptno時,說明該員工在該部門,也就是該部門有員工。再接着dept_y中區下一條記錄如此循環至結束。注意:用exists時當子查詢返回真時子查詢就不再繼續查詢下去,而是跳出來執行父查詢下一條記錄。
好了,關於查詢我也就是知道這麼多了,很斗膽的拿出來了,對你有用呢就看看,沒用呢也別噴本來就是初學者,只不過寫出來共勉罷了。
本文提供者:懷念@那片藍 QQ448661040