在 MySQL 数据库中,RIGHT JOIN(右连接)是一种表连接操作,它用于根据指定的连接条件将两个或多个表中的相关数据进行组合。右连接返回的结果集包含右表中的所有行,以及与左表匹配的行。如果在左表中没有匹配的行,则结果集将显示为 NULL。
表的连接查询都可以分为两种情况:有条件和无条件的。更详细的表链接知识可查看《MySQL 表连接》。
LEFT JOIN(左连接)和RIGHT JOIN(右连接)一定要加条件的。 |
以学生表和成绩表做本案例讲解。
这是详细信息得内容。
-- ---------------------------- -- Table structure for student -- ---------------------------- DROP TABLE IF EXISTS `student`; CREATE TABLE `student` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL, `sex` varchar(11) COLLATE utf8_unicode_ci DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; -- ---------------------------- -- Records of student -- ---------------------------- INSERT INTO `student` VALUES ('1', '张三名', '男'); INSERT INTO `student` VALUES ('2', '李四浩', '男'); INSERT INTO `student` VALUES ('3', '王五期', '女'); INSERT INTO `student` VALUES ('5', '三七熊', '女'); -- ---------------------------- -- Table structure for course -- ---------------------------- DROP TABLE IF EXISTS `course`; CREATE TABLE `course` ( `id` int(11) NOT NULL AUTO_INCREMENT, `studentid` int(11) DEFAULT NULL, `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, `score` int(11) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM AUTO_INCREMENT=16 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; -- ---------------------------- -- Records of course -- ---------------------------- INSERT INTO `course` VALUES ('1', '1', '语文', '81'); INSERT INTO `course` VALUES ('2', '1', '数学', '74'); INSERT INTO `course` VALUES ('3', '1', '英语', '56'); INSERT INTO `course` VALUES ('4', '2', '语文', '71'); INSERT INTO `course` VALUES ('5', '2', '数学', '77'); INSERT INTO `course` VALUES ('6', '2', '英语', '66'); INSERT INTO `course` VALUES ('7', '3', '语文', '61'); INSERT INTO `course` VALUES ('8', '3', '数学', '87'); INSERT INTO `course` VALUES ('9', '3', '英语', '86'); INSERT INTO `course` VALUES ('10', '4', '语文', '71'); INSERT INTO `course` VALUES ('11', '4', '数学', '57'); INSERT INTO `course` VALUES ('12', '4', '英语', '76');
student学生表原始数据
mysql> SELECT * from student; +----+-----------+------+ | id | name | sex | +----+-----------+------+ | 1 | 张三名 | 男 | | 2 | 李四浩 | 男 | | 3 | 王五期 | 女 | | 5 | 三七熊 | 女 | +----+-----------+------+
course成绩表原始数据
学生分别有语文、数学、英语三门成绩,studentid是student学生表的id
mysql> SELECT * from course; +----+-----------+--------+-------+ | id | studentid | name | score | +----+-----------+--------+-------+ | 1 | 1 | 语文 | 81 | | 2 | 1 | 数学 | 74 | | 3 | 1 | 英语 | 56 | | 4 | 2 | 语文 | 71 | | 5 | 2 | 数学 | 77 | | 6 | 2 | 英语 | 66 | | 7 | 3 | 语文 | 61 | | 8 | 3 | 数学 | 87 | | 9 | 3 | 英语 | 86 | | 10 | 4 | 语文 | 71 | | 11 | 4 | 数学 | 57 | | 12 | 4 | 英语 | 76 | +----+-----------+--------+-------+
右连接是一定要加条件的。右边的表全部输出在左表没有数据时输出NULL。
mysql> SELECT * from student RIGHT JOIN course on student.id=course.studentid; +------+-----------+------+----+-----------+--------+-------+ | id | name | sex | id | studentid | name | score | +------+-----------+------+----+-----------+--------+-------+ | 1 | 张三名 | 男 | 1 | 1 | 语文 | 81 | | 1 | 张三名 | 男 | 2 | 1 | 数学 | 74 | | 1 | 张三名 | 男 | 3 | 1 | 英语 | 56 | | 2 | 李四浩 | 男 | 4 | 2 | 语文 | 71 | | 2 | 李四浩 | 男 | 5 | 2 | 数学 | 77 | | 2 | 李四浩 | 男 | 6 | 2 | 英语 | 66 | | 3 | 王五期 | 女 | 7 | 3 | 语文 | 61 | | 3 | 王五期 | 女 | 8 | 3 | 数学 | 87 | | 3 | 王五期 | 女 | 9 | 3 | 英语 | 86 | | NULL | NULL | NULL | 10 | 4 | 语文 | 71 | | NULL | NULL | NULL | 11 | 4 | 数学 | 57 | | NULL | NULL | NULL | 12 | 4 | 英语 | 76 | +------+-----------+------+----+-----------+--------+-------+
请注意,在使用RIGHT JOIN时,需要注意以下几点:
连接条件:在ON子句中指定的连接条件非常重要,它决定了哪些行将被匹配并返回。确保连接条件正确地关联了相关的列。
列选择:在SELECT子句中指定要返回的列。可以选择来自两个表的任意列,也可以使用别名来区分相同的列名。
数据类型匹配:连接操作要求连接的列具有兼容的数据类型。如果数据类型不匹配,可能会导致错误或不准确的结果。
性能考虑:在处理大型表时,RIGHT JOIN可能会消耗较多的资源。如果需要优化查询性能,可以考虑使用索引、优化连接条件或使用其他连接类型(如LEFT JOIN或LEFT JOIN)。
可读性:尽量保持RIGHT JOIN语句的可读性,使用有意义的表别名和连接条件,以便更好地理解和维护代码。