目前有三个表: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的记录。最后,返回满足条件的学生的基本信息和他们的选课情况。
【相关推荐】