📜  MySQL SELF JOIN

📅  最后修改于: 2020-11-18 03:19:57             🧑  作者: Mango

MySQL自连接

SELF JOIN是用于将表与其自身联接的联接。在前面的部分中,我们学习了使用不同的JOINS(例如INNER,LEFT,RIGHT和CROSS JOIN)将表与其他表连接的方法。但是,需要将数据与同一表本身中的其他数据合并。在这种情况下,我们将使用“自我联接”。

我们可以使用表别名执行自我联接。表别名使我们不能在单个语句中两次使用相同的表名。如果我们在没有表别名的单个查询中多次使用同一表名,则会抛出错误。

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

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

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

SELF JOIN语法

自联接的语法与联接两个不同表的语法相同。在这里,我们为表使用别名,因为两个表名称相同。以下是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_id相等而course_id不相等的表中获取所有结果(student_id和名称)。执行以下查询以了解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;

成功执行后,我们将获得以下输出:

使用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;

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

使用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;

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