數據庫常用SQL語句(三):子查詢


一、為什么會使用子查詢

雖然可以通過連接查詢來實現多表查詢數據記錄,但不建議使用,因為連接查詢的性能很差,為什么呢?我們來進行分析,例如 我們要查詢部門表t_dept 和雇員表t_employee中的數據記錄,一般可能會寫成:

SELECT * FROM t_dept t1,t_employee t2

      WHERE t1.deptno=t2.deptno;

對於這條SQL語句,在數據庫執行的時候,會先對兩個表進行笛卡爾積操作,然后再選取符合條件 t1.deptno=t2.deptno的數據記錄。由於笛卡爾積時是將兩個表中的記錄數做乘積生成新的記錄,如果當兩個表中的數據記錄都比較多時,進行乘積操作時性能將會很差,甚至造成死機。為了解決該問題,我們可以使用子查詢來實現多表查詢。

二、什么是子查詢

子查詢,就是在一個查詢中嵌套了其他若干查詢,即在一個SELECT查詢語句的FROM或WHERE字句中包含另一個SELECT查詢語句,在這種嵌套的查詢語句中,外層的SELECT查詢語句稱為主查詢,WHERE或FROM中的查詢語句稱為子查詢,也叫嵌套查詢。通過子查詢可以實現多表查詢,子查詢經常出現在WHERE或FROM字句中。

  • WHERE子句中的子查詢:該位置處的子查詢一般返回單行單列,多行單列,單行多列數據。就是返回能夠作為WHERE子句查詢條件的值。
  • FROM子句中的子查詢:該位置處的子查詢一般返回多行多列數據,相當於是返回一張臨時表,符合FROM子句后面是表的規則,就是通過這種方式來實現多表查詢的。

三、子查詢的具體使用

1.WHERE子句后使用子查詢

  a.返回結果為單行單列的子查詢(就是有一個查詢字段一個取值的情況)

  

    

  b.返回結果為單行多列的子查詢(就是有多個查詢字段)

  

  

  c.返回結果為單列多行的子查詢(就是一個查詢字段,有多個值的情況)

  對於這種情況,在WHERE子句中就可以使用IN,ANY,ALL,EXISTS等關鍵字。

  

  

  

  

  

  2.FROM子句后使用子查詢

  FROM子句后的子查詢返回的結果為多行多列的數據記錄,就類似一個虛擬的表,可以使用該種方式實現多表查詢。舉例說明,有以下兩張表:

  

  查詢雇員表t_employee表中各部門中的部門號、部門名稱、雇員人數和平均工資,這些數據位於兩張表中,所以,我們先將兩張表連接起來,然后對連接后的表進行分組查詢,采用連接查詢的實現方式如下:

  

  采用子查詢的方式實現。有了子查詢,由於想要得到的數據時位於兩個表中,所以我們還是需要使用連接來使兩個表建立新的關系,只要連接,就一定是先對兩個表做笛卡爾積操作。但有了子查詢,我們可以將另一張表中需要的數據通過子查詢的方式先查出來,然后再通過連接將結果和另一個表中的結果根據連接條件組合在一起,由於連接之前先做了一次查詢,查詢的結果只是符合要求的數據記錄,而不是所有的,這樣其實就減少了連接時表的數據記錄。這樣一來,笛卡爾積時的數據記錄就會大大減少,我們來看實現方式:

    、

至此,有關單表操作,多表連接查詢方面的一些常用操作就介紹完了,進行總結:

  1.多表連接,其實就是兩個或兩個以上的表進行連接行成一個新的關系表,然后再按照操作單表時的方法來操作這個新的關系表。

  2.多表連接時,如果使用子查詢的方式,可以先將多余的數據剔除,行成我們想要的數據表(可以理解成是一個虛擬表),然后再進行連接,能夠提高表連接時的效率。

  3.多表連接,本質上最后還是單表操作,所以單表操作查詢語句一定要掌握透徹,不管多么復雜的多表連接SQL語句,先分清外層查詢是什么,再看嵌套的子查詢是什么。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM