连接查询:多张表结合在一起获取有效数据的方式叫做联合查询。
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/ 欢迎转载,一起技术交流吧!