MySql连接——内连接、外连接(左连接、右连接、全连接)

本文详细介绍了SQL中内联接、外联接的概念及其用法,并通过示例展示了如何进行多表连接。此外,文章还强调了ON与WHERE子句在连接操作中的区别与应用。
1. 内联接
    使用比较运算符根据每个表共有的列的值匹配两个表中的行
2. 外联接
    1)左联接 left join /left outer join
        右表无匹配的时候,行为null,左表的行保留
    2)右联接 right join /right outer join
        左表无匹配的时候,行为null,右表的行保留
    3) 全联接 full join
         左表行、右表的行全保留
  3. 示例
    -------------------------------------------------
  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   存在关系   
--------------------------------------------------    
 1) 内连接   
  select   a.*,b.*   from   a   inner   join   b     on   a.id=b.parent_id       
  结果是     
  1   张3                   1     23     1   
  2   李四                  2     34     2   

  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   

 3) 右连接   
  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   

 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
 
4. 推荐:ON只进行连接操作,WHERE只过滤中间表的记录
 
    SELECT T1.C1,T2.CX,T3.CY
    FROM TAB1 T1
           INNER JOIN TAB2 T2 ON (T1.C1=T2.C2)
           INNER JOIN TAB3 T3 ON (T1.C1=T2.C3)
           LEFT OUTER JOIN TAB4 ON(T2.C2=T3.C3);
    WHERE T1.X >T3.Y;
    上面这个SQL查询是多表连接的一个示范。
### MySQL 中不同类型 JOIN 的解释及用法 #### 左连接 (LEFT JOIN)外连接返回左表中的所有行,即使在表中没有匹配的行也会返回。对于表中没有匹配的行,结果集中会显示 `NULL`[^2]。 ```sql SELECT * FROM table1 LEFT JOIN table2 ON table1.id = table2.foreign_id; ``` 此语句将返回 `table1` 中的所有记录以及与之匹配的 `table2` 记录;如果没有找到匹配项,则对应列填充为 `NULL`[^4]。 #### 连接 (RIGHT JOIN) 外连接查询以侧表格作为基准表,即表的信息全部展示出来,而左侧表格只会展现出符合条件的数据部分,不满足条件的位置将以 `NULL` 补充[^1]。 ```sql SELECT * FROM table1 RIGHT JOIN table2 ON table1.id = table2.foreign_id; ``` 这段代码表示获取 `table2` 中所有的数据,并尝试关联来自 `table1` 的相应条目;如果找不到对应的链接,则相关字段设置为空值。 #### 内连接 (INNER JOIN) 内连接保留两个表之间存在交集的部分——也就是说只有那些能在两边都找到共同键值组合才会被选入最终的结果集合里[^5]。 ```sql SELECT * FROM table1 INNER JOIN table2 ON table1.id = table2.foreign_id; ``` 上述命令用于提取两表间有相同关键字的那一部分内容,其他任何一方独有的项目都不会出现在输出列表之中。 #### 全外连接 (FULL OUTER JOIN) 理论上来说,全外连接应该把左两侧的所有记录都纳入考虑范围之内,无论是否存在对方相配对的情况。然而值得注意的是,在标准SQL之外的具体实现上并非所有数据库管理系统都支持这一特性,MySQL 就是其中之一它并不直接提供 FULL OUTER JOIN 功能。 为了模拟全外连接的效果可以在某些情况下采用 UNION ALL 来合成: ```sql (SELECT * FROM table1 LEFT JOIN table2 ON table1.id = table2.foreign_id) UNION ALL (SELECT * FROM table1 RIGHT JOIN table2 ON table1.id = table2.foreign_id); ``` 这种方法可以有效地覆盖到两张表各自独立存在的元素加上它们之间的交叉区域。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值