当前位置: 代码迷 >> 综合 >> Coursea-用MySQL管理大数据-Week3
  详细解决方案

Coursea-用MySQL管理大数据-Week3

热度:43   发布时间:2023-12-18 04:47:17.0

1 group by

  • 使用group by 语句时,select语句中只能包含用于集计的列,带集计函数的列,否则即使语句不报错,结果也是跟查询本意所不符合的

  • 由于SQL语句中的执行顺序跟书写顺序并不一致,所以如果尚未运行SELECT语句,则别名或派生字段将不可用(某些数据库系统(如MySQL)已经找到解决此问题的方法)。 另一方面,SELECT是在ORDER BY子句之前执行的。 这意味着大多数数据库系统应该能够在ORDER BY子句中使用别名和派生字段。
    在这里插入图片描述

SQL书写顺序&&执行顺序

2 join

Cartesian product笛卡尔积

2.1 内连接和外连接

在这里插入图片描述

内连接

在这里插入图片描述

左连接

在这里插入图片描述

右连接

在这里插入图片描述

全连接

在这里插入图片描述

并非所有的数据库管理系统都支持外连接,比如MySQL不支持外连接,而Tiradata则支持

连接过程中可能会出现连接项并不是一一对应的关系,如下图中多对多关系中,需要建立第三个表来建立两个表之间的关系,而第一个
在这里插入图片描述

多对多

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
同样地,在一对多关系中,比如一个班级有多个学生,将班级表的主键放置在学生表中当外键,如果将班级表放在左边,学生表放置右端进行左连接,则可能会出现右边学生表中不止一行对应。

2.2 join只是第一步,后面同样需要注意

注意进行表的join只是我们查询的第一步,如果只把注意力放在join上,很可能join过程是对的,后面的查询出错,而且是不报错的错。
如下文中,两图的连接是一模一样的,但是group by时,图1选的是d.dog_guid,而图2选的是c.dog_guid,注意进行左连接时以d表为主,所以此时应该是以d.dog_guid为集计列(图1)。在这里插入图片描述在这里插入图片描述
图2中的数目正是c.dog_guid的数目+1,因为count distinct 时不把NULL计算在内。
在这里插入图片描述

2.3 注意由重复行所引起的笛卡尔积

在这里插入图片描述
可以看到ce225842-7144-11e5-ba71-058fbc01cf0b对应的条目为442行,接着我们分别查看dogs表和users表中的user_guid为ce225842-7144-11e5-ba71-058fbc01cf0b的条目
在这里插入图片描述
分别为17和26,很奇怪是不算,讲道理按照users为主表,应该users里的条目也为442
进一步发现原来17行和26行的数据都是冗余的
在这里插入图片描述
那么根据join的原理,就会产生乘法效应,442=17*26
在这里插入图片描述
看到这一点,也许您现在可以理解为什么一些数据库专家强调术语,以区别于集合论和实际数据库实现。 数据库操作(如联接表的数据库操作)基于集合论,该理论假定表中没有重复的行。 但是在现实生活中,总是有重复的行,如果您不了解结果,可能会导致您误解查询
我希望您从此具有重复连接的示例中记住的重要事情是,表到表的映射关系大于1的重复行和表关系由于关系数据库合并表的方式而对查询结果产生乘法影响 。 如果您编写的查询汇总了很多联接表,则很难捕获到输出您不想要的结果的问题,因为汇总的结果会向您隐藏线索。 为防止这种情况发生,建议您采用以下做法:

  • 1.避免对数据或分析做出假设。 例如,不要仅仅因为某些文档说某列中的所有值都应该是唯一的,而是自己检查一下!
  • 2.在强烈解释汇总计算之前,请始终查看查询的示例输出。 当您的查询需要联接时,请格外小心。
  • 3.当查询需要多层功能或连接时,在将它们组合在一起之前,请检查每个层的输出或首先连接。
  • 4.对所有数据和结果采取健康的怀疑态度。 如果您看到意想不到的东西,请确保在深入理解它或将其纳入其他分析之前先进行探索
  相关解决方案