mysql开发之join语句学习

内连接:inner
join --
全外链接:full outer
左外连接:left outer
右外连接:right outer
交叉连接:cross
内连接,两个表中重复部分
全外连接,两个表所有字段
左外连接,显示左表所有字段和左右表重复字段
右外连接,显示右表所有字段和左右表重复字段
交叉连接,左表每个记录乘以右表每个记录,如果左表4个记录,右表3个记录,3*4=12个记录
如果表中没有数据,显示为Null

内连接(inner join) 可以选取A表和B表的交集  select 字段 from A表 a表别名 inner join B表 b表别名 on a.字段=b.字段;

LEFT OUTER JOIN:包含左表中的所有数据,当某个连接谓词不在右表中时,新生成的表的右表字段为NULL。对左表数据的信息进行扩展,增加右表中的字段,当某个连接谓词不在右表中时,新生成的表的右表字段为NULL。

使用LEFT OUTER JOIN对NOT IN 进行优化。
SELECT select_sxpressions
FROM TABLE A LEFT OUTER JOIN TABLE B ON A.key=B.key
WHERE B.key IS NULL;
表A中不包含表B中的数据。
SELECT select_sxpressions
FROM TABLE A LEFT OUTER JOIN TABLE B ON A.key=B.key
WHERE B.key IS NOT NULL;
表A与表B的交集,相当于INNER JOIN。

RIGHT OUTER JOIN:包含右表中的所有数据,当某个连接谓词不在左表中时,新生成的表的左表字段为NULL。对右表数据的信息进行扩展,增加左表中的字段,当某个连接谓词不在左表中时,新生成的表的左表字段为NULL。

使用RIGHT OUTER JOIN对NOT IN 进行优化。
SELECT select_sxpressions
FROM TABLE A RIGHT OUTER JOIN TABLE B ON A.key=B.key
WHERE A.key IS NULL;
表B中不包含表A中的数据。
SELECT select_sxpressions
FROM TABLE A RIGHT OUTER JOIN TABLE B ON A.key=B.key
WHERE A.key IS NOT NULL;
表A与表B的交集,相当于INNER JOIN。

FULL JOIN:是LEFT OUTER JOIN和RIGHT OUTER JOIN的合集。显示出两张表中的所有数据,当一张表的连接谓词无法满足时,则另一张表的字段在该表中为NULL。

MySQL不支持FULL JOIN
解决方法:
通过UNION将左连接和右连接的结果合并
SELECT select_expressions
FROM TABLE A LEFT OUTER JOIN TABLE B ON A.key=B.key
UNION ALL
SELECT select_expressions
FROM TABLE A RIGHT OUTER JOIN TABLE B ON A.key=B.key;

UNION会自动删除重复项,刷选出部分字段的时候要注意了,如果刷选出来的两个字段的值完全相同就会剩下一个。
UNION ALL 和 UNION 不同之处在于 UNION ALL 会将左右两个查询的结果的所有的资料都列出来,无论资料值有无重复。

 

CROSS JOIN:笛卡尔连接,如果A和B是两个集合,它们的交叉连接就记为A X B。一个表的每个记录与另一个表的所有记录进行连接,形成A.length*B.length个数据项的表。(无需提供ON)

SELECT select_expressions
FROM TABLE A CROSS JOIN TABLE B;

join优化子查询技巧:
一般子查询写法:(数据小时,没有多大影响,如果数据量大时,则要消耗大量的查询)
select a.user_name , a.over , (select over from user2 where a.user_name = b,user_name) as over2
from user1 a;
如果这两张表的记录相当多 那么这个子查询相当于对A标的每一条记录都要进行一次子查询。

join优化(左连接)后的写法:
select a.user_name , a.over , b.over from user1 a
left join user2 b on a.user_name = b.user_name

 





posted @ 2017-06-11 14:14  菲菲菲菲菲常新的新手  阅读(310)  评论(0编辑  收藏  举报