MySQL一个关于Left Join 的大坑

现有两张表 classes 和 student 两张表

DROP TABLE IF EXISTS `classes`;
CREATE TABLE `classes`  (
  `id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'id',
  `name` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '班级名称',
  `year` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '年级',
  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
  `update_time` datetime NULL DEFAULT NULL COMMENT '修改时间',
  `is_deleted` int(2) NULL DEFAULT NULL COMMENT '是否删除(0未删、1已删)',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of classes
-- ----------------------------
INSERT INTO `classes` VALUES ('1', '一班', '2020级', '2021-03-08 17:46:06', NULL, 0);
INSERT INTO `classes` VALUES ('2', '二班', '2020级', '2021-08-11 09:26:46', NULL, 0);
INSERT INTO `classes` VALUES ('3', '三班', '2020级', '2021-08-11 09:26:46', NULL, 0);
INSERT INTO `classes` VALUES ('4', '四班', '2020级', '2021-08-11 09:26:46', NULL, 0);

-- ----------------------------
-- Table structure for student
-- ----------------------------
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student`  (
  `id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'id',
  `account` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '账号',
  `password` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '密码',
  `name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '姓名',
  `sex` tinyint(2) NULL DEFAULT NULL COMMENT '性别',
  `id_card` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '身份证号',
  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
  `update_time` datetime NULL DEFAULT NULL COMMENT '修改时间',
  `class_id` varbinary(32) NULL DEFAULT NULL COMMENT '班级id',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of student
-- ----------------------------
INSERT INTO `student` VALUES ('1', 'zhangsan', '123456', '张三', 1, '372328199905120312', '2021-03-08 17:51:51', NULL, 0x32);
INSERT INTO `student` VALUES ('2', 'lisi', '123456', '李四', 1, '372328199905120312', '2021-03-08 16:40:32', '2021-03-08 16:44:10', 0x31);
INSERT INTO `student` VALUES ('3', 'wangwu', '147852', '王五', 0, '565566565656565656', '2021-07-29 17:15:33', NULL, 0x33);
INSERT INTO `student` VALUES ('4', 'tianliu', '147852', '田六', 0, '565566565656565656', '2021-07-29 17:15:33', NULL, 0x31);

 

 

需求:查询每个班级的名称以及对应的姓名为张三学生信息

下面三条SQL语句大家觉得 结果是什么样的?

SELECT * FROM `classes` t1 LEFT JOIN student t2 ON t1.id = t2.class_id AND t2.`name` = '张三'

SELECT * FROM `classes` t1 LEFT JOIN student t2 ON t1.id = t2.class_id WHERE t2.`name` = '张三'

SELECT * FROM `classes` t1 LEFT JOIN (SELECT * FROM student WHERE `name` = '张三') t2 ON t1.id = t2.class_id

答案

sql1 :

sql2 :

sql3 :

 

 

sql1和sql3是正确的,sql3是对sql1的详细解释。left join 时  对右表记录条件查询时 应在ON后面拼接 and。

left join语句中,左表过滤必须放where条件中,右表过滤必须放on条件中。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值