今天写程序,碰到了关于数据库的连接问题。所以决定,争取搞定它。。。
查了查网上高手的解释。。。然后结合自己的运行结果。。。貌似自己有点开悟了。。。
SQL语句中有关的连接主要有: 外连接、内链接、全连接。
1、外连接 又分为: 左外连接、右外连接、完整外部联接。。。
LEFT JOIN 或 LEFT OUTER JOIN。
左向外联接的结果集包括 LEFT OUTER 子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值。
RIGHT JOIN 或 RIGHT OUTER JOIN。
右向外联接是左向外联接的反向联接。将返回右表的所有行。如果右表的某行在左表中没有匹配行,则将为左表返回空值。
FULL JOIN 或 FULL OUTER JOIN。
完整外部联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。
INNER JOIN
内连接为 两个表中必须都同时满足条件时,也可以说是两个表中都必须在另一个表中有对应的项,而不能为空。才返回该行。。。
CROSS JOIN
其实对 交叉连接 还是不太明白,,,只知道 没有 where 字句的交叉连接相当于 笛卡尔积。交叉连接 后面只能接 where 字句,不能接 on 。。。
没有左内连接、右内连接。
个人理解 : 左外连接、右外连接中的 左 、 右 是说的 以哪个表为准。
外连接、内连接中的 外、 内 是说的 是否去掉 null列。。。
即外连接 不去掉空列。。。内连接去掉空列。。。
下面是 copy 的例子:
例子:
a表 id name b表 id job parent_id
1 张3 1 23 1
2 李四 2 34 2
3 王武 3 34 4
a.id同parent_id 存在
关系
内连接
select a.*,b.* from a inner join b on a.id=b.parent_id
结果是
1 张3 1 23 1
2 李四 2 34 2
左连接
select a.*,b.* from a left join b on a.id=b.parent_id
结果是
1 张3 1 23 1
2 李四 2 34 2
3 王武 null
右连接
select a.*,b.* from a right join b on a.id=b.parent_id
结果是
1 张3 1 23 1
2 李四 2 34 2
null 3 34 4
完全连接
select a.*,b.* from a full join b on a.id=b.parent_id
结果是
1 张3 1 23 1
2 李四 2 34 2
null 3 34 4
3 王武 null