今天写程序,碰到了关于数据库的连接问题。所以决定,争取搞定它。。。
查了查网上高手的解释。。。然后结合自己的运行结果。。。貌似自己有点开悟了。。。
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