MySQL 自连接
SELF JOIN是一种用于将表与自身连接的方法。在前面的部分中,我们已经学习了如何使用不同的JOIN(包括INNER、LEFT、RIGHT和CROSS JOIN)将表与其他表进行连接。然而,有时需要将数据与同一表中的其他数据进行组合。在这种情况下,我们使用Self Join。
我们可以使用 表别名 来执行Self Join。表别名允许我们在单个语句中不重复使用相同的表名。如果我们在单个查询中多次使用相同的表名而没有使用表别名,会导致错误。
表别名使我们能够在查询中使用即将使用的表的 临时名称 。让我们通过以下解释来理解表别名。
假设我们有一个名为 “student” 的表,该表将在单个查询中使用两次。为了给student表起别名,我们可以这样写:
Select … FROM student AS S1
INNER JOIN student AS S2;
自连接语法
自连接的语法与联接两个不同表的语法相同。在这里,我们对表使用别名,因为表名相同。以下是MySQL中自连接的语法:
SELECT s1.col_name, s2.col_name...
FROM table1 s1, table1 s2
WHERE s1.common_col_name = s2.common_col_name;
注意:根据您的需求,您还可以使用其他条件,而不是 WHERE 子句。
自连接示例
让我们在数据库中创建一个名为 “student” 的表,其中包含以下数据:
现在,我们将从表中获取所有 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;
执行成功后,我们将得到以下输出:
使用INNER 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子句进行自连接
以下示例说明了如何使用自连接进行LEFT JOIN。当两个表的student_id相等时,此查询将返回学生姓名作为 monitor 以及所在城市。
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;
执行上述语句后,我们将得到以下示例: