去皮卡多 发表于 2024-6-14 21:53:09

MySQL - 左毗连、右毗连、内毗连、完全外毗连、交叉毗连 & 一对多、多对一

前言

做服务端接口开辟时,经常对数据库举行查询利用,相识并掌握数据库的左毗连、右毗连、内毗连、完全外毗连、交叉毗连,一对多、多对一、多对多,团结毗连等概念和使用就很紧张了。
首先给出两个数据表,分别为门生表和课程表,假设一个门生只能选一门课程。
表1:Student
-------------
| ID | Name |
-------------
| 1| 阿猫 |
| 2| 阿狗 |
| 3| 阿猪 |
-------------

表2:Course
-------------
| ID | Cname|
-------------
| 1| 篮球 |
| 2| 足球 |
| 4| 排球 |
------------- 一、外毗连(左外毗连、右外毗连、完全外毗连)

 1.左外毗连,简称左毗连

语法:left join 或 left outer join
语句:
select *
from student
left join course on student.ID=course.ID 特点:取两表交集且并保存左表
效果:
--------------------------
| ID | Name | ID | Cname |
--------------------------
| 1| 阿猫 | 1| 篮球 |
| 2| 阿狗 | 2| 足球 |
| 3| 阿猪 |NULL| NULL |
--------------------------   2.右外毗连,简称右毗连

语法:right join 或 right outer join
语句:
select *
from student
right join course on student.ID=course.ID 特点:取两表交集且并保存右表
效果:
--------------------------
| ID | Name | ID | Cname |
--------------------------
| 1| 阿猫 | 1| 篮球 |
| 2| 阿狗 | 2| 足球 |
|NULL| NULL | 4| 排球 |
--------------------------  3.完全外毗连,简称全毗连

语法:full join 或 full outer join
语句:
select *
from student
full join course on student.ID=course.ID 特点:包含左右两表中全部的行
效果:
--------------------------
| ID | Name | ID | Cname |
--------------------------
| 1| 阿猫 | 1| 篮球 |
| 2| 阿狗 | 2| 足球 |
| 3| 阿猪 |NULL| NULL |
|NULL| NULL | 4| 排球 |
-------------------------- 二、内毗连

 1.内毗连

语法:join 或 inner join
语句:
select *
from student
inner join course on student.ID=course.ID 特点:表现两张表全部记录一一对应,没有对应上的将会被过滤
效果:
--------------------------
| ID | Name | ID | Cname |
--------------------------
| 1| 阿猫 | 1| 篮球 |
| 2| 阿狗 | 2| 足球 |
-------------------------- 三、交叉毗连

 1.交叉毗连

语法:cross join
语句:
select *
from student
cross join course 特点:对两个或者多个表举行笛卡儿积利用
效果:
--------------------------
| ID | Name | ID | Cname |
--------------------------
| 1| 阿猫 | 1| 篮球 |
| 2| 阿狗 | 1| 篮球 |
| 3| 阿猪 | 1| 篮球 |
| 1| 阿猫 | 2| 足球 |
| 2| 阿狗 | 2| 足球 |
| 3| 阿猪 | 2| 足球 |
| 1| 阿猫 | 4| 排球 |
| 2| 阿狗 | 4| 排球 |
| 3| 阿猪 | 4| 排球 |
-------------------------- 本领:假如我们在此时给这条语句加上`where`子句的时间,比如【select *
from student
cross join course where student.ID = course.ID】,效果和inner join所示实行效果一样
四、团结毗连

 1.团结毗连

语法:union 或 union all
语句:
select ... from table1
union
select ... from table2
特点:两个或多个的表,雷同字段合并起来
五、一对多、多对一、多对多

疑问:当然上面两表为一对一关系,那么假如表A和表B为一对多、多对一或多对多的时间,我们又该怎样写毗连SQL语句呢?
解答:其实两表一对多的SQL语句和一对一的SQL语句的写法都差不多,只是查询的效果不一样,当然两表也要略有改动。
---------------------
|      student      |
---------------------
| Sno | Name | Cno |
---------------------

-------------------
|   classes   |
-------------------
|Cno|CName| 1.一对多

场景:一个班级可以有多个门生
语句:
select * from classes where Cno = 1; 效果: 查询班级为一班的全部门生
2.多对一

场景:多个门生属于某个班级
语句:
select c.CName
FROM classes as c
JOIN student as s ON s.Cno = c.Cno
WHERE s.Name in ('小明', '小花', '小白', '小红'); 效果: 查询这几个门生所在的班级的名称
3.多对多

场景:一个门生可以选择多门课程,一门课程可以被多个门生选择,因此门生表student和课程表course之间是多对多的关系
本领:当两表为多对多关系的时间,我们需要创建一个中间表student_course,中间表至少要有两表的主键,当然还可以有别的内容
---------------
|   student   |
---------------
| Sno | Name |
---------------

----------------
|    course    |
----------------
| Cno | Cname |
----------------

--------------
|   SC   |
--------------
| Sno | Cno |
-------------- 语句:
select
        s.Name, c.Cname
from student_course as sc
left join student as s on s.Sno = sc.Sno
left join course as c on c.Cno = sc.Cno 效果: 查询每个门生的姓名,以及所在的班级的名称
六、说明

(1)在MySQL数据库中,left join、right join、full join、inner join的实行速度是怎样的?
答:left join、right join、full join、inner join的实行速度取决于多个因素,包罗表的大小、索引的使用情况、查询条件等等。一般来说,inner join的实行速度最快,由于它只返回两个表中匹配的行,而不返回任何不匹配的行。left join和right join的实行速度通常比inner join慢一些,由于它们需要返回匹配和不匹配的行。full join的实行速度通常是最慢的,由于它需要返回两个表中全部的行。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: MySQL - 左毗连、右毗连、内毗连、完全外毗连、交叉毗连 & 一对多、多对一