Mysql中on与where关系

目前有三个表:student 学生信息表 ,course选课课程信息表,exame选课情况信息表。其中 stduent 和course 是exame子表。

我们先用外连接看一下标的基本信息,其中1-4都有选课。5号只插入了学生表的信息。

mysql> select s.*,e.* from student s left join exame e on s.uid = e.uid;
+-----+--------+-----+--------+------+------+------------+-------+
| uid | name   | age | sex    | uid  | cid  | time       | score |
+-----+--------+-----+--------+------+------+------------+-------+
|   1 | Alice  |  20 | female |    1 |    1 | 2023-08-25 |    85 |
|   1 | Alice  |  20 | female |    1 |    2 | 2023-08-26 |    92 |
|   2 | Bob    |  22 | male   |    2 |    1 | 2023-08-25 |    78 |
|   2 | Bob    |  22 | male   |    2 |    3 | 2023-08-27 |    88 |
|   3 | Claire |  21 | female |    3 |    2 | 2023-08-26 |    95 |
|   3 | Claire |  21 | female |    3 |    4 | 2023-08-28 |    90 |
|   4 | David  |  23 | male   |    4 |    1 | 2023-08-25 |    82 |
|   4 | David  |  23 | male   |    4 |    4 | 2023-08-28 |    91 |
|   5 | Eeboy  |  25 | male   | NULL | NULL | NULL       |  NULL |
+-----+--------+-----+--------+------+------+------------+-------+
9 rows in set (0.00 sec)

#我们对e.uid进行筛选一下。

mysql> select s.*,e.* from student s left join exame e on s.uid = e.uid and e.uid is NULL;
+-----+--------+-----+--------+------+------+------+-------+
| uid | name   | age | sex    | uid  | cid  | time | score |
+-----+--------+-----+--------+------+------+------+-------+
|   1 | Alice  |  20 | female | NULL | NULL | NULL |  NULL |
|   2 | Bob    |  22 | male   | NULL | NULL | NULL |  NULL |
|   3 | Claire |  21 | female | NULL | NULL | NULL |  NULL |
|   4 | David  |  23 | male   | NULL | NULL | NULL |  NULL |
|   5 | Eeboy  |  25 | male   | NULL | NULL | NULL |  NULL |
+-----+--------+-----+--------+------+------+------+-------+
5 rows in set (0.01 sec)

#引出了问题 为什么在exame信息成null了?
#换成where就好了。
mysql> select s.*,e.* from student s left join exame e on s.uid = e.uid where e.uid is NULL;
+-----+-------+-----+------+------+------+------+-------+
| uid | name  | age | sex  | uid  | cid  | time | score |
+-----+-------+-----+------+------+------+------+-------+
|   5 | Eeboy |  25 | male | NULL | NULL | NULL |  NULL |
+-----+-------+-----+------+------+------+------+-------+
1 row in set (0.00 sec)

区别在内连接时,会先把左边/右边的所有记录先记录下来,然后再根据on找到另一张表的所有记录,若不满足所有的on,那么直接赋值为NULL。而where是在两张表链接后进行筛选,若不匹配直接过滤掉。

表连接中的on是表中数据的连接条件,一方面用于声明两个表通过哪个字段的值进行连接,同时也可以添加其他的过滤条件,只有同时满足这些连接条件的数据才是符合条件的数据,而where会对这些符合连接条件的数据再做进一步的过滤,然后才会得到最终的查询结果。以上所描述的问题中,第二个查询是做左外连接,并且连接条件为s.uid = e.uid and e.uid is NULL,但是同时满足这两个条件的数据是没有的,根据左外连接的规则,自然就只返回左表中的数据,右表中的数据都填充为NULL;而第三个查询的连接条件是s.uid = e.uid,也就是第一个查询的结果,得到的数据再通过where条件过滤,自然就得到一条查询结果。

【以下回答由 GPT 生成】

这个查询语句的含义是从学生表(student)和选课情况信息表(exam)中查询出满足条件的记录,并返回学生的基本信息和他们的选课情况。其中,使用左连接(left join)将学生表和选课情况信息表连接在一起,连接条件是学生表的uid等于选课情况信息表的uid。然后,使用where子句过滤出学生表中uid大于等于2的记录。最后,返回满足条件的学生的基本信息和他们的选课情况。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^