数据库 各种join总结

最近学习了数据库的各种join,在这里总结下。


先准备两个表,我的表是这样的:

TableA:

id name      
-- ----       
1  Pirate    
2  Monkey     
3  Ninja      
4  Spaghetti  
 
TableB:
id  name
-- ----
1   Rutabaga
2   Pirate
3   Darth Vader
4   Ninja

 
总共有inner,full,left,right,cross这几种join,下面就一种一种的写。
1. inner
语句:

SELECT * FROM TableA INNER JOIN TableB ON TableA.name = TableB.name

结果:

+------+--------+------+--------+

| id   | name   | id   | name   |

+------+--------+------+--------+

|    1 | Pirate |    2 | Pirate |

|    3 | Ninja  |    4 | Ninja  |

+------+--------+------+--------+

图示:

Venn diagram of SQL inner join就是两表的交集部分。

2. left

语句:

SELECT * FROM TableA LEFT OUTER JOIN TableB ON TableA.name = TableB.name

结果:

+------+-----------+------+--------+

| id   | name      | id   | name   |

+------+-----------+------+--------+

|    1 | Pirate    |    2 | Pirate |

|    2 | Monkey    | NULL | NULL   |

|    3 | Ninja     |    4 | Ninja  |

|    4 | Spaghetti | NULL | NULL   |

+------+-----------+------+--------+

图示:

Venn diagram of SQL left join表A的全部和表B中与A匹配部分,空出的地方用NULL补上。

3. right

这个和left差不多,就是表A的全部和表B中与A匹配部分,空出的地方用NULL补上,不累述了。

4. full

语句:

SELECT * FROM TableA FULL OUTER JOIN TableB ON TableA.name = TableB.name
但是这样的语句在mysql中不行,会报错,因为mysql压根不支持。
在mysql中可以通过 LEFT JOIN  +   UNION  +  RIGHT JOIN 的方式 来实现。这样写:
SELECT * FROM tableA LEFT JOIN tableB ON TableA.name=TableB.name UNION SELECT * FROM TableA RIGHT JOIN TableB ON tableA.name=tableB.name

结果:

+------+-----------+------+-------------+

| id   | name      | id   | name        |

+------+-----------+------+-------------+

|    1 | Pirate    |    2 | Pirate      |

|    2 | Monkey    | NULL | NULL        |

|    3 | Ninja     |    4 | Ninja       |

|    4 | Spaghetti | NULL | NULL        |

| NULL | NULL      |    1 | Rutabaga    |

| NULL | NULL      |    3 | Darth Vader |

+------+-----------+------+-------------+

图示:

Venn diagram of SQL cartesian join就是两表合集。空出的部分用NULL补上。

5. cross

语句:

SELECT * FROM TableA CROSS JOIN TableB

结果:

+------+-----------+------+-------------+

| id   | name      | id   | name        |

+------+-----------+------+-------------+

|    1 | Pirate    |    1 | Rutabaga    |

|    2 | Monkey    |    1 | Rutabaga    |

|    3 | Ninja     |    1 | Rutabaga    |

|    4 | Spaghetti |    1 | Rutabaga    |

|    1 | Pirate    |    2 | Pirate      |

|    2 | Monkey    |    2 | Pirate      |

|    3 | Ninja     |    2 | Pirate      |

|    4 | Spaghetti |    2 | Pirate      |

|    1 | Pirate    |    3 | Darth Vader |

|    2 | Monkey    |    3 | Darth Vader |

|    3 | Ninja     |    3 | Darth Vader |

|    4 | Spaghetti |    3 | Darth Vader |

|    1 | Pirate    |    4 | Ninja       |

|    2 | Monkey    |    4 | Ninja       |

|    3 | Ninja     |    4 | Ninja       |

|    4 | Spaghetti |    4 | Ninja       |

+------+-----------+------+-------------+

这个不知道怎么图示了,结果是乘积关系,表B中的每一个和表A的全部组合一次,数量是两者数据之积。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值