MySql左连接(left join)无法全部查询出来问题

今天在写一个sql的时候,碰到一个知识盲区,也是我对 left join 理解的错误。

一、表结构

学生表

CREATE TABLE stu ( 
  `id` varchar(50) NOT NULL COMMENT '主键ID',
  `name` varchar(50) NOT NULL COMMENT '学生姓名',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='学生表';

课程表

CREATE TABLE `course` (
  `id` varchar(50) NOT NULL COMMENT '主键ID',
  `name` varchar(50) NOT NULL COMMENT '课程名字',
  `stu_id` varchar(50) NOT NULL COMMENT '学生id',
  `score` INT NOT NULL COMMENT '得分',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='课程表';

插入数据

在这里插入图片描述


二、需求

我们要查询出每个人大于60分有多少门课程(一门没有的显示0)


2-1、错误的思考

啪一下、很快啊,我就写出了

一个左连接、一个条件判断,我全写好了。

SELECT
		stu.`name`,
		COUNT(course.id) num
FROM stu
LEFT JOIN course ON stu.id = course.stu_id
WHERE course.score > 60
GROUP BY stu.id

但是这个查询出来的结果如下,明显少了我们的学渣李四

namenum
张三3
王五1

2-2、正确的思考

1、我们知道左连接的查询结果应当是下面带颜色的部分

在这里插入图片描述

2、当我们使用连接查询的时候,那就是把两张表组合成了一张,这时候WHERE的条件当然是对这张组合表起作用了。(所以我们上面的WHERE course.score > 60 就直接去掉了李四)

因为我们的分数大于60,只对分数表有作用,所以我们应该在组合之前去WHERE

SELECT
		stu.`name`,
		COUNT(course.id) num
FROM stu
LEFT JOIN course ON stu.id = course.stu_id AND course.score > 60
GROUP BY stu.id
  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是Mysql数据库中左连接left join、右连接right join和内连接inner join的介绍和演示: 1. 左连接left join 左连接left join会返回左表中所有的记录,以及右表中符合条件的记录。如果右表中没有符合条件的记录,则返回NULL。 语法: ``` SELECT * FROM a_table LEFT JOIN b_table ON a_table.key = b_table.key; ``` 示例: 假设有两个表,一个是学生表students,一个是成绩表scores。学生表中有学生的ID和姓名,成绩表中有学生的ID和成绩。我们需要查询所有学生的姓名和成绩,如果学生没有成绩,则成绩为NULL。 ```sql SELECT students.name, scores.score FROM students LEFT JOIN scores ON students.id = scores.id; ``` 2. 右连接right join连接right join会返回右表中所有的记录,以及左表中符合条件的记录。如果左表中没有符合条件的记录,则返回NULL。 语法: ``` SELECT * FROM a_table RIGHT JOIN b_table ON a_table.key = b_table.key; ``` 示例: 假设有两个表,一个是学生表students,一个是成绩表scores。学生表中有学生的ID和姓名,成绩表中有学生的ID和成绩。我们需要查询所有成绩和对应的学生姓名,如果成绩表中没有对应的学生,则姓名为NULL。 ```sql SELECT students.name, scores.score FROM students RIGHT JOIN scores ON students.id = scores.id; ``` 3. 内连接inner join连接inner join会返回左右表中都符合条件的记录。 语法: ``` SELECT * FROM a_table INNER JOIN b_table ON a_table.key = b_table.key; ``` 示例: 假设有两个表,一个是学生表students,一个是成绩表scores。学生表中有学生的ID和姓名,成绩表中有学生的ID和成绩。我们需要查询所有有成绩的学生的姓名和成绩。 ```sql SELECT students.name, scores.score FROM students INNER JOIN scores ON students.id = scores.id; ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值