sql中的连接
一些关于sql语句的连接的小知识
为什么要用连接
查询例子
下面我举个例子
有这样两张表
student
id | name | class_id |
---|---|---|
1 | mian | 1 |
2 | mki |
class
id | name |
---|---|
1 | cs |
2 |
如果我们需要查询每个学生选的课,按照传统的方法我们可以
select student.name,class.name
from student,class
where student.class_id = class.id
但是如果熟悉sql原理的同学就会知道这样的 from student,class
这样的语句本质上是求
$$
student \times class
$$
(笛卡尔积)
生成了这样一张表
id | name | class_id | id | name |
---|---|---|---|---|
1 | mian | 1 | 1 | cs |
1 | mian | 1 | 2 | |
2 | mki | 1 | cs | |
2 | mki | 2 |
再从中选择
$$
\sigma _{student.class_id=class.id}
$$
这样子显然当student和class非常大时,查询效率太低。
连接
数学
既然笛卡尔迪行不通,我们就想到了我们的老朋友连接(join)
$$
student\Join class
$$
这样子就可以衍生出一张不比代查询的两张表大的表的。
用法
此处我们就应该用 join 这种sql语法
join跟据匹配生成元组的方式分为四种
- 内连接 inner join
- 左连接 left join
- 右连接 right join
- 全连接 full join
内连接
定义
生成的行数为左表右表全部匹配的行
用法
from sdudent
inner join class
on student.class_id = class.id
结果
id | name | class_id | id | name |
---|---|---|---|---|
1 | mian | 1 | 1 | cs |
左连接
定义
左表的所有元组加上匹配的右表元组
用法
from sdudent
left join class
on student.class_id = class.id
结果
id | name | class_id | id | name |
---|---|---|---|---|
1 | mian | 1 | 1 | cs |
2 | mki |
右连接
定义
右表的所有元组加上匹配的左表元组
用法
from sdudent
right join class
on student.class_id = class.id
结果
id | name | class_id | id | name |
---|---|---|---|---|
1 | mian | 1 | 1 | cs |
2 |
全连接
定义
所有左右表的元组相互匹配
用法
from sdudent
full join class
on student.class_id = class.id
结果
id | name | class_id | id | name |
---|---|---|---|---|
1 | mian | 1 | 1 | cs |
2 | mki | |||
2 |
后话
Typora 真香
Latex 真香
License:
CC BY 4.0