连接查询是另一种类型的多表查询。连接查询对多个表进行JOIN运算,简单地说,就是先确定一个主表作为结果集,然后,把其他表的行有选择性地“连接”在主表结果集上。
例如,我们想要选出students表的所有学生信息,可以用一条简单的SELECT语句完成:
![53be1b3b11b2f362d622dccb539ab0f7.png](https://i-blog.csdnimg.cn/blog_migrate/2a9a2a702b78f15aa82598f420aea24c.jpeg)
但是,假设我们希望结果集同时包含所在班级的名称,上面的结果集只有class_id列,缺少对应班级的name列。
现在问题来了,存放班级名称的name列存储在classes表中,只有根据students表的class_id,找到classes表对应的行,再取出name列,就可以获得班级名称。
这时,连接查询就派上了用场。我们先使用最常用的一种内连接——INNER JOIN来实现:
![e1de711df08a4ee4bf9f8f8b0021bc06.png](https://i-blog.csdnimg.cn/blog_migrate/65f941088c0c8cfef263ec92867fabbc.jpeg)
注意INNER JOIN查询的写法是:
- 先确定主表,仍然使用FROM 的语法;
- 再确定需要连接的表,使用INNER JOIN 的语法;
- 然后确定连接条件,使用ON ,这里的条件是s.class_id = c.id,表示students表的class_id列与classes表的id列相同的行需要连接;
- 可选:加上WHERE子句、ORDER BY等子句。
使用别名不是必须的,但可以更好地简化查询语句。
那什么是内连接(INNER JOIN)呢?先别着急,有内连接(INNER JOIN)就有外连接(OUTER JOIN)。我们把内连接查询改成外连接查询,看看效果:
![c310ca06171ef84dc7f02caeaab6ff69.png](https://i-blog.csdnimg.cn/blog_migrate/468956db01b17cbbe19ea64dc8052038.jpeg)
执行上述RIGHT OUTER JOIN可以看到,和INNER JOIN相比,RIGHT OUTER JOIN多了一行,多出来的一行是“四班”,但是,学生相关的列如name、gender、score都为NULL。
这也容易理解,因为根据ON条件s.class_id = c.id,classes表的id=4的行正是“四班”,但是,students表中并不存在class_id=4的行。
执行上述RIGHT OUTER JOIN可以看到,和INNER JOIN相比,RIGHT OUTER JOIN多了一行,多出来的一行是“四班”,但是,学生相关的列如name、gender、score都为NULL。
这也容易理解,因为根据ON条件s.class_id = c.id,classes表的id=4的行正是“四班”,但是,students表中并不存在class_id=4的行。
有RIGHT OUTER JOIN,就有LEFT OUTER JOIN,以及FULL OUTER JOIN。它们的区别是:
INNER JOIN只返回同时存在于两张表的行数据,由于students表的class_id包含1,2,3,classes表的id包含1,2,3,4,所以,INNER JOIN根据条件s.class_id = c.id返回的结果集仅包含1,2,3。
RIGHT OUTER JOIN返回右表都存在的行。如果某一行仅在右表存在,那么结果集就会以NULL填充剩下的字段。
LEFT OUTER JOIN则返回左表都存在的行。如果我们给students表增加一行,并添加class_id=5,由于classes表并不存在id=5的行,所以,LEFT OUTER JOIN的结果会增加一行,对应的class_name是NULL:
先增加一列class_id=5:INSERT INTO students (class_id, name, gender, score) values (5, '新生', 'M', 88);-- 使用LEFT OUTER JOIN
![c495be617f0833810f7eac4baaf9e944.png](https://i-blog.csdnimg.cn/blog_migrate/1ac6235f0f113742d76474ede05c0776.jpeg)
最后,我们使用FULL OUTER JOIN,它会把两张表的所有记录全部选择出来,并且,自动把对方不存在的列填充为NULL:
![911e4f58db92919f420e9371cb80f9e6.png](https://i-blog.csdnimg.cn/blog_migrate/5df8bc0bdc21c690fdbafeaeaa056e46.jpeg)
![c7a3962db56b001acbfb0b2eb4cd495d.png](https://i-blog.csdnimg.cn/blog_migrate/5b6e08a688d94d759a62335c011df34b.jpeg)
小结
JOIN查询需要先确定主表,然后把另一个表的数据“附加”到结果集上;
INNER JOIN是最常用的一种JOIN查询,它的语法是SELECT ... FROM INNER JOIN ON ;
JOIN查询仍然可以使用WHERE条件和ORDER BY排序。