学到老,活到老~
数据库-左连接、右连接、全连接、内连接、交叉连接、自连接
上一篇 /
下一篇 2015-08-11 17:21:35
/ 个人分类:数据库
补充:
笛卡尔乘积:假设集合A={a, b},集合B={0, 1, 2},则两个集合的笛卡尔积为{(a, 0), (a, 1), (a,
2), (b, 0), (b, 1), (b, 2)}。
左右连接其实就是以哪个表为主(或者说为准),结果集为“主表”的全部记录+“副表”与“主表”相匹配的记录,如果“副表”中没有和“主表”相匹配的记录,则相对应的记录显示为NULL
左连接:左边表全部行+右边表相匹配的行,如果左边表中的某一行,在右边表中没有匹配的行,则显示NULL(left
join或者left
outer join)
右连接:和左连接相反。(right join或者right
outer join)
内连接:它返回字段ID(连接条件)同时存在于两个表中的记录,也就是说,仅当至少有一个同属于两表的行符合联接条件时,内联接才返回行,内联接消除与另一个表中的任何行不匹配的行。(inner join或者join)
全连接:不管匹配不匹配,全部都显示出来。(full join或者full
outer join)
交叉连接:没有WHERE子句的交叉联接将产生联接所涉及的表的笛卡尔积。第一个表的行数乘以第二个表的行数等于笛卡尔积结果集的大小。(cross join不带where)
自连接:给自己取个别名,一个表当两个表来使用。
-------------------------------------
例子:
Table mm:SELECT *
FROM mm;
bid bdate
1 n1
2 n2
3 n3
Talbe nn:SELECT *
FROM nn;
bid bdate
1 n1
2 n2
4 n4
内连接:
SELECT * FROM mm
INNER JOIN nnONmm.`aid` = nn.`bid` --on换where也可
执行结果:
aid adate bid bdate
1 m1 1 n1
2 m2 2 n2
左连接:
SELECT * FROM mm
LEFT JOIN nn ON mm.`aid` = nn.`bid`
执行结果:
aid adate bid bdate
1 m1 1 n1
2 m2 2 n2
3 m3 \N \N
右连接:
SELECT * FROM mm
RIGHT JOIN nn ON mm.`aid` = nn.`bid`
执行结果:
aid adate bid bdate
1 m1 1 n1
2 m2 2 n2
\N \N 4 n4
全连接:不管匹配不匹配,全部显示出来
SELECT * FROM mm
FULL JOIN nn
执行结果:
aid adate bid bdate
1 m1 1 n1
2 m2 1 n1
3 m3 1 n1
1 m1 2 n2
2 m2 2 n2
3 m3 2 n2
1 m1 4 n4
2 m2 4 n4
3 m3 4 n4
交叉连接:如果没有on子句,就是全连接(笛卡尔积),与全连接的不同就是全连接不能够有on之类的子句
SELECT * FROM mm
CROSS JOIN nn ON mm.`aid` = nn.`bid`
执行结果:
aid adate bid bdate
1 m1 1 n1
2 m2 2 n2
SELECT * FROM mm
CROSS JOIN nn
aid adate bid bdate
1 m1 1 n1
2 m2 1 n1
3 m3 1 n1
1 m1 2 n2
2 m2 2 n2
3 m3 2 n2
1 m1 4 n4
2 m2 4 n4
3 m3 4 n4
收藏
举报
TAG:
数据库
左连接