前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SQL反模式学习笔记15 分组

SQL反模式学习笔记15 分组

作者头像
张传宁IT讲堂
发布2019-09-17 17:42:41
1K0
发布2019-09-17 17:42:41
举报

目标:查询得到每组的max(或者min等其他聚合函数)值,并且得到这个行的其他字段

反模式:引用非分组列

  单值规则:跟在Select之后的选择列表中的每一列,对于每个分组来说都必须返回且仅返回一直值。

select ProductId,Max(DateReported) as Latest

from Bugs as b

Join BugProducts as bp

on b.BugId = bp.BugId

Group by ProductId;

  在Group By字句中出现的列能够保证他们在每一组都只有一个值,无论这个组匹配多少行;

Max()等表达式也能保证每组都返回单一的值,即传回参数中的最大值。

如何识别反模式:当输入一个违背了单值规则的查询时,会立刻返回给你一个错误。数据库会返回不同的错误信息。

  在SQLite和MySQL中,有歧义的列可能包含不可预测的和不可靠的数据。

合理使用反模式

  没有歧义的关系叫做“功能依赖”,最常见的就是表的主键和对应的值。

解决方案:使用无歧义的列

  1、只查询功能依赖的列:将有歧义的列排除在查询之外。

  2、使用关联子查询:关联子查询会引用外连接查询,并且根据外联结果查询中的每一条记录最终返回不同的结果。

关联子查询的性能不是最好的,因为外联结查询结果中的每一条记录都会执行一遍关联的子查询。

  3、使用衍生表:使用衍生表来执行子查询,先得到一个临时的结果,然后用这个临时表和原表进行连接查询。

性能相比子查询更好一些。但是数据库必须将临时表得到的记录存在一张临时表中,因此这个方案也不是最好的。

  4、使用Join:创建一个联结查询区匹配哪些可能不存在的记录。这样的查询结果被称为外连接查询。

该方案使用与针对大量数据查询并且可伸缩性比较关键时。能更好的适应数据量的变化,但是难以理解与维护。

  5、对额外的列使用聚合函数。

  6、链接同组所有值:MySQL与SQLite提供了一个叫做Group_Contract()函数,能将这一组中的所有的值连在一起作为单一值返回,

多个值之间用逗号分隔。其他数据库不支持该函数。

结论:遵循单值规则,避免获得模棱两可的查询结果。

SQL反模式,系列学习汇总

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2014-10-14 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档