最近在做各類小應用,用到了mysql,有時候會用到一些比較複雜的巢狀查詢,在研究怎麼通過sql實現這些。
假設下面這張表(stu)描述學生的基本資訊:
idname
grade
1jim72
tom8
3cake9…
……另外一張表(sco)描述學生的成績資訊:
stu_id
subject
score
1math782
math833
physics90…
……現在想查詢七年級學生的數學成績,那麼sql語句應該這麼寫:
兩個表都有過濾條件,博主在實際應用場景下,兩個表要複雜得多,而且過濾條件也多,於是在想有沒有辦法先select出兩張表,然後再join。從效能上說,先過濾也有利於後續join的過程。當然,資料庫對這些肯定有相應優化。我們還是回歸到乙個基本問題, 兩個子查詢怎麼樣進行join呢?select * from stu left
join sco on stu.id = sco.stu_id where stu.grade = 7
and sco.subject = "math";
注意在上面的例子當中,兩個子查詢的寫法,查詢語句括起來,緊跟乙個表的臨時命名。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不支援全外連線,如果要對上面的表進行全外連線,怎麼辦呢?
思路也簡單,先左外連線,再右外連線,最後求並。
單從語句上看起來,有點複雜。事實上,sql功能強大,可以實現許多複雜業務的查詢。在實際場景,其實很容易遇到這樣的情形。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巢狀查詢
訂單表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 想要...