mysql 左连接_MySQL左连接与右连接

前几次面试的时候遇到左右连接的问题,这里进行回顾。

先通过下面两个表展示一下左连接和右连接的结果

左连接与右连接

员工表:

  1. mysql> select * from employ;
  2. +-----------+------+------+
  3. | name | id | sal |
  4. +-----------+------+------+
  5. | 小王 | 1000 | 0 |
  6. | 小李 | 1001 | 90 |
  7. | 小华 | 1002 | NULL |
  8. | xiaogui | 1008 | 3800 |
  9. | xiaolang | 1009 | 3900 |
  10. | xiaohu | 1003 | 4000 |
  11. +-----------+------+------+
  12. 6 rows in set (0.00 sec)

学生表:

  1. mysql> select * from student;
  2. +--------+------+------+
  3. | name | age | id |
  4. +--------+------+------+
  5. | 懒洋洋 | 10 | 1001 |
  6. | 喜羊羊 | 100 | 1002 |
  7. | 美羊羊 | 12 | NULL |
  8. | 灰太狼 | NULL | 1004 |
  9. +--------+------+------+
  10. 4 rows in set (0.00 sec)

左连接

  1. mysql> select employ.sal,student.age from employ left join student on employ.id
  2. = student.id;
  3. +------+------+
  4. | sal | age |
  5. +------+------+
  6. | 0 | NULL |
  7. | 90 | 10 |
  8. | NULL | 100 |
  9. | 3800 | NULL |
  10. | 3900 | NULL |
  11. | 4000 | NULL |
  12. +------+------+
  13. 6 rows in set (0.00 sec)

右连接

  1. mysql> select employ.sal,student.age from employ right join student on employ.id
  2. = student.id;
  3. +------+------+
  4. | sal | age |
  5. +------+------+
  6. | 90 | 10 |
  7. | NULL | 100 |
  8. | NULL | 12 |
  9. | NULL | NULL |
  10. +------+------+
  11. 4 rows in set (0.00 sec)

通过以上两个表我们总结如下:

左连接:以左边的表(employ)为主。显示左边表列的全部数据,如果右边表没有对应的数据,则为NULL

右连接:以右边的表(student)为主。显示右边表列的全部数据,如果左边表没有对应的数据,则为NULL

笛卡儿积

两个表的信息:

员工表:

  1. mysql> select * from employ;
  2. +-----------+------+------+
  3. | name | id | sal |
  4. +-----------+------+------+
  5. | 小王 | 1000 | 0 |
  6. | 小李 | 1001 | 90 |
  7. | 小华 | 1002 | NULL |
  8. | xiaogui | 1008 | 3800 |
  9. | xiaolang | 1009 | 3900 |
  10. | xiaohu | 1003 | 4000 |
  11. +-----------+------+------+
  12. 6 rows in set (0.00 sec)

学生表:

  1. mysql> select * from student;
  2. +--------+------+------+
  3. | name | age | id |
  4. +--------+------+------+
  5. | 懒洋洋 | 10 | 1001 |
  6. | 喜羊羊 | 100 | 1002 |
  7. | 美羊羊 | 12 | NULL |
  8. | 灰太狼 | NULL | 1004 |
  9. +--------+------+------+
  10. 4 rows in set (0.00 sec)

笛卡儿积的情况:

  1. mysql> select * from employ, student;
  2. +-----------+------+------+--------+------+------+
  3. | name | id | sal | name | age | id |
  4. +-----------+------+------+--------+------+------+
  5. | 小王 | 1000 | 0 | 懒洋洋 | 10 | 1001 |
  6. | 小王 | 1000 | 0 | 喜羊羊 | 100 | 1002 |
  7. | 小王 | 1000 | 0 | 美羊羊 | 12 | NULL |
  8. | 小王 | 1000 | 0 | 灰太狼 | NULL | 1004 |
  9. | 小李 | 1001 | 90 | 懒洋洋 | 10 | 1001 |
  10. | 小李 | 1001 | 90 | 喜羊羊 | 100 | 1002 |
  11. | 小李 | 1001 | 90 | 美羊羊 | 12 | NULL |
  12. | 小李 | 1001 | 90 | 灰太狼 | NULL | 1004 |
  13. | 小华 | 1002 | NULL | 懒洋洋 | 10 | 1001 |
  14. | 小华 | 1002 | NULL | 喜羊羊 | 100 | 1002 |
  15. | 小华 | 1002 | NULL | 美羊羊 | 12 | NULL |
  16. | 小华 | 1002 | NULL | 灰太狼 | NULL | 1004 |
  17. | xiaogui | 1008 | 3800 | 懒洋洋 | 10 | 1001 |
  18. | xiaogui | 1008 | 3800 | 喜羊羊 | 100 | 1002 |
  19. | xiaogui | 1008 | 3800 | 美羊羊 | 12 | NULL |
  20. | xiaogui | 1008 | 3800 | 灰太狼 | NULL | 1004 |
  21. | xiaolang | 1009 | 3900 | 懒洋洋 | 10 | 1001 |
  22. | xiaolang | 1009 | 3900 | 喜羊羊 | 100 | 1002 |
  23. | xiaolang | 1009 | 3900 | 美羊羊 | 12 | NULL |
  24. | xiaolang | 1009 | 3900 | 灰太狼 | NULL | 1004 |
  25. | xiaohu | 1003 | 4000 | 懒洋洋 | 10 | 1001 |
  26. | xiaohu | 1003 | 4000 | 喜羊羊 | 100 | 1002 |
  27. | xiaohu | 1003 | 4000 | 美羊羊 | 12 | NULL |
  28. | xiaohu | 1003 | 4000 | 灰太狼 | NULL | 1004 |
  29. +-----------+------+------+--------+------+------+
  30. 24 rows in set (0.00 sec)
  1. mysql> select count(*) from employ,student;
  2. +----------+
  3. | count(*) |
  4. +----------+
  5. | 24 |
  6. +----------+
  7. 1 row in set (0.00 sec)

总结:两个表总共14数据,但我们得到了24条数据。这是什么情况?这就是笛卡儿积所产生的问题。笛卡儿积的具体执行过程看下图:

9e855e3df4bac35e4570f371ffc82b60.png

就像图中,employ表中有6项,student中有4项,6*4=24。所以左连接,右连接解决了笛卡儿积的问题。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值