mySQL包含两种联接,分别是内连接(inner join)和外连接(out join),但我们又同时听说过左连接,交叉连接等术语,本文旨在总结这些术语之间的关系。
1. 内连接
首先说明内连接的一个重要性质:内连接查询结果与表的顺序无关
(当然顺序可能会发生变化,但是对应关系绝对不会错乱!!!)
1.1 交叉连接(cross join)
SELECT t.toy,b.boy FROM toys AS t CROSS JOIN boys AS b;
其中,CROSS JOIN可以省略,简写为
SELECT t.toy,b.boy FROM toys AS t, boys AS b;
1.2 相等连接
SELECT boys.boy,toys.toy FROM boys INNER JOIN toys ON boys.toy_id=toys.toy_id;

1.3 不等连接
我们继续沿用1.2中的表结构,如果我们想找到每个男孩儿没有的玩具,这时候我们可以使用不等连接(说白了就是=换成<>,其他没有什么区别)
SELECT boys.boy,toys.toy FROM boys INNER JOIN toys ON boys.toy_id<>toys.toy_id ORDER BY boys.boy;

1.4 自然连接
SELECT boys.boy,toys.toy FROM boys NATURAL JOIN toys ORDER BY boys.boy;
2. 外连接
首先说明外连接不同于内连接的一个性质:外连接查询与表的顺序有关
2.1 左外连接
LEFT OUTER JOIN(左外连接)接收左表的所有行,并用这些行与右表进行匹配
当左表与右表具有一对多的关系时,左外连接特别有用。我们仍然使用之前的表结构

现在我们利用左外连接找出每个男孩拥有的玩具
SELECT b.boy,t.toy FROM boys b LEFT OUTER JOIN toys t ON b.toy_id=t.toy_id;
我们发现居然出现了一个NULL,NULL的出现是要告诉我们右表toys中没有与左表boys中的Andy相匹配的行,也就是说
外连接一定会提供数据行,无论还行能否在另一个表中找出相匹配的行
接着做个实验,我们调换左表和右表的顺序
SELECT b.boy,t.toy FROM toys t LEFT OUTER JOIN boys b ON b.toy_id=t.toy_id;

结论:出现NULL的列总是右表中的列
以下时左外连接的实际匹配过程
2.2 右外连接
SELECT b.boy,t.toy FROM toys t RIGHT OUTER JOIN boys b ON b.toy_id=t.toy_id;
上述代码等同于
SELECT b.boy,t.toy FROM boys b LEFT OUTER JOIN toys t ON b.toy_id=t.toy_id;
这两种写法都是都把toys作为右表,把boys作为左表
在实际运用过程中,我们一般倾向于只使用一种,另一种简单了解就好。
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/176072.html原文链接:https://javaforall.net
