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沒顧上做,過幾天,我會附的。