在本教程中,我们将演示如何使用SQL INNER JOIN
子句来查询来自两个或多个表的数据。
1. SQL INNER JOIN子句简介
到目前为止,您已经学习了如何使用SELECT语句从单个表中查询数据。 但是,SELECT
语句不限于从单个表中查询数据。 SELECT
语句可以将多个表链接在一起。
连接表的过程称为Join
。 SQL提供了多种连接,如内连接,左连接,右连接,全外连接等。本教程重点介绍内连接。
内部连接子句通过两列之间的关系链接两个(或更多)表。 无论何时使用内连接子句,通常都要考虑交集。
通过一个简单的例子来理解内连接概念要容易得多。
假设有两个表:A
和B
。
表A
有四行:(1,2,3,4),表B
有四行:(3,4,5,6)
当表A
使用内部联接与表B
连接时,我们得到结果集(3,4),它是表A
和表B
的交集。
更多教程请访问http://www.manongzj.com
对于表A
中的每一行,内部连接子句查找表B
中的匹配行。如果匹配行,则它将包含在最终结果集中。
假设A&B
表的列名是n
,以下语句说明了内连接子句:
SELECT
A.n
FROM A
INNER JOIN B ON B.n = A.n;
INNER JOIN
子句出现在FROM
子句之后。 在ON
关键字之后指定表A
和表B
之间匹配的条件。这种情况称为连接条件,即B.n = A.n
INNER JOIN
子句可以连接三个或更多表,只要它们具有关系,通常是外键关系。
例如,以下语句说明了如何连接3
个表:A
,B
和C
:
SELECT
A.n
FROM A
INNER JOIN B ON B.n = A.n
INNER JOIN C ON C.n = A.n;
2. SQL INNER JOIN示例
SQL INNER JOIN 2个表的示例
我们将使用employees
和departments
表来演示INNER JOIN
子句的工作原理。这两个表的结构和关系如下所示:
每个员工都属于一个且只有一个部门,而每个部门可以拥有多个员工。 员工和部门表之间的关系是一对多的。
employees
表中的department_id
列是将员工链接到departments
表的外键列。
要获取部门ID为:1
,2
和3
的信息,请使用以下语句。
SELECT
department_id,
department_name
FROM
departments
WHERE
department_id IN (1, 2, 3);
执行上面查询语句,得到以下结果 -
+---------------+-----------------+
| department_id | department_name |
+---------------+-----------------+
| 1 | 管理 |
| 2 | 市场营销 |
| 3 | 采购 |
+---------------+-----------------+
3 rows in set
请注意,在WHERE子句中使用IN运算符来获取department_id
为1
,2
和3
的行。
要获取在部门ID为:1
,2
和3
中工作的员工的信息,请使用以下查询:
SELECT
first_name,
last_name,
department_id
FROM
employees
WHERE
department_id IN (1, 2, 3)
ORDER BY
department_id;
执行上面查询语句,得到以下结果 -
要组合这两个表中的数据,请使用内部连接子句,组成成以下查询:
SELECT
first_name,
last_name,
employees.department_id,
departments.department_id,
department_name
FROM
employees
INNER JOIN
departments ON departments.department_id = employees.department_id
WHERE
employees.department_id IN (1 , 2, 3);
执行上面查询语句,得到以下结果 -
对于employees
表中的每一行,该语句检查department_id
列的值是否等于departments
表中department_id
列的值。
如果满足条件employees.department_id = departments.department_id
,则employees
和departments
表中行的数据的组合行将包含在结果集中。
请注意,employees
和departments
表都具有相同的列名department_id
,因此我们必须使用语法table_name.column_name
限定department_id
列。
SQL INNER JOIN 3个表的示例
每个员工都有一个工作岗位,而一个工作岗位可能会有多个员工。 jobs
表和employees
表之间的关系是一对多的。
以下数据库图说明了employees
, departments
和 jobs
表之间的关系:
以下查询使用内部联接子句连接3
个表:员工,部门和工作岗位,以获取在部门ID为:1
,2
和3
中工作的员工的名字,姓氏,职位和部门名称。
SELECT
first_name, last_name, job_title, department_name
FROM
employees e
INNER JOIN departments d ON d.department_id = e.department_id
INNER JOIN jobs j ON j.job_id = e.job_id
WHERE
e.department_id IN (1, 2, 3);
执行上面查询语句,得到以下结果 -
通过上面的学习,现在您应该了解SQL INNER JOIN
子句如何工作,并知道如何应用它来查询来自多个表的数据。