MySQLSQL关联查询#inner join 、left join、 right join、full join、Cartesian product区别?一个案例轻松搞定

  连接查询:多张表结合在一起获取有效数据的方式叫做联合查询。
  MySQL的关联(联合)查询常见的有内连接和外连接:
  内连接:两张表连接查询,只获取两张表中完全匹配的记录!
  外连接:两张白哦连接查询,将其中一种表的数据全部显示出来,那么两张表会有数据无法与其完全匹配的数据,用null填充!
  内连接分为等值连接、非等值连接、自连接;
  外连接分为左(外)连接、右(外)连接、全(外)连接<用union代替>。

笔记大纲
  • SQL关联查询类别图
  • 关联查询需要注意什么?
  • SQL练习(左外连接、右外连接、全外连接)

1.SQL关联查询类别图

在这里插入图片描述

类似数学中的集合关系,说明如下:
  ①A∩B:最中间的组合图形【inner join】

  ②A:最左边第一个组合图形【left join】

  ③A - A∩B:最左边第二个组合图形【left join】

  ④B:最右边第一个组合图形【right join】

  ⑤B - A∩B:最右边第二个组合图形【right join】

  ⑥A ∪ B:正下方右边组合图形【full outer join】—>【union】

  ⑦A ∪B- A∩B :或者 (A - A∩B) ∪ (B - A∩B)正下方右边组合图形 【full outer join】—>【union】

2.关联查询需要注意什么?

  ①关联查询需要两张或两张以上的表

  ②在关联查询的时候必须写关联条件,如不写或少写,都会出现笛卡尔积(即全排列情况)

  关联条件的个数=关联查询的表的数量-1
##### 3.案例演示

①teacher_info(教师信息表)

mysql> use coding0110lin_stu;
Database changed
mysql> select * from teacher_info;

+------+--------+------+------------+------------+---------+
| tid  | tname  | tsex | tbirthday  | thiredate  | tsalary |
+------+--------+------+------------+------------+---------+
| 1001 | 林老师      || 1998-06-06 | 2014-05-26 |   18000 |
| 1002 | 刘老师      || 2000-08-25 | 2018-06-28 |   12000 |
| 1003 | 李老师      || 1982-08-21 | 2016-09-10 |    9800 |
+------+--------+------+------------+------------+---------+
3 rows in set (0.00 sec)

②新建teacher_course(教师授课表)

mysql> select * from teacher_course;

+------+----------+---------+
| sid  | csubject | scredit |
+------+----------+---------+
| 1001 | Java编程     |      50 |
| 1002 | 数据库        |      42 |
| 1005 | 软件工程         |      60 |
| 1006 | c语言        |      88 |
+------+----------+---------+
4 rows in set (0.00 sec)

(1)内连接(A∩B)

方式一:select 字段列表 from A,B where 关联条件 and 其它判断条件;
☛ SELECT * FROM teacher_info i,teacher_course c WHERE t.sid=c.sid;

mysql> SELECT * FROM teacher_info i,teacher_course c WHERE i.tid =c.sid;
+------+--------+------+------------+------------+---------+------+----------+---------+
| tid  | tname  | tsex | tbirthday  | thiredate  | tsalary | sid  | csubject | scredit |
+------+--------+------+------------+------------+---------+------+----------+---------+
| 1001 | 林老师      || 1998-06-06 | 2014-05-26 |   18000 | 1001 | Java编程     |      50 |
| 1002 | 刘老师      || 2000-08-25 | 2018-06-28 |   12000 | 1002 | 数据库        |      42 |
+------+--------+------+------------+------------+---------+------+----------+---------+
2 rows in set (0.00 sec)

方式二:select 字段列表 from A inner join B on 关联条件 where 其它判断条件;
SELECT * FROM teacher_info i INNER JOIN teacher_course c ON i.tid=c.sid;

mysql> SELECT * FROM teacher_info i  INNER JOIN teacher_course c ON i.`tid`=c.`sid`;
+------+--------+------+------------+------------+---------+------+----------+---------+
| tid  | tname  | tsex | tbirthday  | thiredate  | tsalary | sid  | csubject | scredit |
+------+--------+------+------------+------------+---------+------+----------+---------+
| 1001 | 林老师      || 1998-06-06 | 2014-05-26 |   18000 | 1001 | Java编程     |      50 |
| 1002 | 刘老师      || 2000-08-25 | 2018-06-28 |   12000 | 1002 | 数据库        |      42 |
+------+--------+------+------------+------------+---------+------+----------+---------+
2 rows in set (0.00 sec)

(2)左外连接(A | A - A∩B)

mysql> SELECT * FROM teacher_info i LEFT JOIN teacher_course c ON i.tid=c.sid;

mysql> SELECT * FROM teacher_info i  LEFT JOIN teacher_course c ON i.`tid`=c.`sid`;
+------+--------+------+------------+------------+---------+------+----------+---------+
| tid  | tname  | tsex | tbirthday  | thiredate  | tsalary | sid  | csubject | scredit |
+------+--------+------+------------+------------+---------+------+----------+---------+
| 1001 | 林老师      || 1998-06-06 | 2014-05-26 |   18000 | 1001 | Java编程     |      50 |
| 1002 | 刘老师      || 2000-08-25 | 2018-06-28 |   12000 | 1002 | 数据库        |      42 |
| 1003 | 李老师      || 1982-08-21 | 2016-09-10 |    9800  | NULL      | NULL     |    NULL |
+------+--------+------+------------+------------+---------+------+----------+---------+
3 rows in set (0.00 sec)

