Sql 简明教程

SQL - Inner Join

SQL Join 子句用于基于公共字段/列合并数据库中多个相关的表。

有两种主要的连接类型: Inner JoinOuter Join 。左连接、右连接、全连接等其他连接只是这两种主要连接的子类型。在本教程中,我们将仅学习内部连接。

The SQL Inner Join

SQL Inner Join 是一种通过检索两表中具有匹配值(公共列中)的记录来合并多个表的连接类型。

它将第一张表的每一行与第二张表的每一行进行比较,以查找满足连接谓词的所有行对。当满足连接谓词时,两个表中的列值会被合并到一张新表中。

innerjoin 1

Explanation

我们来看一个示例场景以便更好地理解。

假设我们有一家公司的员工信息,该信息分散在 EmpDetails 和 Marital status 这两张表中,其中:

  1. EmpDetails 表保存员工 ID、姓名和薪水等详细信息。

  2. MaritalStatus 表保存员工 ID、年龄和婚姻状况详细信息。

innerjoin 2

当我们基于连接谓词 EmpDetails.EmpID = MaritalStatus.EmpID 在这两张表上执行内部连接操作时,最终记录将包含匹配记录的 ID、姓名、薪水、年龄和状态。

Syntax

以下是 SQL 里的内部连接的基本语法:

SELECT column_name(s)
FROM table1
INNER JOIN table2
ON table1.column_name = table2.column_name;

Example

假设我们使用以下查询创建了一张名为 CUSTOMERS 的表,其中包含客户的个人详细信息,包括他们的姓名、年龄、地址和薪水等:

CREATE TABLE CUSTOMERS (
   ID INT NOT NULL,
   NAME VARCHAR (20) NOT NULL,
   AGE INT NOT NULL,
   ADDRESS CHAR (25),
   SALARY DECIMAL (18, 2),
   PRIMARY KEY (ID)
);

现在使用 INSERT 语句向该表中插入值,如下所示:

INSERT INTO CUSTOMERS VALUES
(1, 'Ramesh', 32, 'Ahmedabad', 2000.00 ),
(2, 'Khilan', 25, 'Delhi', 1500.00 ),
(3, 'Kaushik', 23, 'Kota', 2000.00 ),
(4, 'Chaitali', 25, 'Mumbai', 6500.00 ),
(5, 'Hardik', 27, 'Bhopal', 8500.00 ),
(6, 'Komal', 22, 'Hyderabad', 4500.00 ),
(7, 'Muffy', 24, 'Indore', 10000.00 );

该表将被创建为:

ID

NAME

AGE

ADDRESS

SALARY

1

Ramesh

32

Ahmedabad

2000.00

2

Khilan

25

Delhi

1500.00

3

Kaushik

23

Kota

2000.00

4

Chaitali

25

Mumbai

6500.00

5

Hardik

27

Bhopal

8500.00

6

Komal

22

Hyderabad

4500.00

7

Muffy

24

Indore

10000.00

让我们创建另一个名为 ORDERS 的表,其中包含所做的订单和下单日期的详细信息。

CREATE TABLE ORDERS (
   OID INT NOT NULL,
   DATE VARCHAR (20) NOT NULL,
   CUSTOMER_ID INT NOT NULL,
   AMOUNT DECIMAL (18, 2)
);

使用 INSERT 语句像下面这样向该表中插入值:

INSERT INTO ORDERS VALUES
(102, '2009-10-08 00:00:00', 3, 3000.00),
(100, '2009-10-08 00:00:00', 3, 1500.00),
(101, '2009-11-20 00:00:00', 2, 1560.00),
(103, '2008-05-20 00:00:00', 4, 2060.00);

该表显示如下:

OID

DATE

CUSTOMER_ID

AMOUNT

102

2009-10-08 00:00:00

3

3000.00

100

2009-10-08 00:00:00

3

1500.00

101

2009-11-20 00:00:00

2

1560.00

103

2008-05-20 00:00:00

4

2060.00

现在让我们使用 Inner Join query 将这两张表组合起来,如下所示:

SELECT ID, NAME, AMOUNT, DATE
FROM CUSTOMERS
INNER JOIN ORDERS
ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID;

Output

此查询的结果如下所示:

