小石頭課堂(二)子查詢

小石頭課堂(二)子查詢

還記得上次我總結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是查詢的範圍,wherehanving分別是約束條件,我們要做的就是將符合條件的查詢出來,它操作的方式就是當約束條件爲真是將查詢的字段顯示出來,而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 當記錄adeptno=記錄bdeptno時,說明該員工在該部門,也就是該部門有員工。再接着dept_y中區下一條記錄如此循環至結束。注意:用exists時當子查詢返回真時子查詢就不再繼續查詢下去,而是跳出來執行父查詢下一條記錄。

      好了,關於查詢我也就是知道這麼多了,很斗膽的拿出來了,對你有用呢就看看,沒用呢也別噴本來就是初學者,只不過寫出來共勉罷了。    

                                                                                                                                                                                                                     本文提供者:懷念@那片藍 QQ448661040

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章