MySQL的巢狀查詢

2021-08-29 03:05:45 字數 2744 閱讀 4919

定義我就不說了,子查詢就是內部的查詢,包含子查詢就是外部查詢!也就是說巢狀查詢乙個是內部查詢乙個是外部查詢,而且查詢是由內向外的

提示一下:在group by和order by中的子查詢是沒有意義的!

子查詢的分類:

標量子查詢—返回單個值的查詢

列子查詢—返回單屬性一列的

行子查詢—返回多屬性一行的

錶子查詢—多行多列

標量子查詢可以使用比較運算子(其他的查詢不可單獨使用比較運算子):

「=, >, <, >=, <=, <>(不等於)」

例子:

select * 

from student

where number > (

select count(id)

from student);

上面的子查詢將算出學生的總人數,而外部查詢則是找出number大於學生總人數的學生資訊。重點是這裡的子查詢是乙個標量子查詢,作為乙個對比的例子:

select *

from student

where (number, sid) > (

select count(number), count(sid)

from student);

不是標量子查詢是不能直接使用比較運算子的,上面是乙個錯誤的例子,即使是兩個和兩個相比較也是不對的。

以上是標量子查詢的特殊之處!!!

接下來講子查詢的共有的操作符:

「any(some), all, in(not in), exists(not exists)」

上面這些操作符,無論是哪種子查詢都是可以使用的(包括標量子查詢)

any任何乙個,與乙個比較運算子連用

select * 

from student

where sid > any(

select sid

from student

where sid > 100);

外部查詢中的『sid』大於任意乙個子查詢中的『sid』,那麼該查詢都會返回true。

和它相對的是all

all「所有」,要求大於子查詢結果中的所有值

select * 

from student

where sid > all(

select sid

from student

where sid > 100);

上面例子,只有外部查詢中的sid大於子查詢中的所有的sid才是返回true的元祖。

in(not in)

檢查成員資格,可用於列舉集合

select * 

from student

where (sid, number) in (

select sid, number

from student

where number > 100);

只有外部查詢中的(sid, number)存在於子查詢的結果中時才會返回true。這個外部查詢的屬性個數必須跟子查詢結果的屬性個數一致(可以是任意多個)

可用於列舉型別

select *

from student

where number in (100, 200, 300);

select *

from student

where (sid, number) in ((100, 151), (200, 161), (300, 171));

這就是所以說的in可以用在列舉型別中(其他的操作符都不可以)

exists(not exists)

是乙個邏輯運算子,返回true/false

select * 

from student

where exists(

select *

from student

where number >100);

只要exists包含的子查詢中的結果大於等於一行,那麼exists就返回true!

子查詢差不多就這樣(但是以後要學會優化,畢竟子查詢有點慢不是嗎?)

我們再來講一下關於查詢的條件問題!

對於乙個sql語句,它的篩選條件出現在語句的外部和內部查詢中都是有用的並且需要被計算的,考慮下面的sql語句:

select course_id

from section as s

where semester = 'fall' and year = 2009 and

exists(select *

from section as t

where semester = 'spring' and year = 2010 and s.course_id = t.course_id);

考慮這個語句,我們外部查詢篩選出『fall』和2009兩個關鍵字,然後exists僅僅是乙個邏輯運算子,返回true/false。那麼篩選條件只有外部查詢中的兩個關鍵字嗎?當然不是,我們觀察到內部查詢中還有』s.course_id = t.course_id』,這個語句也會對外部查詢的乙個篩選條件。

也就是說這個sql語句最終的關鍵字有"fall", 2009, 「spring」, 2010.這個自己體會一下子就知道了。

MySQL的巢狀查詢

背景 有時我們在進行sql查詢時,需要用到乙個子查詢的查詢結果作為另乙個查詢的查詢條件或者查詢結果。也是被稱之為sql的子查詢。用法 主要有兩種,一種是放在where查詢子句中使用,另一種是作為查詢結果。測試用到的表 在where查詢子句中使用 比如要查詢部門員工表中員工編號為10005所在的部門員...

MySQL子查詢 巢狀查詢

有三張表分別如下 customers 儲存顧客資訊 orderitems 只儲存訂單資訊,無客戶資訊 orders 儲存訂單號和顧客id 子查詢訓練 訓練1 查詢買了商品為 tnt2 的顧客資訊 子查詢中涉及3張表的訂單。因此分三步,1.在orderitems裡找出tnt2的訂單號 2.在order...

MySQL子查詢 巢狀查詢

子查詢 巢狀在其他查詢中的查詢。有三張表分別如下 customers 儲存顧客資訊 orderitems 只儲存訂單資訊,無客戶資訊 orders 儲存訂單號和顧客id 注意 一般在子查詢中,程式先執行在巢狀在最內層的語句,再執行外層。因此在寫子查詢語句時,可以先測試下內層的子查詢語句是否輸出了想要...