ID

NAME

AMOUNT

DATE

3

Kaushik

3000.00

2009-10-08 00:00:00

3

Kaushik

1500.00

2009-10-08 00:00:00

2

Khilan

1560.00

2009-11-20 00:00:00

4

Chaitali

2060.00

2008-05-20 00:00:00

Joining Multiple Tables Using Inner Join

到目前为止,我们仅学习了如何使用内部连接连接两张表。但是,我们还可以使用内部连接连接尽可能多的表,方法是指定条件(用于连接这些表)。

Syntax

以下是如何使用内联连接合并两个以上表的语法 −

SELECT column1, column2, column3...
FROM table1
INNER JOIN table2
ON condition_1
INNER JOIN table3
ON condition_2
....
....
INNER JOIN tableN
ON condition_N;

请注意,在这种情况下,每次只能连接两个表的一个条件。此过程顺序执行,直到合并所有表。

Example

让我们使用先前的表 CUSTOMERS 和 ORDERS,加上一个新的表 EMPLOYEE 。我们使用以下查询创建 EMPLOYEE 表 −

CREATE TABLE EMPLOYEE (
   EID INT NOT NULL,
   EMPLOYEE_NAME VARCHAR (30) NOT NULL,
   SALES_MADE DECIMAL (20)
);

现在,我们可以使用 INSERT 语句将值插入到此空表中,如下所示:

INSERT INTO EMPLOYEE VALUES
(102, 'SARIKA', 4500),
(100, 'ALEKHYA', 3623),
(101, 'REVATHI', 1291),
(103, 'VIVEK', 3426);

EMPLOYEE 表的详细信息如下所述。

EID

EMPLOYEE_NAME

SALES_MADE

102

SARIKA

4500

100

ALEKHYA

3623

101

REVATHI

1291

103

VIVEK

3426

使用以下查询,我们可以合并三个表 CUSTOMERS、ORDERS 和 EMPLOYEE。

SELECT OID, DATE, AMOUNT, EMPLOYEE_NAME FROM CUSTOMERS
INNER JOIN ORDERS
ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID
INNER JOIN EMPLOYEE
ON ORDERS.OID = EMPLOYEE.EID;

Output

以上内联连接查询的结果如下所示 −

OID

DATE

AMOUNT

EMPLOYEE_NAME

102

2009-10-08 00:00:00

3000.00

SARIKA

100

2009-10-08 00:00:00

1500.00

ALEKHYA

101

2009-11-20 00:00:00

1560.00

REVATHI

103

2008-05-20 00:00:00

2060.00

VIVEK

Inner Join with WHERE Clause

SQL 中的子句用于在使用 SQL 查询检索数据时应用约束。有许多子句 SQL 用于约束数据;例如 WHERE 子句、GROUP BY 子句、ORDER BY 子句、UNION 子句等。

WHERE 子句用于过滤表中的数据。此子句指定一个条件以仅检索满足该条件的那些记录。

内联连接使用 WHERE 子句对要检索的数据应用更多约束。例如,在检索组织的员工记录时,如果我们只想查看每月收入超过 25000 的员工的数据,我们需要指定 WHERE 条件 (salary > 25000) 以仅检索那些员工记录。

Syntax

当与 WHERE 子句结合使用时,内联连接的语法如下 −

SELECT column_name(s)
FROM table1
INNER JOIN table2
ON table1.column_name = table2.column_name
WHERE condition;

Example

在此示例中,我们使用内联连接查询连接表 CUSTOMERS 和 ORDERS,并使用 WHERE 子句对结果应用一些约束。

在此,我们从 CUSTOMERS 表检索 ID 和 NAME,从 ORDERS 表检索 DATE 和 AMOUNT,其中支付金额高于 2000。

SELECT ID, NAME, DATE, AMOUNT FROM CUSTOMERS
INNER JOIN ORDERS
ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID
WHERE ORDERS.AMOUNT > 2000.00;

Output

应用内联连接的 where 子句后的结果表包含 AMOUNT 值大于 2000.00 的行 −

ID

NAME

DATE

AMOUNT

3

Kaushik

2009-10-08 00:00:00

3000.00

4

Chaitali

2008-05-20 00:00:00

2060.00