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 等中工作。
相关文章
使用 Mysqldump 备份 MySQL 中的数据
发布时间:2023/05/09 浏览次数:192 分类:MySQL
-
本篇文章将介绍如何使用 mysqldump 只备份数据。 在这里,我们将探讨 --no-create-info 、--compact 、--skip-triggers 和 --no-create-db 选项。
更新 MySQL 表中的主键
发布时间:2023/05/09 浏览次数:61 分类:MySQL
-
本篇文章介绍如何更新 MySQL 表中的主键。 我们将使用 ALTER 命令对主键进行任何更改。更新 MySQL 表中的主键 我们可以在多种情况下更新 MySQL 表中的主键。
在 MySQL 中获取命令历史记录
发布时间:2023/05/09 浏览次数:150 分类:MySQL
-
本文重点介绍了在 Windows 和 Linux 中获取我们已执行的 MySQL 命令历史记录的各种方法。MySQL命令历史
Oracle 的 decode 函数在 MySQL 中的等价物
发布时间:2023/05/09 浏览次数:115 分类:MySQL
-
本篇文章介绍了三种替代实现,我们可以将它们用作 MySQL 中 Oracle 的 decode() 函数的等价物。 为此,我们将使用 IF()、CASE 以及 FIELD() 和 ELT() 的组合。
使用 Ubuntu 连接远程 MySQL 服务器的不同方法
发布时间:2023/05/09 浏览次数:97 分类:MySQL
-
在本文中我们将学习如何使用 Ubuntu 连接远程 MySQL 服务器来操作数据以及启动和停止 MySQL 服务器。
在 Linux 中安装 MySQL 客户端
发布时间:2023/05/09 浏览次数:72 分类:MySQL
-
在 Linux 中安装 MySQL 客户端的命令。Linux 和 Unix 等环境作为命令行界面工作,仅在命令的帮助下运行。
在 MySQL 中转换为十进制
发布时间:2023/05/09 浏览次数:150 分类:MySQL
-
有时,我们可能需要将一种数据类型转换为另一种数据类型。 下面是我们如何使用带有 DECIMAL(M,D) 的 CAST() 和 CONVERT() 函数在 MySQL 中转换为十进制。
在 MySQL 中获取当前日期和时间
发布时间:2023/05/09 浏览次数:145 分类:MySQL
-
本篇文章我们将学习 NOW()、CURRENT_TIMESTAMP()(也写为 CURRENT_TIMESTAMP)和 SYSDATE() 来获取 MySQL 中的当前日期和时间。 我们还将看到这三个功能之间的比较。在 MySQL 中获取当前日期和时间
更改 MySQL 服务器中的 max_allowed_packet Size
发布时间:2023/05/09 浏览次数:142 分类:MySQL
-
本篇文章介绍如何更改 MySQL 服务器中的 max_allowed_packet 大小。 为了了解这一点,我们将使用两个操作系统,Windows 10 和 Linux (Ubuntu)。