mysql left join,right join,inner join 之间的区别

目录

left join 例子

例子文件下载


数据表


CREATE TABLE `users`  (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of users
-- ----------------------------
INSERT INTO `users` VALUES (1, '王乐乐');
INSERT INTO `users` VALUES (2, '周欣欣');
INSERT INTO `users` VALUES (3, '陈苗苗');
INSERT INTO `users` VALUES (4, '李思思');

CREATE TABLE `user_hobbies`  (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) NOT NULL,
  `hobby` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 9 CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of user_hobbies
-- ----------------------------
INSERT INTO `user_hobbies` VALUES (1, 1, '唱歌');
INSERT INTO `user_hobbies` VALUES (2, 1, '跳舞');
INSERT INTO `user_hobbies` VALUES (3, 2, '书法');
INSERT INTO `user_hobbies` VALUES (4, 2, '绘画');
INSERT INTO `user_hobbies` VALUES (5, 2, '看书');
INSERT INTO `user_hobbies` VALUES (6, 3, '登山');
INSERT INTO `user_hobbies` VALUES (7, 99, '无极限');
INSERT INTO `user_hobbies` VALUES (8, 1, '唱歌');

用户表 users

id name
1 王乐乐
2 周欣欣
3 陈苗苗
4 李思思

用户爱好表 user_hobbies

id user_id hobby
1 1 唱歌
2 1 跳舞
3 2 书法
4 2 绘画
5 2 看书
6 3 登山
7 99 无极限
8 1 唱歌

inner join

select * from users inner join user_hobbies on users.id = user_hobbies.user_id

用户 李思思 和 爱好 无极限 没有出结果

id name id(1) user_id hobby
1 王乐乐 1 1 唱歌
1 王乐乐 2 1 跳舞
2 周欣欣 3 2 书法
2 周欣欣 4 2 绘画
2 周欣欣 5 2 看书
3 陈苗苗 6 3 登山
1 王乐乐 8 1 唱歌


left join

select * from users left join user_hobbies on users.id = user_hobbies.user_id

id name id(1) user_id hobby
1 王乐乐 1 1 唱歌
1 王乐乐 2 1 跳舞
2 周欣欣 3 2 书法
2 周欣欣 4 2 绘画
2 周欣欣 5 2 看书
3 陈苗苗 6 3 登山
1 王乐乐 8 1 唱歌
4 李思思


right join

select * from users RIGHT join user_hobbies on users.id = user_hobbies.user_id

id name id(1) user_id hobby
1 王乐乐 1 1 唱歌
1 王乐乐 2 1 跳舞
1 王乐乐 8 1 唱歌
2 周欣欣 3 2 书法
2 周欣欣 4 2 绘画
2 周欣欣 5 2 看书
3 陈苗苗 6 3 登山
7 99 无极限

distinct

由以下例子可以看出,distinct 是后面跟随的所有列唯一,而不是后面紧跟的一列

select DISTINCT users.id, users.name, user_hobbies.hobby from users left join user_hobbies on users.id = user_hobbies.user_id

id name hobby
1 王乐乐 唱歌
1 王乐乐 跳舞
2 周欣欣 书法
2 周欣欣 绘画
2 周欣欣 看书
3 陈苗苗 登山
4 李思思

select DISTINCT users.id, users.name, user_hobbies.* from users left join user_hobbies on users.id = user_hobbies.user_id

id name id(1) user_id hobby
1 王乐乐 1 1 唱歌
1 王乐乐 2 1 跳舞
2 周欣欣 3 2 书法
2 周欣欣 4 2 绘画
2 周欣欣 5 2 看书
3 陈苗苗 6 3 登山
1 王乐乐 8 1 唱歌
4 李思思

group by

select users.id, users.name, user_hobbies.* from users left join user_hobbies on users.id = user_hobbies.user_id GROUP BY users.id

id name id(1) user_id hobby
1 王乐乐 1 1 唱歌
2 周欣欣 3 2 书法
3 陈苗苗 6 3 登山
4 李思思