sql複雜巢狀查詢

2021-07-11 13:05:29 字數 1361 閱讀 1943

最近在做各類小應用,用到了mysql,有時候會用到一些比較複雜的巢狀查詢,在研究怎麼通過sql實現這些。

假設下面這張表(stu)描述學生的基本資訊:

idname

grade

1jim72

tom8

3cake9…

……另外一張表(sco)描述學生的成績資訊:

stu_id

subject

score

1math782

math833

physics90…

……現在想查詢七年級學生的數學成績,那麼sql語句應該這麼寫:

select * from stu left

join sco on stu.id = sco.stu_id where stu.grade = 7

and sco.subject = "math";

兩個表都有過濾條件,博主在實際應用場景下,兩個表要複雜得多,而且過濾條件也多,於是在想有沒有辦法先select出兩張表,然後再join。從效能上說,先過濾也有利於後續join的過程。當然,資料庫對這些肯定有相應優化。我們還是回歸到乙個基本問題, 兩個子查詢怎麼樣進行join呢?

select * from 

(select * from stu where grade = 7) s

left

join

(select * from sco where subject = "math") t

on s.id = t.stu_id;

注意在上面的例子當中,兩個子查詢的寫法,查詢語句括起來,緊跟乙個表的臨時命名。

再寫個複雜的例子,我們知道mysql不支援全外連線,如果要對上面的表進行全外連線,怎麼辦呢?

思路也簡單,先左外連線,再右外連線,最後求並。

select * from 

(select * from stu where grade = 7) s

left

join

(select * from sco where subject = "math") t

on s.id = t.stu_id

union

select * from

(select * from stu where grade = 7) s

right

join

(select * from sco where subject = "math") t

on s.id = t.stu_id

單從語句上看起來,有點複雜。事實上,sql功能強大,可以實現許多複雜業務的查詢。在實際場景,其實很容易遇到這樣的情形。

SQL巢狀查詢

訂單表orders 顧客表 customers 訂單商品表orderitems 列出訂購物品rgan01的所有顧客 select cust name,cust contact from customers where cust id in select cust id from orders whe...

sql複雜查詢

今天在review同事的 的時候,碰到乙個比較頭疼的資料庫查詢。例如,我想查列a的結果,但我要根據b列的值的情況來確定a列的輸出,說白了就是我可以自己控制得到的輸出。這個情況有兩種方法來實現。第一種是decode,這個關鍵字似乎只是oracle支援。而且也沒有解決我的問題,因為我覺得他類似於邏輯中的...

SQL 複雜查詢

近期碰到需要取日期最小的不同條件記錄的問題,請各位xdjm賜教!表a 表a 序號 材料 數量 入庫日期 1 a 8 2009 12 12 a 9 2009 12 53 b 12 2009 11 184 b 10 2009 11 195 c 5 2009 10 96 c 13 2009 11 8 想要...