关于SQL的查询一些思考


前言

每当写一个查询需求时候,都在思考如何写,想总结出来一些思维方法。我根据一些实践的经验,粗略划分几种情况。

需求划分
1、多表查询
2、统计查询
3、复合查询

一、多表查询

多表查询,根据关系数据库范式要求,达到第三范式要求,会把一些实体表的很多属性,拆分出来单独成属性表(码表)需要多表查询重新组合起来。还有反映业务信息的业务表(关系表),需要把业务中相关的实体表信息组合起来。

例如:对于某件产品,我们会把我们认为属于非常重要属性,比如颜色和大小属性单独成表,方便维护。
当需要显示产品的所有信息,就需要把它们组合起来。

/*
produce(id,name,color_id,size_id,price)
produce_color(id,name)
produce_size(id,name)
*/
select p.name,
	   c.name,
	   s.name,
	   p.price
from produce p,produce_color c, produce_size s
where 1=1
	  and p.color_id = c.id
	  and p.size_id = s.id

例如:销售记录涉及顾客和商品信息,为了展示业务数据,组合两个实体表的信息。

/*
s
produce(id,name,color_id,size_id,price)
customer(id,name)
sales_records(id,customer_id,produce_id,quantity,salesDate)
*/
select s.id,
	   c.name,
	   p.name,
	   p.price,
	   s.quantity,
	   s.salesDate
from sales_records s,customer c, produce p
where 1=1
	  and s.customer_id = c.id
	  and s.produce_id = p.id

二、统计查询

统计查询一定是group by结合聚合函数。
统计一定是分组、聚合操作,或者叫做合并记录,并统计次数。
例如在产品库统计各种类别产品的数量。

select p.type,p.sum(p.id) as quantity
from produces p
group by p.type

另外having on 是group by 固定搭配属于group by 分组后,对结果集过滤条件,常用是配合count去重操作。如果想了解这些SQL语法,所谓固定搭配之类内容,建议学习一下SQL语法树会有更深刻理解,不用听我啰嗦。
例如:产品库中只有一种产品的类别。

select p.type,count(p.id)as quantity
from produces p
group by p.type
having on count(p.id)=1

也就是统计某类别的产品记录只有一种。1代表只有一条记录。

三、复合查询

复杂的查询,往往是有两个特点,有着复杂的筛选条件,有着需要构建出一个结果集,或者两者皆有。
所以解决问题思路是从要不要构建一个符合查询需求的结果集,要么现在多表查询出来结果集已经满足需求,只需要构建出复杂筛选条件,要么两者皆有。
所以复合查询涉及子查询、嵌套、结果集交并余等情况,还有一种特殊查询,递归查询。
个人常用解决手段,使用视图来简化查询语句,也就是把一些子查询、嵌结果集交并余弄成视图。把复杂问题一步解决,拆成几步来完成,同时方便调试。这一点我是借鉴编程语言面向过程的程序设计思路。

总结

现在忙于工作,看书时间太少,理论知识太少,总觉想得多,自己总结太多,反而不利于进步,慢慢也变得榨不出深刻知识,从学而不思则罔,到思而不学则殆。

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值