多表连接查询

注: 所谓连接, 指的是把两张表的字段“连接”起来, 放在一个结果集里,即连接的是两张表的字段!

有三张表,person_info学生信息;class_schedule选课信息;class_size班级人数。

如下:

image

格式:

SELECT table_name1.field1 table_name2.field1 … FROM table_name1 JOIN_TYPE table_name2 ON 连接条件

一、内部连接。(只输出相同字段中的匹配记录)

意义:只有两个表相匹配的行才能在结果集中出现 。

问题:对person_info和class_size表,内连接查找学生姓名对应的班级人数。

分析:zhangsan是个奇葩,TA不属于任何班级,即表class_size里没有行和TA匹配,因此zhangsan这一行是不会出现在结果集里的;同理class_size里的class 3班也没有学生与之匹配,因此可以预见结果集里有两行lisi和wangwu.

这里的内连接即,先找到person_info和class_size表中相同的字段class,再输出字段class中相匹配的1和2,如下图:

 

解答:

INNER JOIN:

image

当然,where也可实现上面的结果:

image

小技巧,若表名多次被用到,可以使用别名简化:

image 

二、左外连接。

意义:左表全部输出,然后输出右表与左表想匹配的行。

问题:查找person_info表中学生所在班级的人数,虽然zhangsan不属于任何班级,也要输出

TA。

解答:

image

三、右外连接。

意义:右表全部输出,然后输出左表与右表想匹配的行。

问题:输出class_size的班级人数,以及1,2,3个班级的学生姓名。

解答:

image

完全外连接FULL OUTER JOIN。

四、自连接。

是一张表!把一个表的某一行与同一表中的另一行连接起来。

如我们想在person_info表中找出和zhangsan相同gender的学生。

当然可以用子查询复合语句完成,如下:

image

也可用自连接(相比子查询更高效)完成,如下:

image

五、自然连接。

有时候连接查询会出现重复的列,如上面的内部连接改为下面就会出现重复的列:

image

如何消除重复的列呢,没什么高招,只有手动消除了(一般是对一张表使用通配符,其他表的列使用明确的子集),改为下面的语句就行了:

image

原文地址:https://www.cnblogs.com/helloweworld/p/3351692.html