資料庫常用SQL語句(三) 子查詢

2022-03-19 20:28:02 字數 2165 閱讀 4027

一、為什麼會使用子查詢

雖然可以通過連線查詢來實現多表查詢資料記錄,但不建議使用,因為連線查詢的效能很差,為什麼呢?我們來進行分析,例如 我們要查詢部門表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字句中。

三、子查詢的具體使用

1.where子句後使用子查詢

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

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

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

對於這種情況,在where子句中就可以使用in,any,all,exists等關鍵字。

2.from子句後使用子查詢

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

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

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

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

1.多表連線,其實就是兩個或兩個以上的表進行連線行成乙個新的關係表,然後再按照操作單錶時的方法來操作這個新的關係表。

2.多表連線時,如果使用子查詢的方式,可以先將多餘的資料剔除,行成我們想要的資料表(可以理解成是乙個虛擬表),然後再進行連線,能夠提高表連線時的效率。

3.多表連線,本質上最後還是單錶操作,所以單錶操作查詢語句一定要掌握透徹,不管多麼複雜的多表連線sql語句,先分清外層查詢是什麼,再看巢狀的子查詢是什麼。

Oracle資料庫 三 子查詢和連線

使用子查詢 什麼是子查詢?子查詢就是巢狀查詢,它是巢狀在另乙個語句中的select語句。在很多情況下,where後面的條件不是乙個確切的值或表示式,而是另外乙個查詢語句的查詢結構。子查詢不僅僅出現在select語句中,也會出現在delete和update語句中,它本質上是where後面的乙個條件表示...

資料庫SQL語句查詢

新手小白菜一枚,求知 查詢所有同學的學號 姓名 選課數 總成績 select t1.stuid,t1.stuname,count t2.courseid sum score from tblstudent t1,tblscore t2 where t1.stuid t2.stuid group by...

資料庫常用查詢語句

1.all表示所有 where a all select b from t where 條件 a滿足所有b的條件 2.order by排序 select from order by company desc desc是降序 asc是公升序 預設事務開啟的作用是什麼?當我們去執行乙個sql語句的時候,...