sql的casewhen和leftjoin
总结⼀下昨天写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'数量',
pe
WHEN'01'THEN
'仓库备货'
WHEN'02'THEN
'直运客户'
END AS'采购类型',
s.`name`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
sql left join 多表连接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'
ate_date BETWEEN'2019-01-01 00:00:00'
AND'2019-05-01 00:00:00'
ORDER BY
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类型的数据进⾏区间范围⽐较时,不要⽤字符串的形式⽐较,⽐如将
写成
尽量不要使⽤字符串的形式⽐较,⽐较⽅法可以参考。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。