文章

sql中的连接

一些关于sql语句的连接的小知识

为什么要用连接

查询例子

下面我举个例子

有这样两张表

student

idnameclass_id
1mian1
2mki

class

idname
1cs
2

如果我们需要查询每个学生选的课,按照传统的方法我们可以

select student.name,class.name
from student,class
where student.class_id = class.id

但是如果熟悉sql原理的同学就会知道这样的 from student,class 这样的语句本质上是求
$$
student \times class
$$
(笛卡尔积)

生成了这样一张表

idnameclass_ididname
1mian11cs
1mian12
2mki 1cs
2mki 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

结果

idnameclass_ididname
1mian11cs

左连接

定义

左表的所有元组加上匹配的右表元组

用法

from sdudent
left join class
on student.class_id = class.id

结果

idnameclass_ididname
1mian11cs
2mki

右连接

定义

右表的所有元组加上匹配的左表元组

用法

from sdudent
right join class
on student.class_id = class.id

结果

idnameclass_ididname
1mian11cs
2

全连接

定义

所有左右表的元组相互匹配

用法

from sdudent
full join class
on student.class_id = class.id

结果

idnameclass_ididname
1mian11cs
2mki
2

后话

Typora 真香

Latex 真香

License:  CC BY 4.0