MySQL多表查询-小记

发布时间 2023-07-09 19:01:00作者: luojun-bokeyuan

基本的多表查询模板:

SELECT 列列表
FROM 表1
JOIN 表2 ON 连接条件
JOIN 表3 ON 连接条件
...
WHERE 筛选条件
GROUP BY 分组列
HAVING 分组筛选条件
ORDER BY 排序列
  • SELECT:指定要查询的列,可以使用逗号分隔多个列。

  • FROM:指定要查询的表,可以使用逗号分隔多个表。在查询中涉及到的所有表都需要在这里列出。

  • JOIN:使用JOIN关键字将表进行连接。根据连接类型,可以使用INNER JOINLEFT JOINRIGHT JOIN等连接操作符。

  • ON:在JOIN子句后面使用ON关键字指定连接条件,即两个表之间用于匹配行的条件。

  • WHERE:可选部分,用于指定筛选条件,对结果进行进一步的过滤。

  • GROUP BY:可选部分,用于指定分组列。通常与聚合函数(如COUNTSUM)一起使用,以便按照分组列对数据进行分组和聚合计算。

  • HAVING:可选部分,用于对分组后的结果进行筛选。可以使用聚合函数和其他条件来定义筛选条件。

  • ORDER BY:可选部分,用于指定结果的排序方式。可以按照一个或多个列进行升序或降序排序。

内连接与外连接:

  内连接是一种连接方式,它只返回两个表之间满足连接条件的匹配行。在这个查询中,使用INNER JOIN(内连接)将"dept3"表和"emp3"表连接起来,

连接条件是"dept3"表的"deptno"列与"emp3"表的"dept_id"列相等。只有在这两个列的值匹配的情况下,才会返回结果。

  换句话说,内连接只返回那些在两个表中都有对应匹配关系的行,而不会返回任何不匹配的行。在这个查询中,

只有那些在"dept3"表和"emp3"表中都有对应的部门号和部门ID的行才会被包含在结果中。

  相比之下,外连接(如左外连接和右外连接)将返回满足连接条件的行以及至少一个表中的所有行,无论是否有匹配

如果使用外连接,即使某个部门没有对应的员工或某个员工没有对应的部门,也会在结果中显示它们,并将缺失的值用NULL填充

  在查询中,由于使用了内连接,只有那些有匹配关系的部门和员工才会被返回,不会包括任何不匹配的行。

使用别名的好处:

  1. 缩短了查询语句的长度,使其更易读和理解。
  2. 当查询涉及多个表时,使用别名可以明确指定要引用的表,避免歧义和冲突
  3. 在查询中引用表别名比完整表名更加简洁,尤其是当表名较长或复杂时。

多表查询显式连接与隐式连接:

  隐式连接方式容易造成可读性维护性的问题,并且在更复杂的查询中可能会导致错误歧义

  因此,推荐使用显式的连接语法,如INNER JOIN,以提高查询的可读性和可维护性,并避免潜在的问题。

例子:隐式改为显式

  隐式SQL语句:

SELECT name, ename
FROM dept3, emp3
WHERE dept_id = deptno;

  显示SQL语句:

SELECT d.name, e.ename
FROM dept3 d
INNER JOIN emp3 e ON d.deptno = e.dept_id;

LEFT JOIN

  当使用左连接(Left Join)时,会返回左表(即在FROM子句中放置在左侧的表)的所有行,

以及与右表(即在LEFT JOIN子句中指定的表)中满足连接条件的行。如果右表中没有与左表匹配的行,则用NULL值填充右表的列。

例句:

SELECT d.deptno, d.name, COUNT(e.eid) AS employee_count
FROM dept3 d
LEFT JOIN emp3 e ON d.deptno = e.dept_id
GROUP BY d.deptno, d.name
ORDER BY employee_count ASC;

  这个查询使用了左连接(LEFT JOIN)。通过LEFT JOIN将"dept3"表和"emp3"表连接起来,连接条件是"dept3"表的"deptno"列

与"emp3"表的"dept_id"列相等。这样,查询会返回所有在"dept3"表中的部门,以及每个部门对应的员工数量。

  如果某个部门在"emp3"表中没有对应的员工记录,则通过左连接,该部门的员工数会被计算为0,并且该部门的信息也会出现在结果中。

这样就能确保返回所有部门的信息,而不仅仅是有员工的部门。返回的是左边的那个报名结构---from

  另外,关于右连接(Right Join),它与左连接相反。右连接会返回右表的所有行,以及与左表中满足连接条件的行。

如果左表中没有与右表匹配的行,则用NULL值填充左表的列。虽然MySQL中没有提供RIGHT JOIN关键字,但可以通过使用左连接的方式来实现右连接。

只需交换左表和右表的顺序,并将连接条件中的表顺序进行调换,就可以实现右连接的效果。

判断什么时候用inner join什么时候用left join

 

  1、需要返回的数据:首先考虑你需要返回的数据集。如果你只需要返回两个表中完全匹配的行,即两个表中都存在的关联记录,那么可以使用INNER JOIN

这种情况下,INNER JOIN将过滤掉不匹配的行,只返回满足连接条件的行。

 

 

  2、保留非匹配行:如果你想要保留左表(第一个表)中没有匹配到右表(第二个表)的行,可以使用LEFT JOINLEFT JOIN会返回左表的所有行,

即使在右表中没有匹配的行,通过填充NULL值来表示没有匹配的部分。

 

 

  3、数据完整性:考虑到数据的完整性,如果某个表的数据是主要数据源,而另一个表的数据只是辅助信息,那么可以将主要数据表作为左表,使用LEFT JOIN连接辅助表。这样可以确保主要表的所有数据都被包括在结果中。

 

 

  4、业务逻辑和需求:理解业务逻辑和需求也是判断使用哪种连接的重要因素。仔细分析数据之间的关系和连接条件,并根据业务规则确定是否需要保留非匹配行,或仅返回匹配的行。

 

  总的来说,INNER JOIN适用于需要返回两个表中完全匹配的行的情况,而LEFT JOIN适用于需要保留左表中所有行的情况,并可能包含右表中匹配的行。

根据具体的业务需求和数据关系,选择适当的连接类型可以确保查询结果符合预期,并提供所需的数据。

例题链接: MySQL多表查询练习_dlluo的博客-CSDN博客