之前写了一段报表查询的自助查询sql,领导每月汇报数据都在用,今天突然问我这个数据跟另一张表里的数据怎么对不上呀,按照我的查询会比原始查询多1300多条!妈妈呀!这可是领导每每向上汇报的数据,可能会对部门的规划和安排有影响!于是马上仔细查看,搞了2个多小时,才发现是join的问题。
于是看了join的相关知识点,整理如下: 数据库中的连接(Join)是一种机制,用于查询两个或多个表中的数据,基于这些表之间的关系。以下是常见类型的连接:
-
内连接 (INNER JOIN)
- 返回两个表中有匹配的记录。
- 如果某行在一个表中有匹配而在另一个表中没有,则该行不会出现在结果集中。
-
左外连接 (LEFT OUTER JOIN)
- 返回左表中的所有记录,即使右表中没有匹配。
- 如果左表中的行在右表中没有找到匹配,则这些行将与右表中的“空”(NULL)值一起返回。
-
右外连接 (RIGHT OUTER JOIN)
- 返回右表中的所有记录,即使左表中没有匹配。
- 如果右表中的行在左表中没有找到匹配,则这些行将与左表中的“空”(NULL)值一起返回。
-
全外连接 (FULL OUTER JOIN)
- 返回左表和右表中的行,无论它们是否有匹配。
- 如果某个表中的行在另一个表中没有匹配,那么该行仍会出现在结果集中,并与另一个表中的“空”(NULL)值组合。
-
交叉连接 (CROSS JOIN)
- 也被称为笛卡尔乘积。
- 返回第一个表中的每一行与第二个表中每一行的组合。
- 如果两个表分别有N行和M行,那么结果集将有N×M行。
-
自然连接 (NATURAL JOIN)
- 基于两个表中具有相同名称的所有列自动执行连接。
- 只返回那些在两个表中都有匹配值的列。
-
条件连接
- 使用特定的
ON子句或者USING子句来指明连接条件。
- 使用特定的
-
自连接 (SELF JOIN)
- 不是一种独立的连接类型,而是任何上述类型的连接应用于同一个表。
不同的数据库系统可能支持不同的连接语法和类型。这些连接类型通常通过SQL(结构化查询语言)进行实现。
原因
我查询的时候使用的left join,导致了同名服务,不同分组之间数据的冗余
解决
讲left join换成inner join,只匹配相应的数据,查询的数据与另一张表基本吻合
提示
整体是一个小的运维问题,但是有可能造成大的影响,引以为戒吧。也从侧面提醒了我数据库知识的匮乏,技术之路如漫漫长夜,慢慢摸索吧。