当前位置:   article > 正文

【SQL篇】MySQL的Sql join,你知道几种?_my sql join

my sql join

目录

SQL 连接(JOIN)

0.Sql 之 笛卡尔积

1.Sql 之 inner join

2.Sql 之 left join | left outer join

3.Sql 之 right join | right outer join

4.Sql 之 full join | full outer join

5.Sql 之 union and union all

6.Sql 之 natural join



SQL 连接(JOIN)

  1. INNER JOIN:如果表中有至少一个匹配,则返回行
  2. LEFT JOIN:即使右表中没有匹配,也从左表返回所有的行
  3. RIGHT JOIN:即使左表中没有匹配,也从右表返回所有的行
  4. FULL JOIN:只要其中一个表中存在匹配,则返回行

0.Sql 之 笛卡尔积

注释:INNER JOIN 与 JOIN 是相同的。

数据库表:

 

首先,我们需要先明白一个概念——笛卡尔积:

  1. 笛卡尔积是指在数学中,两个集合X和Y的笛卡尓积(Cartesian product),又称直积,表示为X × Y,第一个对象是X的成员而第二个对象是Y的所有可能有序对的其中一个成员。
  2. 例子:
  3. 假设集合A={a, b},集合B={0, 1, 2},则两个集合的笛卡尔积为
  4. {
  5. (a, 0),
  6. (a, 1),
  7. (a, 2),
  8. (b, 0),
  9. (b, 1),
  10. (b, 2)
  11. }。

现在来观察上面两个表形成的笛卡尔积:

1.Sql 之 inner join

注释:INNER JOIN 与 JOIN 是相同的。(相当于取交集)

注释:INNER JOIN 关键字在表中存在至少一个匹配时返回行。

SQL join 用于把来自两个或多个表的行结合起来。

最简单的就是内连接,inner join.

  1. -- 使用where连接
  2. SELECT
  3. p.id,
  4. p.NAME,
  5. pd.id AS _id,
  6. pd.pid,
  7. pd.price,
  8. pd.num
  9. FROM
  10. product p,
  11. product_detail pd
  12. WHERE
  13. p.id = pd.pid;

  1. -- inner join or join
  2. SELECT
  3. p.id,
  4. p.NAME,
  5. pd.id AS _id,
  6. pd.pid,
  7. pd.price,
  8. pd.num
  9. from product p
  10. INNER join product_detail pd
  11. on p.id = pd.pid;

以上两种方式查询的结果是一样的。(两个都相当于内连接)

总结:内连接inner join是将两个或两个以上的表连接起来,用on来连接,只用当on所限制的条件满足的时候,笛卡尔积组成的结果行才会返回。

如下图:(只有on后面的条件,p.id = pd.pid成立的时候)

2.Sql 之 left join | left outer join

注释:LEFT JOIN 关键字从左表(Websites)返回所有的行,即使右表(access_log)中没有匹配。

  1. -- left join or left outer join
  2. SELECT
  3. p.id,
  4. p.NAME,
  5. pd.id AS _id,
  6. pd.pid,
  7. pd.price,
  8. pd.num
  9. from product p
  10. left join product_detail pd
  11. on p.id = pd.pid;

在左连接的基础上加上过滤条件

  1. SELECT
  2. p.id,
  3. p.NAME,
  4. pd.id AS _id,
  5. pd.pid,
  6. pd.price,
  7. pd.num
  8. from product p
  9. left join product_detail pd
  10. on p.id = pd.pid and p.id = 1

使用where进行过滤的

注意:在使用 left jion 时,onwhere 条件的区别如下:

  • 1、 on 条件是在生成临时表时使用的条件,它不管 on 中的条件是否为真,都会返回左边表中的记录。

  • 2、where 条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有 left join 的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。

3.Sql 之 right join | right outer join

注释:RIGHT JOIN 关键字从右表(table2)返回所有的行,即使左表(table1)中没有匹配。如果左表中没有匹配,则结果为 NULL。

  1. select
  2. p.id,
  3. p.name,
  4. pd.id as _id,
  5. pd.pid,
  6. pd.price,
  7. pd.num
  8. from product p
  9. right join product_detail pd
  10. on p.id = pd.pid

加入过滤条件的有连接 on 后面接and进行过滤

  1. select
  2. p.id,
  3. p.name,
  4. pd.id as _id,
  5. pd.pid,
  6. pd.price,
  7. pd.num
  8. from product p
  9. right join product_detail pd
  10. on p.id = pd.pid
  11. and pd.pid = 1

  1. select
  2. p.id,
  3. p.name,
  4. pd.id as _id,
  5. pd.pid,
  6. pd.price,
  7. pd.num
  8. from product p
  9. right join product_detail pd
  10. on p.id = pd.pid
  11. -- and pd.pid = 1
  12. where pd.pid = 1

使用on过滤和where过滤跟上面的左连接是一样的。

4.Sql 之 full join | full outer join

注释:FULL OUTER JOIN 关键字返回左表(Websites)和右表(access_log)中所有的行

(使用方式如上面两种那样,但是mysql不支持全连接)

5.Sql 之 union and union all

但是可以使用union关键字来实现所谓的全连接

  1. SELECT
  2. p.id,
  3. p.NAME,
  4. pd.id AS _id,
  5. pd.pid,
  6. pd.price,
  7. pd.num
  8. FROM
  9. product as p
  10. left JOIN product_detail pd
  11. ON p.id = pd.pid
  12. UNION
  13. SELECT
  14. p.id,
  15. p.NAME,
  16. pd.id AS _id,
  17. pd.pid,
  18. pd.price,
  19. pd.num
  20. FROM
  21. product p
  22. right join product_detail pd
  23. on p.id = pd.pid;

上面是使用的是union,不显示重复行,但是如果把union换成union all 那么就会把重复行显示出来,

效果如下图:(union all)

6.Sql 之 natural join

  1. SELECT
  2. *
  3. FROM
  4. product
  5. NATURAL JOIN product_detail

注释:自然连接默认是匹配两个表列名相同的,然后不重复显示。

如下图,将数据库表设计改变:(改变第一个表的id名为pid)

结果如下:

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/538439
推荐阅读
相关标签
  

闽ICP备14008679号