SQL Server Inner Join 返回同时存在于两个表中的记录(或行),前提是列之间至少有一个匹配项。或者我们可以说,只要 ON 关键字后面的条件为 TRUE,Inner Join 就会返回两个表中存在的记录(或行),并且语法如下所示。
SELECT Table1.Column(s), Table2.Column(s),
FROM Table1
INNER JOIN
Table2 ON
Table1.Common_Column = Table2.Common_Column
--OR We can Simply Write it as
SELECT Table1. Column(s), Table2. Column(s),f
FROM Table1
JOIN
Table2 ON
Table1.Common_Column = Table2.Common_Column
SQL Server Inner 是默认的 join,因此使用 INNER 关键字是可选的。为了更好地理解,让我们看看它的可视化表示。

从上图可以看出,Inner join 只显示 Table1 和 Table2 中匹配的记录(类似于数学中的交集)。在本例中,我们将在数据库中使用两个表。Employee 表中的数据是

SQL Server Department 表中存在的数据是:

SQL Inner Join 选择所有列
以下查询将显示 Employees 和 Department 表中存在的所有列。
SELECT *
FROM [Employee]
INNER JOIN
[Department] ON
[Employee].[DepartID] = [Department].[id]

我将省略 INNER 关键字。
SELECT *
FROM [Employee]
JOIN
[Department] ON
[Employee].[DepartID] = [Department].[id]

如果您观察上面的屏幕截图,尽管 Employee 表中有 15 条记录,但 Inner join 显示了 11 条记录。这是因为 Employee 表中其余四条记录(即 ID 号为 10、11、14 和 15)的 Department Id 为 NULL。
注意:[Department ID] 列重复了两次,这让用户感到烦恼。通过选择单独的列名,我们可以避免不需要的列。因此,请避免使用 SELECT * 语句。
SQL Server Inner Join 选择部分列
请在 SELECT 语句 之后放置您需要的列,以避免在 Inner Join 中出现不需要的列。
SELECT [FirstName]
,[LastName]
,[DepartmentName]
FROM [Employee]
INNER JOIN
[Department] ON
[Employee].[DepartID] = [Department].[id]

如上所示,只要两个表中的列名不同,上面的 Inner Join 查询就能完美运行。如果我们有两个相同的列标题会怎样?嗯,您会陷入混乱。让我们看看如何解决这个问题。
在我们进入解决方案之前,让我给您一个实际示例。如您所见,我们正在使用上述查询,但我们添加了来自 department 表的 id 作为附加列。
SELECT [FirstName]
,[LastName]
,id
,[DepartmentName]
FROM [Employee]
INNER JOIN
[Department] ON
[Employee].[DepartID] = [Department].[id]
从下面的屏幕截图中可以看出,SQL Inner Join 抛出了一个错误:Ambiguous column name id(歧义列名 id)。这是因为 id 同时存在于 employees 和 departments 表中。服务器不知道您要求它检索哪一个。

为了解决这类问题,总是必须在列名之前使用表名。以下查询在列名前使用了 ALIAS 表名。通过这种方法,我们可以告知服务器我们正在寻找属于 department 表的 id。
我们可以将上述 Inner Join 歧义列名错误查询写成如下。
SELECT Emp.[FirstName] AS [First Name]
,Emp.[LastName] AS [Last Name]
,Dept.id
,Dept.[DepartmentName] AS [Department Name]
FROM [Employee] AS Emp
INNER JOIN
[Department] AS Dept ON
Emp.[DepartID] = Dept.[id]

Inner Where Clause (内部 WHERE 子句)
它还允许我们使用 WHERE 子句 来限制其返回的行数。在本例中,我们将 WHERE 子句与 Inner Join 一起使用。
SELECT Emp.[FirstName] AS [First Name]
,Emp.[LastName] AS [Last Name]
,Dept.[DepartmentName] AS [Department Name]
FROM [Employee] AS Emp
INNER JOIN
[Department] AS Dept ON
Emp.[DepartID] = Dept.[id]
WHERE Dept.[DepartmentName] = 'Software Developer' OR
Dept.[DepartmentName] = 'Sr. Software Developer'

SQL Server Inner Join Order By Clause (SQL Server Inner Join 排序子句)
它允许我们使用 Order By 子句来重新排列记录的顺序。
SELECT Emp.[FirstName] AS [First Name]
,Emp.[LastName] AS [Last Name]
,Dept.[DepartmentName] AS [Department Name]
FROM [Employee] AS Emp
INNER JOIN
[Department] AS Dept ON
Emp.[DepartID] = Dept.[id]
ORDER BY [FirstName] ASC
