SQL反模式学习笔记15 分组
目标:查询得到每组的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反模式,系列学习汇总
18、SQL反模式学习笔记18 减少SQL查询数据,避免使用一条SQL语句解决复杂问题
最新文章
- 三、jQuery--jQuery基础--jQuery基础课程--第4章 jQuery表单选择器
- 越狱Season 1-Episode 7: Riots, Drills and the Devil: Part 2
- 【Hibernate步步为营】--继承映射具体解释
- 可重入锁(good)
- C#图解教程 第十八章 枚举器和迭代器
- Android读写properties配置文件
- 菜鸟redis初学
- php7 curl返回false error返回空串
- centos 多个yum源,系统怎么选择
- 论文笔记之:SeqGAN: Sequence generative adversarial nets with policy gradient
- Configutation读取properties文件信息
- Java学习笔记:具体解释传值和传引用
- Spring Boot条件注解
- spring boot 2.0+ 错误页面配置
- IOS-网络(GET请求和POST请求、HTTP通信过程、请求超时、URL转码)
- 理解promise 01
- try与catch
- TCP/IP网路协议复习
- 使用stsadm.exe工具实现SharePoint网站备份还原
- 用Eclipse进行java学习的步骤