總結一下昨天寫sql時新接觸到的知識點。
SELECT
c.`name` AS '客戶姓名',
c.customer_adderss AS '客戶地址',
c.phone AS '客戶聯繫電話',
c.serial AS '客戶編碼',
o.material_name AS '物料名稱',
o.material_serial AS '物料編碼',
o.material_single_price AS '物料採購單價',
prostv2.`value` AS '材質',
CASE o.material_unit
WHEN 'double' THEN
'雙'
WHEN 'dozen' THEN
'打'
WHEN 'Pcs' THEN
'Pcs'
......
END AS '單位',
o.material_spec AS '規格型號',
prostv.`value` AS '顏色',
proc.`name` AS '品類',
pros.`name` AS '系列',
o.material_num AS '數量',
CASE pu.type
WHEN '01' THEN
'倉庫備貨'
WHEN '02' THEN
'直運客戶'
END AS '採購類型',
s.`name` AS '供應商名稱',
pu.create_date AS '採購訂單創建日期'
FROM
order_details AS o
LEFT JOIN customer AS c ON c.id = o.customer_rid
LEFT JOIN product AS p ON p.id = o.product_rid
LEFT JOIN product_series AS pros ON pros.id = p.product_series_id
LEFT JOIN product_category AS proc ON proc.id = pros.product_category_id
LEFT JOIN product_series_type_value AS prostv ON prostv.id = p.colour_type_id
LEFT JOIN product_series_type_value AS prostv2 ON prostv2.id = p.material_type_id,
purchase_order AS pu
LEFT JOIN supplier AS s ON s.id = pu.supplier_id
WHERE
pu.`status` != '0'
AND o.purchase_order_id = pu.id
AND o.`status` != '0'
AND pu.create_date BETWEEN '2019-01-01 00:00:00'
AND '2019-05-01 00:00:00'
ORDER BY
pu.create_date DESC;
case when
首先是遇到了爲查詢出來的值設置別名的情況,因爲數據庫存的值和展示給用戶看的值是不一樣的,懂的都懂。這種情況需要使用 case when語句。
簡單總結一下就是:
以case
開頭,然後針對對應的字段匹配不同的值,這些情況寫在 when ... then ...
塊中,最後以end
結尾,並通過as
設置該列的別名。
left join
以前基本沒有用過左連,右連,並不清楚和直接使用where有什麼區別,直到寫這個sql的時候才發現兩者得到的數據結果可能是不同的。可以看一下對比分析。
這裏我比較直觀的感受是,當用一切條件都用where篩選時,可能會比你預期的數據量少,因爲有些條件限制會導致一部分不符合的數據丟失;但是使用left join時,如果你能夠將表正確拼接,就不會出現數據丟失的情況,所以我上面使用了很多left join,實際上拼接出了一張很大的表,將屬性值橫向擴展了很多,但是可以保證在where限制條件下數據量正確無誤。如果把所有條件都放到where中,就會出現一部分數據丟失,比如有一些order_details
的productRid
爲空,如果where中出現o.product_rid = p.id
時,就會過濾掉這些爲空的數據,導致數據量變少。
關於datetime類型的比較
sql中對datetime類型的數據進行區間範圍比較時,不要用字符串的形式比較,比如將
pu.create_date BETWEEN '2019-01-01 00:00:00' AND '2019-05-01 00:00:00'
寫成
pu.create_date > '2019-01-01 00:00:00' AND pu.create_date < '2019-05-01 00:00:00'
儘量不要使用字符串的形式比較,比較方法可以參考這篇文章。