基本的多表查询模板:
SELECT 列列表 FROM 表1 JOIN 表2 ON 连接条件 JOIN 表3 ON 连接条件 ... WHERE 筛选条件 GROUP BY 分组列 HAVING 分组筛选条件 ORDER BY 排序列
-
SELECT
:指定要查询的列,可以使用逗号分隔多个列。 -
FROM
:指定要查询的表,可以使用逗号分隔多个表。在查询中涉及到的所有表都需要在这里列出。 -
JOIN
:使用JOIN
关键字将表进行连接。根据连接类型,可以使用INNER JOIN
、LEFT JOIN
、RIGHT JOIN
等连接操作符。 -
ON
:在JOIN
子句后面使用ON
关键字指定连接条件,即两个表之间用于匹配行的条件。 -
WHERE
:可选部分,用于指定筛选条件,对结果进行进一步的过滤。 -
GROUP BY
:可选部分,用于指定分组列。通常与聚合函数(如COUNT
、SUM
)一起使用,以便按照分组列对数据进行分组和聚合计算。 -
HAVING
:可选部分,用于对分组后的结果进行筛选。可以使用聚合函数和其他条件来定义筛选条件。 -
ORDER BY
:可选部分,用于指定结果的排序方式。可以按照一个或多个列进行升序或降序排序。
内连接与外连接:
内连接是一种连接方式,它只返回两个表之间满足连接条件的匹配行。在这个查询中,使用INNER JOIN(内连接)
将"dept3"表和"emp3"表连接起来,
连接条件是"dept3"表的"deptno"列与"emp3"表的"dept_id"列相等。只有在这两个列的值匹配的情况下,才会返回结果。
换句话说,内连接只返回那些在两个表中都有对应匹配关系的行,而不会返回任何不匹配的行。在这个查询中,
只有那些在"dept3"表和"emp3"表中都有对应的部门号和部门ID的行才会被包含在结果中。
相比之下,外连接(如左外连接和右外连接)将返回满足连接条件的行以及至少一个表中的所有行,无论是否有匹配。
如果使用外连接,即使某个部门没有对应的员工或某个员工没有对应的部门,也会在结果中显示它们,并将缺失的值用NULL填充。
在查询中,由于使用了内连接,只有那些有匹配关系的部门和员工才会被返回,不会包括任何不匹配的行。
使用别名的好处:
- 缩短了查询语句的长度,使其更易读和理解。
- 当查询涉及多个表时,使用别名可以明确指定要引用的表,避免歧义和冲突。
- 在查询中引用表别名比完整表名更加简洁,尤其是当表名较长或复杂时。
多表查询显式连接与隐式连接:
隐式连接方式容易造成可读性和维护性的问题,并且在更复杂的查询中可能会导致错误或歧义。
因此,推荐使用显式的连接语法,如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 JOIN
。LEFT JOIN
会返回左表的所有行,
即使在右表中没有匹配的行,通过填充NULL
值来表示没有匹配的部分。
3、数据完整性:考虑到数据的完整性,如果某个表的数据是主要数据源,而另一个表的数据只是辅助信息,那么可以将主要数据表作为左表,使用LEFT JOIN
连接辅助表。这样可以确保主要表的所有数据都被包括在结果中。
4、业务逻辑和需求:理解业务逻辑和需求也是判断使用哪种连接的重要因素。仔细分析数据之间的关系和连接条件,并根据业务规则确定是否需要保留非匹配行,或仅返回匹配的行。
总的来说,INNER JOIN
适用于需要返回两个表中完全匹配的行的情况,而LEFT JOIN
适用于需要保留左表中所有行的情况,并可能包含右表中匹配的行。
根据具体的业务需求和数据关系,选择适当的连接类型可以确保查询结果符合预期,并提供所需的数据。
例题链接: MySQL多表查询练习_dlluo的博客-CSDN博客
标签:返回,多表,匹配,查询,MySQL,JOIN,LEFT,连接,小记 From: https://www.cnblogs.com/luojuning/p/17539177.html