zoukankan      html  css  js  c++  java
  • 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

    
    
    
    
    
    
    
    
  • 相关阅读:
    C/C++多文件之间的变量定义
    PKU POJ 2186 Popular Cows 强连通分量
    重载函数
    ZOJ 2763 Prison Break
    201357 训练赛总结
    hdu 4467 Graph 构造
    201356 训练赛总结
    201353 NEERC 2012, Eastern subregional contest
    2013512 CF 183 总结
    一道动态规划
  • 原文地址:https://www.cnblogs.com/lgh344902118/p/6985092.html
Copyright © 2011-2022 走看看