您的位置:首页 > 数据库 > MySQL

MySQL-各种连接查询

2019-04-09 10:33 183 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/ourstronger/article/details/89136946

 


MYSQL-连接查询:            
    # 连接查询:把多张表进行记录的连接(按照某个条件进行数据的拼接)
    # 分类
        1,内链接
        2,外连接
            # 左外
            # 右外
        3,自然连接
        4,交叉连接

MYSQL-内链接 :        
    # inner join (inner关键字可以省略)  [inner join比left join快]
    # 从左表中取出每一条记录,与右表中的所有记录进行匹配
    # 匹配必须是某个条件,在左表和右表中相同【公共部分】,才会保留结果.否则,不保留
    # 基本语法
        SELECT * FROM [左表] innder join [右表] on [左表].[字段]=[右表].[字段];
    # 内连接,可以没有on,那么系统会保留所有的结果,没错.又是传说中的笛卡尔积
    # '还可以使用where代替on,但是效率没有on高'

如上例子:
排他性:A,B表中至少有1个匹配时,才返回行。两表的【交集】
SQL语句如下:
select A.name,B.address from A 
inner join B
on A.id = B.A_id

查询结果为:
name     address
张     北京
王     上海

inner join  内连接等价于下面的sql:
SELECT A.name, B.address
FROM A, B
WHERE A.id = B.A_id

MYSQL-外连接:  

1,左外         
      # outer join(并没有outer这个关键字)
    【通俗:就是2张表,查左表满足条件的所有以及右表中含有左表条件的数据,where (右表条件)..is not null显示不为null的数据】
    左外连接: 包含左边表的全部行(不管右边的表中是否存在与它们匹配的行),以及右边表中全部匹配的行。
    # 以某张表为主,取出里面的所有记录.每条与另外一张表.不管能不能匹配上条件.最终都会保留.如果不能匹配,那么其他表的字段都置空
   
        # left join (left join 是left outer join的简写)
        # 基本语法
            SELECT
                ...
            FROM
                [左表]
            LEFT JOIN
                [右表]
            ON
                [条件]
        # 会把左边所有的数据都显示出来,如果右表没有匹配的数据.以null显示
        e:SELECT * from a_table a LEFT  JOIN b_table b on a.a_id = b.b_id (where b_id is not NULL);

    2,右外
    【通俗:就是2张表,查右表满足条件的所有以及左表中含有右表条件的数据,where (左表条件)..is not null显示不为null的数据】
    右外连接: 包含右边表的全部行(不管左边的表中是否存在与它们匹配的行),以及左边表中全部匹配的行
        # right join
        # 基本语法
            SELECT
                ...
            FROM
                [左表]
            RIGHT JOIN
                [右表]
            ON
                [条件]
        # 会把右表所有的数据都显示出来,如果左表没有匹配的数据.以null显示
        e:SELECT * from a_table a RIGHT JOIN b_table b on a.a_id = b.b_id (where a_id is not NULL);


MYSQL-自然连接:            
    # natural join
    # MYSQL方言,其他数据库不一定有
    # '自动的匹配连接条件',但是.不怎么建议使用.是以'字段名称作为匹配模式'
    # 基本语法
        SELECT ...FROM [表1] natural join [表2];        //内连接
            * 自动使用同名字段作为连接条件,结果中会合并该字段
        SELECT ...FROM [表1] left natural join [表2];    //左外自然连接
        SELECT ...FROM [表1] right natural join [表2];    //右外自然连接


MYSQL-交叉连接:            
    # cross join
    # 从一张表中循环取出每一条记录,每条记录都去另外一张表进行匹配.而且匹配一定保留(没有条件匹配不带条件where...)
    # 而连接本身字段就会增加(保留)    --    笛卡尔积(笛卡尔是没有意义的,【尽量要避免】)
    # 存在的价值:保证连接这种结构的完整性而已.
    # 基本语法
        SELECT * from [左表] cross join [右表];    == select * from [左表],[右表];
        select * from emp cross join dept;

        # 也可以加上条件
        select * 
            from emp e 
        cross join 
            dept d 
        on e.deptno=d.deptno ;
    【两表连接如果要避免返回笛卡尔积,必须确保至少一方表是唯一的,否则在能查到记录的情况下,不论哪一种连接方式一定会返回笛卡尔积记录集的。】

MYSQL-全外:                
    # 全外(MYSQL不支持,但是我们可以通过其他方式实现)
    # 这个就是,左右两表都是相同的,两个表的所有内容都必须全部出来,如果没有对应记录的,就用null填充

    select * from 表1 left outer join 表2 on 表1.字段=表2.字段
        union 
    select * from 表1 right outer join 表2 on 表1.字段=表2.字段;
    -联合查询 ,把他们的结果集合并一下就出来了
    
    e: SELECT * from a_table a LEFT  JOIN b_table b on a.a_id = b.b_id (where b_id is not NULL) UNION SELECT * from a_table a
LEFT  JOIN b_table b on a.a_id = b.b_id (where b_id is not NULL);

例子:https://blog.csdn.net/plg17/article/details/78758593

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: