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语句解决复杂问题
SQL反模式学习笔记15 分组的更多相关文章
- SQL反模式学习笔记1 开篇
什么是“反模式” 反模式是一种试图解决问题的方法,但通常会同时引发别的问题. 反模式分类 (1)逻辑数据库设计反模式 在开始编码之前,需要决定数据库中存储什么信息以及最佳的数据组织方式和内在关联方式. ...
- SQL反模式学习笔记5 外键约束【不用钥匙的入口】
目标:简化数据库架构 一些开发人员不推荐使用引用完整性约束,可能不使用外键的原因有一下几点: 1.数据更新有可能和约束冲突: 2.当前的数据库设计如此灵活,以至于不支持引用完整性约束: 3.数据库为外 ...
- SQL反模式学习笔记3 单纯的树
2014-10-11 在树形结构中,实例被称为节点.每个节点都有多个子节点与一个父节点. 最上层的节点叫做根(root)节点,它没有父节点. 最底层的没有子节点的节点叫做叶(leaf). 中间的节点简 ...
- SQL反模式学习笔记2 乱穿马路
程序员通常使用逗号分隔的列表来避免在多对多的关系中创建交叉表, 将这种设计方式定义为一种反模式,称为“乱穿马路”. 目标: 存储多属性值,即多对一 反模式:将多个值以格式化的逗号分隔存储在一个字段中 ...
- SQL反模式学习笔记4 建立主键规范【需要ID】
目标:建立主键规范 反模式:每个数据库中的表都需要一个伪主键Id 在表中,需要引入一个对于表的域模型无意义的新列来存储一个伪值,这一列被用作这张表的主键, 从而通过它来确定表中的一条记录,即便其他的列 ...
- SQL反模式学习笔记6 支持可变属性【实体-属性-值】
目标:支持可变属性 反模式:使用泛型属性表.这种设计成为实体-属性-值(EAV),也可叫做开放架构.名-值对. 优点:通过增加一张额外的表,可以有以下好处 (1)表中的列很少: (2)新增属性时,不需 ...
- SQL反模式学习笔记7 多态关联
目标:引用多个父表 反模式:使用多用途外键.这种设计也叫做多态关联,或者杂乱关联. 多态关联和EAV有着相似的特征:元数据对象的名字是存储在字符串中的. 在多态关联中,父表的名字是存储在Issue_T ...
- SQL反模式学习笔记8 多列属性
目标:存储多值属性 反模式:创建多个列.比如一个人具有多个电话号码.座机号码.手机号码等. 1.查询:多个列的话,查询时可能不得不用IN,或者多个OR: 2.添加.删除时确保唯一性.判断是否有值:这些 ...
- SQL反模式学习笔记9 元数据分裂
目标:支持可扩展性.优化数据库的结构来提升查询的性能以及支持表的平滑扩展. 反模式:克隆表与克隆列 1.将一张很长的表拆分成多张较小的表,使用表中某一个特定的数据字段来给这些拆分出来的表命名. 2.将 ...
随机推荐
- 如何破解加密了的word文档
https://blog.csdn.net/huangbaokang/article/details/79630223 变成xml文件格式之后--查找在documentProtection前面加上un ...
- 欧拉筛法模板and 洛谷 P3383 【模板】线性筛素数(包括清北的一些方法)
题目描述 如题,给定一个范围N,你需要处理M个某数字是否为质数的询问(每个数字均在范围1-N内) 输入格式 第一行包含两个正整数N.M,分别表示查询的范围和查询的个数. 接下来M行每行包含一个不小于1 ...
- jenkins拉源码设置参数化构建选项为tagname
安装插件:https://mirrors.tuna.tsinghua.edu.cn/jenkins/plugins/jquery/1.12.4-0/jquery.hpi 安装插件:https://mi ...
- 爬虫保存cookies时重要的两个参数(ignore_discard和ignore_expires)的作用
两个参数的作用: 官方的解释: ignore_discard: save even cookies set to be discarded. ignore_expires: save even coo ...
- python 网络编程之TCP传输&粘包传输
只有TCP有粘包现象,UDP永远不会粘包. 所谓粘包问题主要还是C/S两端数据传输时 因为接收方不知道消息之间的界限,不知道一次性提取多少字节的数据所造成的 根本原因:粘包是由TCP协议本身造成的,T ...
- crontab 误删恢复
某台服务器某账号的 crontab 任务被清空,原因不明.同时,该服务器上的 crontab 任务备份未开启.故思考如何恢复 crontab 任务. 经查,CentOS 系统的 crontab 任务的 ...
- 【Nuxt】配置路由
export default ({store, redirect} => { if (!store.state.username) { redirect('/') } }) vuex 代码处理请 ...
- 通过命令修改mysql的提示符
在cmd窗口操作mysql数据库的时候,前面的提示符永远都是mysql>,这个提示符可以通过命令修改. 在登录mysql时修改: mysql -uroot -p --prompt 提示符 登录后 ...
- 第四周结对项目总结及改进(ui/web)
项目介绍 随着社会科技的进步和多媒体教育的日益发展,越来越来的学生正在接受着新时代下的教育模式,而且手机.电脑等科技产品的普及以及其带来的更高效更便捷的模式 使得它们成为当代学生学习中的一种很好的学习 ...
- CF1119C Ramesses and Corner Inversion
题目地址:CF1119C Ramesses and Corner Inversion 将两个矩阵异或起来,为 \(1\) 的位置就是需要修改的位置 注意到每一次操作都会导致两行和两列上有两个数被修改 ...