sql的case when和left join

總結一下昨天寫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_detailsproductRid爲空,如果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'

儘量不要使用字符串的形式比較,比較方法可以參考這篇文章

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章