多表查询中对应关系的汇总规则
多表查询
通过不同表中具有相同意义的关键字段,将多个表进行横向连接,查询不同表中的字段信息。
注:连接两表时,用于连接的字段称为关键字段。
连接方式
- 内连接和外连接(左连接和右连接)
决定多表连接结果的三个属性
- 方向性:在外连接中,写在前面的表为左表,写在后面的表为右表
- 主附关系:主表要出所有的数据范围,附表与主表无匹配项时标记为null,内连接时无主附表之分
- 对应关系:关键字段中有重复值的表为多表,没有重复值的表为一表,它决定连接后的行数是两表对应项乘积的结果
对应关系
由于关键字段中有重复值的表为多表,没有重复值的表为一表,而在一张表中主键是没有重复值的,有重复值的是非主键字段,所以一对一,多对多和一对多的三种对应关系又可分别称为:
- 一对一:主键连主键
- 多对多:非主键连非主键
- 一对多:主键连非主键
一对一
一对一对应关系在实际应用中是最不可能出现的,因为主键是记录单位,表中所有的字段都是围绕主键进行的,所以当两表的主键相同时是可以放在一个表中的。如下面的两张表,当用学员ID进行连接时,是一对一的对应关系,这时两表完全可以合并成一张表。
学员ID | 学员姓名 | 手机号码 |
---|---|---|
1 | 赵大 | 13356781234 |
2 | 王二 | 13256781235 |
3 | 张三 | 13156781236 |
学员ID | 学员性别 |
---|---|
1 | 男 |
2 | 女 |
3 | 男 |
注意: 一对一的连接关系一旦出现就要检查是否合理,此时需要考虑是物理层级的一对一还是真正业务逻辑上的一对一。
若是物理层级上的一对一,且没有重复值,此时需要考虑能不能用一对一的对应关系,如下面新产品上市时的订单表和客户表(用客户ID进行连接),订单表上每一笔订单对应一个客户ID,客户表上客户ID是主键也没有重复值,此时就是一对一的对应关系,但这是假性的一对一,因为随着产品的上市时间增加,一个客户可能会产生多个订单,这样客户ID就有重复值,不能作为订单表的主键,此时订单表和客户表的连接就是多对一的对应关系。
因此,出现一对一的对应关系时,不能只看当前时点的数据,而需要结合实际的业务逻辑进行判断。
订单ID | 客户ID | 订单金额 |
---|---|---|
1 | a | 100 |
2 | b | 100 |
3 | c | 100 |
客户ID | 客户姓名 |
---|---|
a | 赵大 |
b | 王二 |
c | 张三 |
多对多
多对多对应关系在实际应用中可能出现,但是不能用,因为汇总时会出现重复项,如下面的订单表和订单详情表:
(订单表)
订单ID | 客户ID | 订单金额 |
---|---|---|
1 | a | 100 |
2 | a | 100 |
3 | b | 100 |
总计 | 300 |
(订单详情表)
订单ID | 产品ID | 客户ID | 产品金额 |
---|---|---|---|
1 | a-1 | a | 60 |
1 | a-2 | a | 40 |
2 | a-3 | a | 100 |
3 | b-1 | b | 50 |
3 | b-2 | b | 50 |
总计 | 300 |
当用客户ID进行连接时,就是多对多的对应关系,连接结果如下:
订单ID | 客户ID | 订单金额 | 订单ID | 产品ID | 客户ID | 产品金额 |
---|---|---|---|---|---|---|
1 | a | 100 | 1 | a-1 | a | 60 |
1 | a | 100 | 1 | a-2 | a | 40 |
1 | a | 100 | 2 | a-3 | a | 100 |
2 | a | 100 | 1 | a-1 | a | 60 |
2 | a | 100 | 1 | a-2 | a | 40 |
2 | a | 100 | 2 | a-3 | a | 100 |
3 | b | 100 | 3 | b-1 | b | 50 |
3 | b | 100 | 3 | b-2 | b | 50 |
总计 | 800 | 总计 | 500 |
当只考虑连接时,结果是没问题的。但结合到实际的业务场景中,连接的最终目的是为了汇总。而只有连续性的数值才能当度量进行汇总,所以只有订单金额和产品金额能进行汇总。连接后订单金额汇总值是800,产品金额汇总值是500,而连接前订单金额和产品金额的汇总值均为300,这时就会发现连接后的度量会比连接前的度量大,因为连接时都会在另一个表的重复项下翻倍,所以结果都不正确。
一对多
一对多对应关系是正确的连接关系,但也不是所有的汇总值都正确。例如,将上面的订单表和订单详情表的订单ID进行连接时,就是一对多的对应关系,连接结果如下:
订单ID | 客户ID | 订单金额 | 订单ID | 产品ID | 客户ID | 产品金额 |
---|---|---|---|---|---|---|
1 | a | 100 | 1 | a-1 | a | 60 |
1 | a | 100 | 1 | a-2 | a | 40 |
2 | a | 100 | 2 | a-3 | a | 100 |
3 | b | 100 | 3 | b-1 | b | 50 |
3 | b | 100 | 3 | b-2 | b | 50 |
总计 | 500 | 总计 | 300 |
此时,一表中的订单金额汇总值不正确,但多表中的产品金额汇总值是正确的。故在一对多的对应关系下,只能多表出度量(连续型的数值),一表只能提供维度。
本文地址:https://blog.csdn.net/qq_44684133/article/details/107663919
上一篇: mysql-递归查询(二)
下一篇: 太惊喜:黄子韬将出席糖果S11新品发布会