SQL語句inner join 與left join的區別,innerjoin

來源:互聯網
上載者:User

SQL語句inner join 與left join的區別,innerjoin

項目需求變更,之前寫的一條查詢SQL,需要修改一下,噁心了半天也沒改好,最後想來想去,拼來拼去(拼接SQL),原來直接把inner join改成left join就OK了。

寫完之後那個感慨呀!真是為有源頭活水來啊,什麼最好的編程習慣就是想好之後再動手,大道至簡,大愛無邊……


苦逼之後,還是要出來分享經曆的。


簡而言之,需求大概是這樣:

產品都是分期賣的,當然,產品都會有生效、失效,一個產品對應多個庫存,一個庫存對應到具體一天,每一個庫存都會對應一個價格。要求顯示所有庫存中價格最低的產品。

開始,需求是銷售完的產品就不顯示了。

                               


乍一看,你一定覺得這很簡單啊,inner join 庫存表後,group by一下產品編號就OK了。可是你有沒有想過,這樣查詢來的價格與庫存是不準確的。產品與庫存的關係是一對多,只能group by 產品編號,而最低價格和庫存量沒辦法同時對應的(可以度娘Group By的用法)。

寫出來也就是下面的SQL:

SELECTp.*,MIN(s.price) as priceFROMhc_product pINNER JOIN hc_stock s ON p.productId=s.productId AND s.stockNum>0 and s.effectDay>NOW()group by p.productId


現在需求改了,需要將庫存為空白的產品也顯示出來,並標註上“該產品已售完”。思路如下:

我以產品表為主表,查詢庫存量大於零的在有效期間內的產品,而與庫存表之間是左串連,這時就能夠查詢上來數量為空白的產品,庫存欄位不是0,而是null,然後以產品編號進行分組,按照上面的條件,就能夠查詢上來所有的產品,庫存為0的產品,庫存量即為null。

SELECTp.*,MIN(s.price) as priceFROMhc_product pLEFT JOIN hc_stock s ON p.productId=s.productId AND s.stockNum>0 and s.effectDay>NOW()group by p.productId


PS1:查詢條件有效期間和產品數量,要寫在串連查詢後面,也就是ON後面。這樣寫,能夠將到期的、但是未失效的產品,查詢上來。也就是能夠查詢上來所有的產品(產品不分庫存,只要有該產品,都能查詢上來)。如果條件寫在where後面,那麼到期的產品將過濾調,不再查詢上來。


PS2:inner Join就簡單多了,它會查詢上來兩個表的條件都滿足的記錄。


PS3:到期的產品有產品表中的屬性“是否有效”統一控制。


查詢結果沒有附圖,大家看的可能不是很清晰,年底了項目一直處於緊繃的狀態。DEMO沒顧上做,過幾天,我會附的。

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.