(3)右外连接(B | B - A∩B)

SELECT * FROM teacher_info i RIGHT JOIN teacher_course c ON i.tid =c.sid;

`mysql> SELECT * FROM teacher_info i RIGHT  JOIN teacher_course c ON i.tid =c.sid;
+------+--------+------+------------+------------+---------+------+----------+---------+
| tid  | tname  | tsex | tbirthday  | thiredate  | tsalary | sid  | csubject | scredit |
+------+--------+------+------------+------------+---------+------+----------+---------+
| 1001 | 林老师      || 1998-06-06 | 2014-05-26 |   18000 | 1001 | Java编程     |      50 |
| 1002 | 刘老师      || 2000-08-25 | 2018-06-28 |   12000 | 1002 | 数据库        |      42 |
| NULL | NULL        | NULL   | NULL       | NULL       |    NUL | 1005 | 软件工程       |      60 |
| NULL | NULL        | NULL   | NULL       | NULL       |    NULL | 1006 | c语言        |      88 |
+------+--------+------+------------+------------+---------+------+----------+---------+
4 rows in set (0.00 sec)

全外连接

SELECT * FROM teacher_info i LEFT JOIN teacher_course c ON i.tid=c.sid
UNION
SELECT * FROM teacher_info i RIGHT JOIN teacher_course c ON i.tid=c.sid;

+------+--------+------+------------+------------+---------+------+----------+---------+
| tid  | tname  | tsex | tbirthday  | thiredate  | tsalary | sid  | csubject | scredit |
+------+--------+------+------------+------------+---------+------+----------+---------+
| 1001 | 林老师      || 1998-06-06 | 2014-05-26 |   18000 | 1001 | Java编程     |      50 |
| 1002 | 刘老师      || 2000-08-25 | 2018-06-28 |   12000 | 1002 | 数据库        |      42 |
| 1003 | 李老师       || 1982-08-21 | 2016-09-10 |    9800 | NULL      | NULL     |    NULL |
| NULL | NULL         | NULL | NULL       | NULL       |    NULL | 1005 | 软件工程       |      60  |
| NULL | NULL         | NULL | NULL       | NULL       |    NULL | 1006 | c语言        |      88 |
+------+--------+------+------------+------------+---------+------+----------+---------+
5 rows in set (0.00 sec)

笛卡尔积(应该避免这种情况)

SELECT * FROM teacher_info ,teacher_course ;

mysql> SELECT * FROM teacher_info ,teacher_course ;
+------+--------+------+------------+------------+---------+------+----------+---------+
| tid  | tname  | tsex | tbirthday  | thiredate  | tsalary | sid  | csubject | scredit |
+------+--------+------+------------+------------+---------+------+----------+---------+
| 1001 | 林老师      || 1998-06-06 | 2014-05-26 |   18000 | 1001 | Java编程     |      50 |
| 1002 | 刘老师      || 2000-08-25 | 2018-06-28 |   12000 | 1001 | Java编程     |      50 |
| 1003 | 李老师      || 1982-08-21 | 2016-09-10 |    9800 | 1001 | Java编程     |      50 |
| 1001 | 林老师      || 1998-06-06 | 2014-05-26 |   18000 | 1002 | 数据库        |      42 |
| 1002 | 刘老师      || 2000-08-25 | 2018-06-28 |   12000 | 1002 | 数据库        |      42 |
| 1003 | 李老师      || 1982-08-21 | 2016-09-10 |    9800 | 1002 | 数据库        |      42 |
| 1001 | 林老师      || 1998-06-06 | 2014-05-26 |   18000 | 1005 | 软件工程         |      60 |
| 1002 | 刘老师      || 2000-08-25 | 2018-06-28 |   12000 | 1005 | 软件工程         |      60 |
| 1003 | 李老师      || 1982-08-21 | 2016-09-10 |    9800 | 1005 | 软件工程         |      60 |
| 1001 | 林老师      || 1998-06-06 | 2014-05-26 |   18000 | 1006 | c语言        |      88 |
| 1002 | 刘老师      || 2000-08-25 | 2018-06-28 |   12000 | 1006 | c语言        |      88 |
| 1003 | 李老师      || 1982-08-21 | 2016-09-10 |    9800 | 1006 | c语言        |      88 |
+------+--------+------+------------+------------+---------+------+----------+---------+
12 rows in set (0.00 sec)

小结

内连接是两张表同时满足条件的数据才会显示结果数据
左连接:查询数据时,左表的数据不会受影响,全部显示,右表满足条件才会显示数据
右连接:查询数据时,右表的数据不会受影响,全部显示,左表满足条件才会显示数据
笛卡尔积:如果没有关联条件,就会出现这种情况

注意:自连接是特殊的关联查询,一张表通过虚拟的方式当成两张表,并且进行联合查询。自连接可以是内连接、左外连接、右外连接。

#轻松一刻:

在这里插入图片描述


☝上述分享来源个人总结,如果分享对您有帮忙,希望您积极转载;如果您有不同的见解,希望您积极留言,让我们一起探讨,您的鼓励将是我前进道路上一份助力,非常感谢!我会不定时更新相关技术动态,同时我也会不断完善自己,提升技术,希望与君同成长同进步!

☞本人博客:https://coding0110lin.blog.csdn.net/  欢迎转载,一起技术交流吧!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值