select語句多表聯合查詢(二)

2021-09-02 23:46:20 字數 1376 閱讀 4403

(所有表都在select語句多表聯合查詢(一)中)

重名處理

我個人覺得重名處理主要處理對於表同名的情況(因為對於不同表存在同屬性這種情況可以通過表名.屬性的方式來區分)

問題一:求有薪水差額的任意兩位教師。

根據題意我們只需要用到乙個表就是teacher表,但要求薪水差額必定要用到兩次薪水這個屬性,我們不妨定義一次teacher表為t1,再定義一次該錶為t2,有了t1.salary和t2.salary我們就可以求薪水是否有差了。顯然,我們要將t1和t2笛卡兒積,然後where後面的條件理想當然的是t1.salary <> t2.salary,但你會發現乙個問題:

會出現一些重複項,比如說第乙個元組,趙四和趙三,第三個元組就是它的重複項,只不過教師的順序對調了下,重複項的存在顯得多餘,所以我們要想乙個辦法把這些重複項過濾掉。仔細觀察這個結果表不難發現,除了salary相等的元組,我們都能在t1.salary > t2.salary的元組中找到其對應的t1.salary < t2.salary的元組,比如說第五個,趙三的薪水大於趙五的薪水,那麼必然有乙個元組是趙五的薪水小於趙三的,也就是第二個元組。除去薪水相等的那幾個元組,剩下的元組可以對半分為t1.salary>t2.salary的元組和t1.salaryt2.salary 也可以是 t1.salary< t2.salary,二者選其一即可。

select t1.tname,t1.salary,t2.tname,t2.salary from teacher t1,teacher t2 where t1.salary > t2.salary;

問題二:求既學過『001』號課程又學過『002』號課程的所有學生的學號

這裡涉及到的屬性有課程號和學號,顯然我們第乙個想到的是sc表。然後有乙個誤區是在寫where條件的時候初學者可能會寫c# = '001' and c# = '002',事實上這是不可行的,這跟程式設計中的「二義性」有點類似,你到底是要我去找001還是找002呢?所以我們得另闢蹊徑,一種方法就是利用重名處理,將sc表分別命名為sc1和sc2,然後笛卡兒積,將兩表通過學號進行連線,於是兩邊都是關於該學號的學生的選課號和選課成績,我們要做的事情就是找到左邊的課程號為『001』以及右邊的課程號為『002』。

select sc1.s# from sc sc1,sc sc2 where sc1.s# =sc2.s# and sc1.c# = '001' and sc2.c# = '002'

總結與歸納:

1.通過找到兩個表的相同屬性來連線兩個表,得到與這個屬性值相關的資訊

2.order by 屬性名 後面如果是公升序排列可不寫(即預設),如果降序需寫desc

3.重名處理通常用於表重名的情況

多表聯合查詢

inner jion 和for all entries 當表比較多或者表之間的關係不能用for all entries時,我們就可以考慮使用inner jion來實現多表聯合查詢 eg select vbak vbeln vbak objnr guebg 開始日期 gueen 結束日期 kunnr ...

多表聯合查詢

inner jion 和for all entries 當表比較多或者表之間的關係不能用for all entries時,我們就可以考慮使用inner jion來實現多表聯合查詢 eg select vbak vbeln vbak objnr guebg 開始日期 gueen 結束日期 kunnr ...

多表聯合查詢

背景 顯示購物訂單。訂單中包含商品的屬性和購物者的部分屬性。使用 傳統方式 vo 運用 多表sql查詢 entity實體類 public class order catch sqlexception e 注 傳參 ordervo 呼叫queryrunner query 方法進行查詢 sql語句的編寫...