程序员社区

MySQL系列教程 --- 76、MySQL 中的 自连接

SELF JOIN 是用于将表与其自身连接的连接。在前面的部分中,我们已经了解了使用不同的 JOIN(例如 INNER、LEFT、RIGHT 和 CROSS JOIN)将表与其他表连接。但是,需要将数据与同一表本身中的其他数据合并。在这种情况下,我们使用 Self Join。

我们可以使用表别名执行自连接。表别名允许我们不要在单个语句中两次使用相同的表名。如果我们在没有表别名的单个查询中多次使用相同的表名,则会引发错误。

表别名使我们能够使用将在查询中使用的表的临时名称。让我们通过以下解释来理解表别名。

假设我们有一个名为“student”的表,它将在单个查询中使用两次。为了给学生表取别名,我们可以把它写成:

Select … FROM student AS S1   
INNER JOIN student AS S2;  

自连接语法

自联接的语法与联接两个不同表的语法相同。在这里,我们为表使用别名,因为两个表名是相同的。以下是 MySQL 中 SELF JOIN 的语法:

SELECT s1.col_name, s2.col_name...  
FROM table1 s1, table1 s2  
WHERE s1.common_col_name = s2.common_col_name;  

注意:您也可以根据您的要求使用其他条件代替 WHERE 子句。

自连接示例

让我们在包含以下数据的数据库中创建一个表“student”

file

现在,我们将从student_id相等而course_id不相等的表中获取所有结果(student_id 和name)。执行以下查询以了解 MySQL 中自联接的工作:

SELECT  s1.student_id, s1.name  
FROM student AS s1, student s2  
WHERE s1.student_id=s2.student_id  
AND s1.course_id<>s2.course_id;  

执行成功后,我们会得到如下输出:

file

使用 INNER JOIN 子句的 SELF JOIN

以下示例说明了我们如何将内部联接与自联接一起使用。当两个表的 student_id 相等,而 course_id 不相等时,此查询将返回学生 id 和姓名。

SELECT  s1.student_id, s1.name  
FROM student s1  
INNER JOIN student s2  
ON s1.student_id=s2.student_id  
AND s1.course_id<>s2.course_id  
GROUP BY student_id;  

执行上述语句后,我们将得到以下示例:

MySQL SELF Join

使用 LEFT JOIN 子句的 SELF JOIN

以下示例说明了如何将 LEFT Join 与 Self Join 结合使用。当两个表的 student_id 相等时,此查询将学生名称返回为monitor 和city 。

SELECT (CONCAT(s1.stud_lname, ' ', s2.stud_fname)) AS 'Monitor', s1.city  
FROM students s1  
LEFT JOIN students s2 ON s1.student_id=s2.student_id  
ORDER BY s1.city DESC;  

执行上述语句后,我们将得到以下示例:

file

赞(0) 打赏
未经允许不得转载:IDEA激活码 » MySQL系列教程 --- 76、MySQL 中的 自连接

一个分享Java & Python知识的社区