SQL查询中如何连接三张表
在单个 SQL 中连接三个表
如果大家不熟悉 SQL Join
的概念,查询可能会非常棘手。 SQL 连接一直很棘手,不仅对于新程序员而且对于许多其他从事编程和 SQL 工作超过 2 到 3 年的人来说也是如此。 在 SQL JOIN 上有足够多的东西让一些人感到困惑,包括各种类型的 SQL JOIN,如 INNER
和 OUTER join
,LEFT
和 RIGHT
外连接,CROSS join
等。在所有这些基础知识中,Join 最重要的是,组合多个表 . 如果在一个 SELECT 查询中需要来自多个表的数据,则需要使用子查询或 JOIN。
大多数时候我们只连接两个表,如 Employee 和 Department,但有时大家可能需要连接两个以上的表,一个流行的情况是在 SQL 中连接三个表。
以三表联表为例,表1关联表2,表2关联表3,仔细观察会发现表2是一个联表,包含了表1和表2的主键。 正如我所说,理解三个或更多表的连接可能会非常混乱。
我发现将表关系理解为主键和外键有助于减轻混淆,而不是经典的匹配行范式。
SQL Join也是SQL面试中很热门的话题,一直有一些关于Joins的问题,比如
INNER JOIN
和OUTER JOIN
的区别,用JOIN的SQL查询比如Employee Department关系和LEFT
和RIGHT OUTER JOIN
的区别等等。 简而言之,从经验和面试的角度来看,这是 SQL 中最重要的主题之一。
SQL中的三表JOIN语法
下面是连接三个或更多表的通用 SQL 查询语法。 这个 SQL 查询应该适用于所有主要的关系数据库,如 MySQL、Oracle、Microsoft SQLServer、Sybase 和 PostgreSQL:
SELECT t1.col, t3.col
FROM table1
JOIN table2 ON table1.primarykey = table2.foreignkey
JOIN table3 ON table2.primarykey = table3.foreignkey
我们首先连接表 1 和表 2,这会生成一个临时表,其中包含来自 table1 和 table2 的组合数据,然后将其连接到 table3。 这个公式可以扩展到3个以上的表到N个表,你只需要确保SQL查询应该有N-1条连接语句才能连接N个表。 连接两个表,我们需要 1 个连接语句,连接 3 个表,我们需要 2 个连接语句。

SQL查询连接MySQL中的三个表
为了更好地理解 SQL 查询中 3 个表的连接,让我们看一个示例。 考虑流行的员工和部门模式示例。 在我们的例子中,我们使用了一个名为 Register 的链接表,它将 Employee 链接或关联到 Department。
Employee 表的主键(emp_id)是 Register 表的外键,同理,Department 表的主键(dept_id)是 Register 表的外键。
顺便说一句,掌握 SQL 连接的唯一方法是尽可能多地练习。
为了编写一个 SQL 查询来打印员工姓名和部门名称,我们需要连接 3 个表。 第一个 JOIN 语句将连接 Employee 和 Register 并创建一个临时表,该表将 dept_id 作为另一列。 现在,第二个 JOIN 语句会将此临时表与 dept_id 上的 Department 表连接起来,以获得所需的结果。
这是连接 3 个表的完整 SELECT SQL 查询示例,它可以扩展为连接 3 个或 N 个以上的表。
mysql> SELECT * FROM Employee;
+--------+----------+--------+
| emp_id | emp_name | salary |
+--------+----------+--------+
| 1 | James | 2000 |
| 2 | Jack | 4000 |
| 3 | Henry | 6000 |
| 4 | Tom | 8000 |
+--------+----------+--------+
4 rows IN SET (0.00 sec)
mysql> SELECT * FROM Department;
+---------+-----------+
| dept_id | dept_name |
+---------+-----------+
| 101 | Sales |
| 102 | Marketing |
| 103 | Finance |
+---------+-----------+
3 rows IN SET (0.00 sec)
mysql> SELECT * FROM Register;
+--------+---------+
| emp_id | dept_id |
+--------+---------+
| 1 | 101 |
| 2 | 102 |
| 3 | 103 |
| 4 | 102 |
+--------+---------+
4 rows IN SET (0.00 sec)
mysql> SELECT emp_name, dept_name
FROM Employee e
JOIN Register r ON e.emp_id=r.emp_id
JOIN Department d ON r.dept_id=d.dept_id;
+----------+-----------+
| emp_name | dept_name |
+----------+-----------+
| James | Sales |
| Jack | Marketing |
| Henry | Finance |
| Tom | Marketing |
+----------+-----------+
4 rows IN SET (0.01 sec)
如果您想更好地理解它,请尝试逐步连接表。 因此,与其一次性连接 3 个表,不如先连接 2 个表,然后查看结果表。 这就是如何在关系数据库中的一个 SQL 查询中连接三个表。
顺便说一下,在这个 SQL JOIN 示例中,我们使用了 ANSI SQL,它可以在另一个关系数据库以及 Oracle、SQL Server、Sybase、PostgreSQL 等中工作。
相关文章
在 Pandas 中执行 SQL 查询
发布时间:2024/04/24 浏览次数:1195 分类:Python
-
本教程演示了在 Python 中对 Pandas DataFrame 执行 SQL 查询。
Pandas 中的 Join 和 Merge 有什么区别
发布时间:2024/04/20 浏览次数:72 分类:Python
-
本文将为我们介绍 pandas 中 join 和 merge 方法之间的区别。
如何在 MySQL 中声明和使用变量
发布时间:2024/03/26 浏览次数:115 分类:MySQL
-
当你需要在 MySQL 中的脚本中存储单个值时,最好的方法是使用变量。变量有不同的种类,有必要知道何时以及如何使用每种类型。
在 MySQL 中使用 Mysqladmin 刷新主机解除阻塞
发布时间:2024/03/26 浏览次数:82 分类:MySQL
-
你将了解阻止主机的原因。此外,通过使用 phpMyAdmin 和命令提示符刷新主机缓存来解除阻塞的不同方法和效果。