注: 所谓连接, 指的是把两张表的字段“连接”起来, 放在一个结果集里,即连接的是两张表的字段!
有三张表,person_info学生信息;class_schedule选课信息;class_size班级人数。
如下:
格式:
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:
当然,where也可实现上面的结果:
小技巧,若表名多次被用到,可以使用别名简化:
二、左外连接。
意义:左表全部输出,然后输出右表与左表想匹配的行。
问题:查找person_info表中学生所在班级的人数,虽然zhangsan不属于任何班级,也要输出
TA。
解答:
三、右外连接。
意义:右表全部输出,然后输出左表与右表想匹配的行。
问题:输出class_size的班级人数,以及1,2,3个班级的学生姓名。
解答:
完全外连接FULL OUTER JOIN。
四、自连接。
是一张表!把一个表的某一行与同一表中的另一行连接起来。
如我们想在person_info表中找出和zhangsan相同gender的学生。
当然可以用子查询复合语句完成,如下:
也可用自连接(相比子查询更高效)完成,如下:
五、自然连接。
有时候连接查询会出现重复的列,如上面的内部连接改为下面就会出现重复的列:
如何消除重复的列呢,没什么高招,只有手动消除了(一般是对一张表使用通配符,其他表的列使用明确的子集),改为下面的语句就行了: