Mysql 简明教程

MySQL - Self Join

MySQL Self Join

MySQL Self Join 用于将一个表连接到它自身,就像该表是两个表一样。为了执行此操作,至少在一个表在 MySQL 语句中临时重命名。

自连接是一种内部连接,当需要比较同一张表的两列时执行此操作;可能需要在它们之间建立关系。换句话说,当一张表同时包含 Foreign KeyPrimary Key 时,它会与自身连接。

但是,与其他连接的查询不同,我们使用 WHERE 子句指定表与其自身合并的条件;而不是使用 ON 子句。

Syntax

以下是 MySQL 中自连接的基本语法−

SELECT column_name(s)
FROM table1 a, table1 b
WHERE a.common_field = b.common_field;

这里,WHERE 子句可以是基于您要求的任何给定表达式。

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 );

该表将被创建为:

现在,让我们使用以下 Self Join query 连接该表。我们的目标是根据客户的收入建立一个关系。我们使用 WHERE 子句执行此操作。

SELECT a.ID, b.NAME as EARNS_HIGHER, a.NAME as EARNS_LESS,
a.SALARY as LOWER_SALARY FROM CUSTOMERS a, CUSTOMERS b
WHERE a.SALARY < b.SALARY;

Output

显示的结果表将列出所有收入低于其他客户的客户−

Self Join with ORDER BY Clause

此外,在使用自连接将表与其自身连接之后,还可以使用 ORDER BY 子句按升序对合并表中的记录进行排序。以下是语法−

SELECT column_name(s)
FROM table1 a, table1 b
WHERE a.common_field = b.common_field
ORDER BY column_name;

Example

在本例中,执行下面的查询将使用 WHERE 子句在自连接中将 CUSTOMERS 表连接到自身。然后,使用 ORDER BY 子句按指定列对记录进行升序排列。在此,我们根据薪水列排列记录

SELECT  a.ID, b.NAME as EARNS_HIGHER, a.NAME as EARNS_LESS,
a.SALARY as LOWER_SALARY FROM CUSTOMERS a, CUSTOMERS b
WHERE a.SALARY < b.SALARY ORDER BY a.SALARY;

Output

最终表如下所示:

Self Join Using Client Program

我们还可以使用客户端程序对一个或多个表执行自连接操作。

Syntax

Example

以下是这些程序 −